dda算法c语言,Python使用DDA算法和中点Bresenham算法画直线
先上效果图
代码
#!/usr/bin/env python
# coding=utf-8
from pylab import *
from matplotlib.ticker import MultipleLocator
import matplotlib.patches as patches
'''
1. 输入直线两端点 x0,y0 xn,yn
2. 计算初始值delta_x, delta_y,k=delta_y/delta_x,d=0, x=x0,y=y0
3. 绘制点x,y
4. d更新为d+k,若d>0.5,则x,y更新为x+1,y+1,d=d-1;否则x,y更新为x+1,y
5. 重复3,4直到直线画完
'''
def init(ax, width):
# 设置长宽
ax.axis([0, width, 0, width])
# 设置主刻度标签的位置,标签文本的格式
majorLocator = MultipleLocator(1)
minorLocator = MultipleLocator(0.5)
ax.xaxis.set_major_locator(majorLocator)
ax.yaxis.set_major_locator(majorLocator)
# ax.xaxis.set_minor_locator(minorLocator)
# ax.yaxis.set_minor_locator(minorLocator)
ax.grid(True) # x坐标轴的网格使用主刻度
def add_pixel(x, y, ax, c):
x = round(x)
y = round(y)
if c == 1:
ax.add_patch(patches.Rectangle((x - 0.5, y - 0.5), 1, 1, color='b'))
ax.plot(x, y, 'r.')
else:
ax.add_patch(patches.Rectangle((x - 0.5, y - 0.5), 1, 1))
ax.plot(x, y, 'y.')
if __name__ == '__main__':
# 将一行的字符串分割并转化为数字
x0, y0, x1, y1, width = map(int, input("输入直线的两点和画布的边长: ").split(' '))
if x0>x1:
x0,x1=x1,x0
y0,y1=y1,y0
ax = subplot(121, aspect='equal',
title='modified Bresenham') # 改进的bresenham
ax.plot([x0, x1], [y0, y1], '-k')
bx = subplot(122, aspect='equal', title='DDA') # DDA
bx.plot([x0, x1], [y0, y1], '-k')
# 图形初始化
init(ax, width)
init(bx, width)
delta_x = x1 - x0
delta_y = y1 - y0
d = 0
if delta_x == 0:
k = 999999999
else:
k = delta_y / delta_x
x = round(x0)
y = round(y0)
'''
DDA算法
'''
if k > -1 and k < 1:
# X 最大位移
while True:
if x > x1:
break
add_pixel(x, y, bx, 1)
x = x+1
y = y+k
elif k >= 1:
# Y 最大位移
while True:
if y > y1:
break
add_pixel(x, y, bx, 1)
y = y+1
x = x+1/k
else:
while True:
if y < y1:
break
add_pixel(x, y, bx, 1)
y = y-1
x = x-1/k
'''
k的范围
1. (0,1) x为最大位移,y正向增加
2. (1,+inf) y为最大位移,x正向增加
3. (0,-1) x为最大位移,y负向增加
4. (-1,-inf)y为最大位移,y减小。x正向增加
'''
x = x0
y = y0
if k > 1:
while True:
if y > y1:
break
add_pixel(x, y, ax, 0)
y = y + 1
d = d + 1 / k
if d > 0.5:
x = x + 1
d = d - 1
elif k > 0:
while True:
if x > x1:
break
add_pixel(x, y, ax, 0)
x = x + 1
d = d + k
if d > 0.5:
y = y + 1
d = d - 1
elif k > -1:
while True:
if x > x1:
break
add_pixel(x, y, ax, 0)
x = x + 1
d = d - k
if d > 0.5:
y = y - 1
d = d - 1
else:
while True:
if y < y1:
break
add_pixel(x, y, ax, 0)
y = y - 1
d = d - 1 / k
if d > 0.5:
x = x + 1
d = d - 1
show()
dda算法c语言,Python使用DDA算法和中点Bresenham算法画直线相关推荐
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 计算机图形学04:中点Bresenham算法画椭圆
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 计算机图形学-抛物线的中点Bresenham算法
抛物线 f ( x ) = a x 2 f(x)=ax^2 f(x)=ax2的中点Bresenham算法 语言:matlab 画图:plot 1 抛物线的特征 通常定义抛物线为到一条直线(准线)和直线 ...
- 圆的扫描转换-中点Bresenham算法
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于理想圆的像素点集的过程.圆的绘制可以使用简单方程画圆算法或极坐标画圆算法,但这些算法涉及开方运算或三角运算,效率很低. 仅包含加减运算的顺时针绘制1/8圆的 ...
- 计算机图形学:直线段的生成算法,VS实现数值微分法和中点Bresenham算法
实验要求: 实现直线段生成的两种方法: 1) 数值微分法 和 2) 中点Bresenham算法.用户用鼠标点击两个点,两个点都确定后,利用直线段的绘制算法绘制两个点之间的一条直线段.本文章仅涉及算法的 ...
- 图形学-中点Bresenham算法
图形学-中点Bresenham算法 原理 代码 例子 原理 由Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别. 这时直线将 ...
- kociemba算法c语言,Python kociemba包_程序模块 - PyPI - Python中文网
科辛巴 这个Python包包含了Herbert Kociemba求解魔方的两阶段算法的两个等价实现(在C和Python中). 原始java实现可以在这里找到:http://kociemba.org/d ...
- 文本处理算法_基于 Python 的 11 种经典数据降维算法
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...
- 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法
试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...
- 经典c语言程序设计算法,C语言程序设计和循环结构相关的经典算法之一.ppt
C语言程序设计和循环结构相关的经典算法之一 第七讲 循环结构的经典算法之一 程序设计举例 ;教 学目 的 :1.灵活运用循环语句 2.编写一些基本算法程序 教学重点和难点:重点:判断素数,求最大公约数 ...
最新文章
- 动态视频目标检测和跟踪技术(入门)
- 如何借助 svn update 自动更新线上的web
- NOI前总结:点分治
- python js返回 json_[python爬虫]把js转化成json
- 过去的一年,哪些北大人坑死了北大?
- python定时器的使用方法_Python timer定时器两种常用方法解析
- Atitit 图像处理底色变红的解决
- 免费中文api文档!免费java帮助文档api中文版!!!!!
- 如何批量创建文件夹并命名?
- vue 弹框只出来一半,另一半白屏遮挡了
- 混合云的那些事,如何做到让公有云和私有云实现1+12
- 国内的微软更新服务器地址,windows update 服务器
- MQ学习(二)----ActiveMQ简介(转)
- 12/22从东京到布里斯班
- 如何有效的快速处理恶意差评?
- 又一个程序猿的奋斗史——第五章	苦逼的宿舍条件
- 关于python使用hadoop(使用python操作hdfs)
- 评测:24英寸iMac与27英寸iMac详细对比
- 【工具神器】PO VO DTO 转换神器
- ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程
热门文章
- OpenCV-利用其它widthStep方法把interest——img的所有像素值增加200
- python正则表达式--爬取百度文库内容
- 计算机怎么剪切音乐然后合在一起,电脑怎么剪辑合并音乐
- 基于python的学生管理系统的设计开题报告_学生信息管理系统设计开题报告
- 《HTTP权威指南》---http访问描述
- visio专业版svg图片裁剪
- c#windfrom打包_WinForm程序打包教程
- rgba转16进制颜色
- ALPHACAM Desinger 2020.0中文破解版 64位
- CentOS7.5搭建ELK6.2.4集群与简单测试