我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示。

数值微分法(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、中点画线画圆、椭圆的更多相关文章

  1. 计算机图形学之扫描转换直线-DDA,Bresenham,中点画线算法

    1.DDA算法 DDA(Digital Differential Analyer):数字微分法 DDA算法思想:增量思想 公式推导: 效率:采用了浮点加法和浮点显示是需要取整 代码: void lin ...

  2. 计算机图形学DDA画线法+中点画线法+Bresenham画线法

    #include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...

  3. 【液晶模块系列基础视频】4.1.X-GUI图形界面库-画线画圆等函数简介

    [液晶模块系列基础视频]4.1.X-GUI图形界面库-画线画圆等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地 ...

  4. 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  5. Bresenham直线算法与画圆算法

    在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...

  6. 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

    中点画圆算法        如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...

  7. WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...

  8. H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入

    一: 1.鼠标监视坐标值 <!DOCTYPE html> <head> <meta charset=UTF-8> <title>canvas的演示< ...

  9. 基于Bresenham算法画圆

    bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...

随机推荐

  1. Spring容器的创建原理

    1.new ioc容器(AnnotationConfigApplicationContext 注解ioc) 2.refresh()方法调用 2.1 prepareRefresh()刷新前的预处理 a: ...

  2. Python 操作 sqlite

    代码示例 #导入sqlite3库 import sqlite3 #连接数据库 conn = sqlite3.connect("customers.db") #创建表,主键id自增 ...

  3. ROS常用库(一) fake_localization

    wiki是最好的学习资料,以下直接参考了wiki官网.另外po出官网网址,建议英语较好的朋友之接看原版 http://wiki.ros.org/fake_localization 概述 fake_lo ...

  4. 使用git提交远程仓库

    git pull    更新 git add 文件名   将文件添加到暂存区 git commit -m ‘注释’   提交 git push origin master   提交到远程仓库

  5. php.laravel.csrf

    概念请自己查 在全局帮助函数库Illuminate\Foundation\helpers.php中有以下几个函数定义,在看过前两个函数实现可以在使用中多少有点帮助. function csrf_fie ...

  6. 通过html5 touch事件封装手势识别组件

    html5移动端新增了touchstart,touchmove,touchend事件,利用这3个事件,判断手指的点击和划动轨迹,我们可以封装各种手势的识别功能, 这3个事件和pc端的mousedown ...

  7. 第一部分 JavaScript语言核心(三)

    第六章 对象 P123 在ES3中,点运算符后的标识符不能是保留字.如果一个对象的属性名是保留字,name必须使用方括号的形式访问它们,如o["for"]和o["clas ...

  8. 从谷歌Pixel3不堆硬件看智能手机下一个十年将被AI制霸

    别看现在的智能手机行业热闹异常--厂商混战.新品频出.噱头涌现,但能引领手机行业发展趋势的依旧是苹果和谷歌.如果说苹果的iPhone树立了一个个智能手机行业进化的标杆,那么谷歌其实就是在为安卓手机的发 ...

  9. 基于thinkphp的邮件群发系统的设计

    在网上找了很多资料,关于邮件群发系统的开发并没有一个非常好的方案,冥思苦相数日,研究了一套目前使用稍微有点效果的邮件群发系统,特地来分享一下,当然有过有更好的方案,欢迎大家一起讨论,或者私聊一下我. ...

  10. SqlServer 集合运算符

    1.集合运算符概述 (1)集合运算符运用与集合之间的运算. (2)多元集合: 指的是来自两个输入查询的集合,可能包含重复项 (3)T-SQL 支持三种集合运算符 union .intersect .e ...