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

数值微分法(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. 剑指offer自学系列(二)

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...

  2. Percona-Toolkit 之 pt-kill 低效SQL

    [root@ tools]#vi ptkill_master.confuser=rootpassword=asd.123port=3306busy-time=5printkill /u01/soft/ ...

  3. 75.Python中ORM聚合函数详解:Sum

    Sum:某个字段的总和. 1. 求图书的销售总额,示例代码如下: from django.http import HttpResponse from django.db import connecti ...

  4. 078-PHP数组排序,两次循环法

    <?php $arr=array(35,43,56,2,76,23,47,55,71); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr ...

  5. Python MySQL Order By

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  6. kafka的编程模型

    1.kafka消费者编程模型 分区消费模型 组(group)消费模型 1.1.1.分区消费架构图,每个分区对应一个消费者. 1.1.2.分区消费模型伪代码描述 指定偏移量,用于从上次消费的地方开始消费 ...

  7. Java高级特性——注解,这也许是最简单易懂的文章了

    最近,浪尖在做flink的项目时source和sink的绑定那块用到了注解,当然新版本1.6以后就变为server load的方式加载. 但是浪尖也是觉得很有毕业讲一下注解,毕竟高级免试也会问答的吧. ...

  8. C# Stream篇(四) -- FileStream

    FileStream 目录: 如何去理解FileStream? FileStream的重要性 FileStream常用构造函数(重要) 非托管参数SafeFileHandle简单介绍 FileStre ...

  9. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  10. selenium2Library无法启动chrome

    使用其他浏览器都没有影响,唯独chrome启动不起来,去掉IE-连接-局域网设置-自动检测设置就OK了