扫描转换算法——DDA、中点画线画圆、椭圆
我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示。
数值微分法(DDA):以下PPT截图来自北京化工大学李辉老师
代码实现:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from pylab import * def init(ax): #将主标签设置为1的倍数
majorLocator = MultipleLocator(1);
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(majorLocator);
ax.yaxis.set_major_locator(majorLocator);
ax.grid(True); if __name__ == '__main__': x0, y0, x1, y1 = map(int, input("请输入直线的起点与终点: ").split(' '))
ax = subplot(title='DDA');
ax.plot([x0, x1], [y0, y1], 'r');
delta_x = x1-x0;
delta_y = y1-y0;
#画坐标轴
if x1>y1:
ax.axis([x0-1, x1+1, y0-1, x1+1]);
init(ax);
else:
ax.axis([x0-1, y1+1, y0-1, y1+1]);
init(ax);
#计算斜率k的值
if delta_x == 0:
k = 999999999;
else:
k = delta_y / delta_x;
#如果|k|<=1
if k>-1 and k<1:
while x0<=x1:
x = round(x0);
y = round(y0);
ax.plot(x, y, 'b.');
x0 += 1;
y0 = y0+k;
else:
while y0<=y1:
x = round(x0);
y = round(y0);
ax.plot(x, y, 'b.');
x0 += 1/k;
y0 += 1;
plt.show();
运行截图:
中点画线:以下PPT截图来自北京化工大学李辉老师
代码实现:
wimport matplotlib.pyplot as plt
import matplotlib.patches as patches
from pylab import * def init(ax): #将主标签设置为1的倍数
majorLocator = MultipleLocator(1);
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(majorLocator);
ax.yaxis.set_major_locator(majorLocator);
ax.grid(True); if __name__ == '__main__': x0, y0, x1, y1 = map(int, input("请输入直线的起点与终点: ").split(' '))
ax = subplot(title='Midpoint');
ax.plot([x0, x1], [y0, y1], 'r');
a = y0-y1;
b = x1-x0;
d = 2*a+b;
d1 = 2*a;
d2 = 2*(a+b);
#画坐标轴
if x1>y1:
ax.axis([x0-1, x1+1, y0-1, x1+1]);
init(ax);
else:
ax.axis([x0-1, y1+1, y0-1, y1+1]);
init(ax); x = x0;
y = y0;
ax.plot(x, y, 'r.');
while(x < x1):
if d<0:
x += 1;
y += 1;
d += d2;
else:
x += 1;
d += d1;
ax.plot(x, y, 'r.');
plt.show()
中点画圆法:以下PPT截图来自北京化工大学李辉老师
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from pylab import * def init(ax): #将主标签设置为1的倍数
majorLocator = MultipleLocator(1);
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(majorLocator);
ax.yaxis.set_major_locator(majorLocator);
ax.grid(True); if __name__ == '__main__': r = int(input("请输入半径: "));
plt.figure(figsize=(r*0.1, r*0.1));
ax = subplot(title='MidPointCircle');
d = 1-r;
ax.axis([-r-1, r+1, -r-1, r+1]);
init(ax); x = 0;
y = r;
ax.plot(x, y, 'r.');
while(x <= y):
if d<0:
d += 2*x+3;
else:
d += 2*(x-y)+5;
y -= 1;
x += 1;
ax.plot(x, y, 'r.');
ax.plot(y, x, 'r.');
ax.plot(x, -y, 'r.');
ax.plot(-y, x, 'r.');
ax.plot(-x, y, 'r.');
ax.plot(y, -x, 'r.');
ax.plot(-x, -y, 'r.');
ax.plot(-y, -x, 'r.');
plt.show()
椭圆的扫描转换:以下PPT截图来自北京化工大学李辉老师
代码实现:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import mpl_toolkits.axisartist as axisartist
from pylab import * def init(ax):
#设置x轴:空心箭头、数值在下方
ax.axis["x"] = ax.new_floating_axis(0, 0);
ax.axis["x"].set_axisline_style("->", size = 1.0);
ax.axis["x"].set_axis_direction("bottom"); #设置y轴:空心箭头、数值在右方
ax.axis["y"] = ax.new_floating_axis(1, 0);
ax.axis["y"].set_axisline_style("->", size = 1.0);
ax.axis["y"].set_axis_direction("right"); if __name__ == '__main__': a, b = map(int, input("请输入椭圆的长、短半径: ").split(' '));
fig = plt.figure(figsize=(5, 7))
#初始化画布
ax = axisartist.Subplot(fig, 111, title='MidpointElipse');
#将绘图区对象添加到画布中
fig.add_axes(ax)
init(ax); x = 0;
y = b;
d1 = b*b+a*a*(-b+0.25); #增量初值
ax.plot(x, y, 'r.');
ax.plot(x, -y, 'r.'); while(b*b*(x+1)<a*a*(y-0.5)): #法向量的x、y不一样大时
if d1<0:
d1 += b*b*(2*x+3);
x += 1;
else:
d1 += b*b*(2*x+3)+a*a*(-2*y+2);
x += 1;
y -= 1;
#画四个对称点
ax.plot(x, y, 'r.');
ax.plot(x, -y, 'r.');
ax.plot(-x, y, 'r.');
ax.plot(-x, -y, 'r.'); #画到了法向量的x=y,即椭圆弧的下半部分
d2 = b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while y>0: #终结条件y>0
if d2<0:
d2 += b*b*(2*x+2)+a*a*(-2*y+3);
x += 1;
y -= 1;
else:
d2 += a*a*(-2*y+3);
y -= 1;
ax.plot(x, y, 'r.');
ax.plot(x, -y, 'r.');
ax.plot(-x, y, 'r.');
ax.plot(-x, -y, 'r.'); plt.show()
扫描转换算法——DDA、中点画线画圆、椭圆的更多相关文章
- 计算机图形学之扫描转换直线-DDA,Bresenham,中点画线算法
1.DDA算法 DDA(Digital Differential Analyer):数字微分法 DDA算法思想:增量思想 公式推导: 效率:采用了浮点加法和浮点显示是需要取整 代码: void lin ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
- 【液晶模块系列基础视频】4.1.X-GUI图形界面库-画线画圆等函数简介
[液晶模块系列基础视频]4.1.X-GUI图形界面库-画线画圆等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地 ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
中点画圆算法 如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...
- WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
- H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入
一: 1.鼠标监视坐标值 <!DOCTYPE html> <head> <meta charset=UTF-8> <title>canvas的演示< ...
- 基于Bresenham算法画圆
bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...
随机推荐
- Golang的循环结构-for语句
Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...
- P1053 住房空置率
P1053 住房空置率 转跳点:
- POJ 1905:Expanding Rods 求函数的二分
Expanding Rods Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13780 Accepted: 3563 D ...
- 指令——touch
一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. 指令:touch 作用:创建文件 语法: ...
- 竟然把Ruoyi在我自己的Eclipse编译成功,并能跑通了。。。。服了我自己了
前几天,下载最新ECLISPSE2019压缩包,解压缩成功,没提示不是免费:eclipse-jee-2019-12-R-win32-x86_64.zip然后我配置好了maven于是我1月2日晚一时兴起 ...
- 《新标准C++程序设计》3.9-3.10(C++学习笔记11)
一.C++程序到C程序的翻译 程序示例分析: C++: class CCar { public: int price; void SetPrice (int p); }; void CCar::Set ...
- CSU 1126 DFS前缀和
在一棵树上找影响最小的某个点,某个点的影响是等于其他点到他的距离*其他点的权值 的和 我一开始也找不到什么好的方法,只能想到每个点暴力去判断,但是这样肯定会超时(10^5个点),又有点想用类似前缀和, ...
- Windows + Python + flup + flask + fastcgi + Nginx配置
Nginx配置 # HTTPS server { listen ssl; server_name kvaccount.xx.io; ssl_certificate "C:/xx/conf/s ...
- JAVA的控制结构
一.控制结构 1.控制结构概述 控制结构是控制程序如何运行的特殊的语句结构.控制结构可以分为:顺序控制结构,分支控制结构和循环控制结构. 2.顺序控制结构 除了分支控制结构和循环控制结构之外的语句都是 ...
- oracle修改表名
alter table 原来表名 rename to 新表名