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

数值微分法(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. 安装部署及升级到Exchange Server 2010

    本文档详细的描述了,如何在Windows Server 2008 R2的环境下安装Exchange Server 2010,包括的内容有:   先检查组织环境: 1.请确保林的功能级别至少为 Wind ...

  2. dede:list 与 dede:arclist 的区别

    1.{dede:list}是用于列表页的文章列表调用,通常是用于list_article.htm页面,这个文章列表是可以分页的. 功能说明:表示列表模板里的分页内容列表适用范围:仅列表模板 list_ ...

  3. tf.argmax()函数作用

    tf.argmax()函数原型: def argmax(input, axis=None, name=None, dimension=None, output_type=dtypes.int64) 作 ...

  4. 死循环(endless loop)

    死循环 死循环就是一个无法结束的循环.(endless loop / infinite loop) 出现死循环是因为没有设置好结束条件,循环的结束条件很重要,要充分考虑各种边界情况. 以上一篇随笔中的 ...

  5. java核心-JVM-gc面试题

    1.写一个memory leak的例子 public class MemonyLeak { //1.memoryLeak内存泄漏 /* 这类错误报错具体显示:java.lang.OutOfMemory ...

  6. 002、将mysql用作一个简单的计算器

    SELECT PI( ), , ( ) ; 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  7. hdu 1160 上升序列 dp

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. Django 异常处理

    我们新建一个py文件 # 在restful中导入exception_handler from rest_framework.views import exception_handler from dj ...

  9. js实现ctrl+v粘贴上传图片(兼容chrome,firefox,ie11)

    背景 我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢? 原理分析 提取操作:复制=>粘贴=& ...

  10. bzoj 4318OSU!

    和tyvj的Easy一样吧(然而还是不会2333) 期望是不能直接平方的(涨姿势),所以,,呵呵 #include<bits/stdc++.h> #define inf 0x7ffffff ...