利用DDA、中点画线和Bresenham法画直线

2023-11-09

一、 实验目的

在空白图像上绘制两个点,坐标分别为(24,26)和(140,624),并且绘制出以该点为端点的直线。要求利用DDA、中点直线及Bresenham算法进行绘制。

二、 设计方案

使用DDA、中点画线和Bresenham画线法绘制直线,将其作为函数加载运行

三、 详细代码

#画线
from PIL import Image
def DDA(x1, y1, x2, y2):#DDA画线法
    g = Image.new('RGB', (650, 650), color='white')#设置背景
    dx = x2 - x1#计算两点间的横坐标距离
    dy = y2 - y1#计算两点间纵坐标距离
    e = abs(dx) if (abs(dx) > abs(dy)) else abs(dy) #计算两个距离哪个大,用大的画小的
    dx /= e#计算每次画点时的增量
    dy /= e#同上
    x = x1#给初始点复制
    y = y1#同上
    i = 0
    while i <= e:#循环画点
        g.putpixel((int(x + 0.5), int(y + 0.5)), 0)#四舍五入
        x+=dx#x增加 dx=1
        y+=dy#y增加 dy=(dx)*(y2-y1)/(x2-x1) 其中dx=1
        i+=1
    g.show()

def middle(x1,y1,x2,y2):#中点画线法
    g=Image.new('RGB',(650,650),(255,255,255))#设置白色背景
    key=0
    if abs(x1-x2)>abs(y1-y2):#判断用x画y还是用y画x
        x1,x2,y1,y2=y1,y2,x1,x2
        key=1
    #以y画x的形式,当x距离大于y时,x,y位置互换(上一步已操作)
    #ax+by+c=0
    a=y2-y1#方程中a
    b=x1-x2#方程中b
    d=2*b+a#决策参数初始值
    delta1=2*b#初始化
    delta2=a+a+b+b
    x=x1#开始点位置
    y=y1
    g.putpixel((x,y),0)#画点
    while y<y2:#终止条件,用y画x
        #如果决策变量<0,在右上角画点,否则,在右侧画点
        if d<0:
            x+=1
            y+=1
            d+=delta2#更新决策变量
        else:
            y+=1
            d+=delta1
        if key==1:
            xg,yg=y,x
        else:
            xg,yg=x,y
        g.putpixel((xg,yg),0)
    g.show()

def Bresenham(x1,y1,x2,y2):#Bresenham画点法
    g=Image.new('RGB',(650,650),color='white')#建立空白图片
    key=0
    if abs(x1-x2)<abs(y1-y2):#判断用x画y还是用y画x
        x1,x2,y1,y2=y1,y2,x1,x2
        key=1
    #以y画x的形式,当x距离大于y时,x,y位置互换(上一步已操作)
    x=x1#起始点初始化
    y=y1#同上
    dx=x2-x1#计算起始点、终止点的距离
    dy=y2-y1#同上
    p=2*dy-dx#决策变量
    while x<=x2:#循环画点,直到画到终点
        if key==1:
            xg,yg=y,x
        g.putpixel((xg,yg),0)
        if p>=0:#如果决策变量>=0,画点在右上角
            y+=1
            p+=dy+dy-dx-dx#更新决策变量
        else:#否则,在右侧画点
            p+=dy+dy#更新决策变量
        x+=1#每次以横坐标向右移动一个单位
    g.show()
DDA(24,26,140,624)
middle(24,26,140,625)
Bresenham(24,26,140,624)

四、实验结果

在这里插入图片描述

五、实验体会:

像素是不可分割的最小画图单元,所以在绘制图像时,有时遇到需要非整数的像素,急需要近似取整数。但是如何取整是一门技术。这里的三种画线方法讲述如何近似取点,使图像还可以正常的显现出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用DDA、中点画线和Bresenham法画直线 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • openpyxl 2.4.2:保存后公式生成的单元格值为空

    我使用 openpyxl 打开文件 编辑一些单元格并保存更改 这是一个例子 import openpyxl book openpyxl load workbook sheet path sheet book active for row i
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 使用 Django 的 post_save() 信号

    我有两张桌子 class Advertisement models Model created at models DateTimeField auto now add True author email models EmailField
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 36黑马QT笔记之QString、QByteArray、char*的互相转换

    36黑马QT笔记之QString QByteArray char 的互相转换 1 直接看代码 if 0 QString gt QByteArray QString str 123 QByteArray array str toUtf8 中文
  • 游戏视频录制软件对比,哪款最适合你的需求?

    随着电子竞技和游戏直播行业的迅速崛起 越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间 游戏视频录制软件正是满足这一需求的关键工具 本文将针对三款优秀的游戏视频录制软件进行对比分析 以便为读者提供选购建议 游戏视频录制软件1 专业录屏软件
  • linux 默认网卡丢失,linux多网卡接收组播丢失问题

    工作中曾遇到一个很奇怪的问题 我奉命调查 事情是这样的 有一台双网卡的机器 上面装有Fedora8 运行一个程序 该程序分别在两个网口上都接收多播数据 程序运行是正常的 但是 后来升级系统到Fedora13 发现就出问题了 在运行几秒钟后
  • 数仓建模过程——写指标

    1 维度 描述信息 事实 度量值 比如 我早上花了5元买早餐 其中时间地点买了什么等就是描述信息就是维度 具体的金额数字就是事实 2 ods层一般就是原始数据 比如用户行为日志 导入到hdfs中是一条条日志 那么日志的ods层表结构就只有s
  • 特征筛选9——根据重要性SelectFromModel筛选特征(有监督筛选)

    策略思想 使用能够进行特征重要性评估的模型 一般带有feature importances或coef 参数 训练特征 如果结果重要性的得分小于阈值 就会被认为是不重要的特征比如小于0 1 mean 重要性 示例代码 import panda
  • Windows Server 2012 R2 -网站—安全性设置-身份验证(VMware workstation环境)

    安装身份验证组件 匿名身份验证 任何用户都可以直接匿名连接此网站 不需要身份认证 基本身份验证 要求用户输入用户名及密码 但是用户名及密码并没有加密 容易被拦截获取数据 默认域 用户连接网站时 可以使用两种方式 1 域用户账户 用户输入的用
  • JAVA 练习题(2)

    从键盘输入8个整数存放在一个数组中 然后将奇数和偶数分别存入到两个不同的数组中 并按奇数 偶数交替的顺序输出这两个数组中的所有数据 先交替输出 如果奇数个数多 则再输出剩下的奇数 如果偶数个数多 则再输出剩下的偶数 提示与要求 1 定义一个
  • 动手学区块链学习笔记(一):加密算法介绍

    引言 本文根据实验楼以及自己查询到的一些资料 文末给出 模拟了一下区块链从诞生到交易的整个过程 也算是弥补了一下之前区块链的一些缺失知识 哈希加密原理介绍 什么是比特币 比特币是一种加密货币 也是一种分布式数字货币 它的创建者使用匿名身份被
  • [VS] 诊断工具,CPU调优

    工具 vs2019 系统 win10 语言 C github 调试 demo dangwei 90 ProcessOptimize github com 本文主要通过 VS 自带的诊断工具 对程序进行CPU调优 Begin 1 编译测试 d
  • Acwing 1227. 分巧克力

    每个巧克力能切多少块是可以计算出来的 假设当前巧克力的边长是Wi Hi的话 若要切出边长是x的巧克力的话 能切的块数为 Wi x Hi x int默认下取整 对于每一块巧克力来说 切出来的数量随着边长的增加而递减的 我们要找到一个块数满足
  • 利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数

    利用遗传算法GA和粒子群算法PSO优化算法 将BP神经网络训练集的MSE作为适应度函数 获取最优的权值和阈值在反向输入到BP神经网络里构建回归预测模型 同时能够打印出模型的多个评价指标 具体效果可以看图 ID 325066919444354
  • Pycharm在导入虚拟环境变量的时候报错:Please specify a different SDK name解决方法

    发生的错误的远影是因为虚拟环境的命名有重复 是因为你重复导入同一个虚拟环境所致 解决方法 在设置的Project Interpreter中选择你所需要的虚拟环境 在下拉框中选择Show All 然后你就可以看到你的所有虚拟环境 点击 删除名
  • 初级项目——记账系统、双色球

    一 记账系统 主功能 展示收支明细 登记收入 登记支出 退出系统 package com wfl test import java util Scanner author wfl Version 1 0 date 2022 5 17 17
  • Linux网络-数据链路层,MAC帧解析,ARP协议

    目录 数据链路层VS网络层 以太网概念 以太网的帧格式 报文格式 也可以称之为MAC帧 MAC地址的概念 MAC帧格式 局域网通信原理 MTU MTU说明 MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协
  • 使窗口只第一次访问时弹出

    有时为了某种需要 要求进入一个页面时弹出一个窗口 但每次进入时都会弹出 就使人感受到烦 怎样实只弹出一次呢 下面的程序将实现浏览才第一次访问这页时弹出窗口 以后再进入则不会弹出 在 之间加入下列代码
  • ILRuntime来实现热更新的优与劣!

    热更新 Q1 使用ILRuntime来实现热更新的可行度有多高 大家有没有使用经验分享 一般热更新分两块 代码 资源 资源热更几乎都是通过AssetBundle来搞 代码热更可以用某种解释器 解释执行的语言来搞 可供选择的有Lua as3
  • 发现一个hibernate针对derby数据库的问题bug,及解决办法

    最近apache软件基金会 发布了derby10 7 由于derby到10 7版本才支持boolean数据类型 今天发现一个hibernate针对derby数据库的一个bug 特意把它贴出来 以提醒他人 2011 01 01发现的hiber
  • qwt之获取动态变化x轴和y轴坐标的最大值和最小值

    一 新建工程 将qwt基本画图功能配置完毕 开始进行页面布局 如图所示 二 在值变化按钮中 可以实现每次进行点击x轴的时候 都会获取动态的x轴的最大值和最小值 进行点击转到槽之后x轴部分加入以下代码 void Widget on pushB
  • Basic Level 1093 字符串A+B (20分)

    题目 给定两个字符串 A 和 B 本题要求你输出 A B 即两个字符串的并集 要求先输出 A 再输出 B 但重复的字符必须被剔除 输入格式 输入在两行中分别给出 A 和 B 均为长度不超过 1 0 6 10 6 106的 由可见 ASCII
  • 利用DDA、中点画线和Bresenham法画直线

    一 实验目的 在空白图像上绘制两个点 坐标分别为 24 26 和 140 624 并且绘制出以该点为端点的直线 要求利用DDA 中点直线及Bresenham算法进行绘制 二 设计方案 使用DDA 中点画线和Bresenham画线法绘制直线