Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线"
date: 2018-06-11T19:28:02+08:00
tags: ["图形学"]
categories: ["Python"]
先上效果图

代码
#!/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()
Python使用DDA算法和中点Bresenham算法画直线的更多相关文章
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- 利用canvas实现的中点Bresenham算法
Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...
- [DEBUG]椭圆的中点Bresenham算法边缘绘制出现错误
在使用椭圆的中点Bresenham算法绘制椭圆时, 当椭圆足够大时, 椭圆的边缘会出现下面这种情况. 出错原因: 将a, b声明为了int类型, 导致中点判别式中发生溢出 关注后面的a*b*a*b当a ...
- 【转】Bresenham快速画直线算法
一. 算法原理简介: 算法原理的详细描述及部分实现可参考: http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresen ...
- Bresenham快速画直线算法
现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这 ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
- 直线的中点Bresenham算法的实现
一.实验目的 1.掌握在MFC中搭建图形绘制的基本框架的方法: 2.将直线的中点Bresenham算法转化成可执行代码. 二.实验内容 1. 通过分析具体数据在中点Bresenham算法上的执行过程, ...
随机推荐
- java @Override 报错解决
有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...
- DWM1000 测距原理简单分析 之 SS-TWR
蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 超宽带测距,使用的TOF(time of fly) 的方式,也就是计算无线电磁波传输时 ...
- Java try-cath-finally异常
Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中. 标准运行时异常类的子类是最常见的异常类.由于 java.lang 包是默认加载到所有的 Java 程序的,所以大 ...
- __x__(29)0908第五天__高度塌陷 问题
高度塌陷 在文档流中,父元素的高度默认是被子元素撑开的. 但是当为 子元素 设置 float 时,子元素会完全脱离文档流,无法再撑开父元素,导致父元素高度塌陷...以致于布局混乱 变成 BFC块级格式 ...
- tar:short read problem
1. tar:short read problem description 在PC机上将需要下载到板子上的两个文件夹gdb.ncurses用tar命令打包. 命令如下:tar -cvf test5.t ...
- Android总结之json解析(FastJson Gson 对比)[申明:来源于网络]
Android总结之json解析(FastJson Gson 对比)[申明:来源于网络] 地址:http://blog.csdn.net/u014031072/article/details/5392 ...
- 杂_小技巧_将网页上的内容通过亚马逊邮箱传到kindle中
所需条件 1.kindle要联网 2.要有亚马逊邮箱 3.要有微信,电脑上或者手机上 操作步骤: 1.找到你想要传送到kindle上的文章网页 2.在微信中关注“亚马逊kindle服务号”并且按照里边 ...
- Jenkins实现自动运行jmeter脚本
下载安装包 --jenkins的war包 下载地址:http://jenkins-ci.org/ 链接:https://pan.baidu.com/s/1VhwgYWqn3Bex2kCHigW5wA ...
- fiddler修改Requests之前的数据和response 之后的数据
1. 开启抓包 file--->capture traffic 2. 在页面底部黑框输入bpu http://www.runoob.com/?s=mysql 3. 在浏览器URL输入http:/ ...
- token登录流程
1.token生成规则: private static $nameKey = array( 'readerid' => 0, //客户号 'ubuntu' => 1, //登录令牌 'pt ...