利用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法画直线 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python、Tkinter、更改标签颜色

    有没有一种简单的方法来更改按钮中文本的颜色 I use button text input text here 更改按下后按钮文本的内容 是否存在类似的颜色变化 button color red Use the foreground设置按钮
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 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画线法绘制直线