计算机图形学——基本图形算法

光栅图形中点的表示

屏幕坐标系在左上角

地址=(Xmax-Xmin)[每行像素点数]*(Y-Ymin)[行数]+(X-Xmin)[行中位置]+基地址

直线扫描转换算法

假设前提:像素间均匀网格,整型坐标系,直线段斜率0<k<1;对于k>1,x,y互换;

  • 数值微分算法(DDA)

y = m x + b y=mx+b y=mx+b

m = ( y 2 − y 1 ) / ( x 2 − x 1 ) , b = ( x 2 y 1 − x 1 y 2 ) / ( x 2 − x 1 ) m=(y2-y1)/(x2-x1),b=(x2y1-x1y2)/(x2-x1) m=(y2−y1)/(x2−x1),b=(x2y1−x1y2)/(x2−x1)

数值微分:
m = △ y / △ x = ( y i + 1 − y i ) / ( x i + 1 − x i ) m=△y/△x=(yi+1-yi)/(xi+1-xi) m=△y/△x=(yi+1−yi)/(xi+1−xi)

void DDALine(int x1,int y1,int x2,int y2)
{double dx,dy,e,x,y;dx=x2-x1;dy=y2-y1;e=(fabs(dx)>fabs(dy))?fabs(dx):fabs(dy);dx/=e;dy/=e;x=x1;y=y1;for(int i=1;i<=e;i++){SetPixel((int)(x+0.5),(int)(y+0.5));x+=dx;y+=dy;}
}
  • 中点画线法

F ( x , y ) = a x + b y + c = 0 F(x,y)=ax+by+c=0 F(x,y)=ax+by+c=0

a = y 0 − y 1 ; b = x 1 − x 0 ; c = x 0 y 1 − x 1 y 0 a=y0-y1;b=x1-x0;c=x0y1-x1y0 a=y0−y1;b=x1−x0;c=x0y1−x1y0

d 0 : F ( x 0 + 1 , y 0 + 0.5 ) , d 0 = a + 0.5 b ; d ≥ 0 : F ( x i + 2 , y + 0.5 ) , 2 d 0 + 2 a ; d < 0 : F ( x i + 2 , y + 1.5 ) , 2 d 0 + 2 a + 2 b d0:F(x0+1,y0+0.5),d0=a+0.5b;d≥0:F(xi+2,y+0.5),2d0+2a;d<0:F(xi+2,y+1.5),2d0+2a+2b d0:F(x0+1,y0+0.5),d0=a+0.5b;d≥0:F(xi+2,y+0.5),2d0+2a;d<0:F(xi+2,y+1.5),2d0+2a+2b

void Midpoint Line(int X0,int y0,int x1,int y1,int color)
{int a,b,d1,d2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*(a+b);x=x0,y=y0;drawpixel(x,y,color);while(x<x1){if(d<0){x++,y++,d+=d2;}else{x++;d+d1;}drawpixel(x,y,color);}
}
  • Bresenham画线算法

算法与推理与中线画线法类似

void BresenhamLine(int x1,int y1,int x2,int y2)
{int x,y,dx,dy,p;x=x1;y=y1;dx=x2-x1;dy=y2-y1;p=2*dy-dx;for(;x<=x2;x++){SetPixel(x,y);if(p>=0){y++;p+=2*(dx-dy);}else{p+=2*dy;}}
}

圆的扫描转换算法

  • 正负法

基本原理:假设已选取Pi-1为第i-1个像素,若Pi-1在圆内,就要向圆外方向走一步;若已在圆外就要向圆内走一步。总之,尽量贴近圆的轮廓线。

基本算法:圆的表示:设圆的圆心为(0,0),半径为R,则圆的方程为:
F ( x , y ) = x 2 + y 2 − R 2 = 0 F(x,y)=x^2+y^2-R^2=0 F(x,y)=x2+y2−R2=0
当点(x,y)在圆内时,F(x,y)<0
当点(x,y)在圆外时,F(x,y)>0

步骤:1. x0=0,y0=R;2. 求得Pi(xi,yi)后找Pi+1的原则:

① 当Pi在圆内时(F(xi,yi)≤0),要向右走一步得Pi+1,这是向圆外方向走去。取xi+1= xi+1, yi+1= yi
② 当Pi在圆外时(F(xi,yi)>0),要向下走一步得Pi+1,这是向圆内方向走去,取xi+1= xi, yi+1= yi-1

递推式为:

void Posandneg methods(int R,int p1,int p2,int color)
{int x,y,x0,y0;x0=p1;y0=p2+R;x=x0;y=y0;int F0=(x0-p1)*(x0-p1)+(y0-p2)*(y0-p2)-R*R;int F1=F0;int F2;while(x<=y){if(F1<=0){F2=F1+2x+1;x=x+1;   }else{F2=F1-2y+1;y=y+1;}drawpixel(x,y,color);}
}
  • Bresenham画圆算法

基本原理:假设圆心(0,0)为原点,考虑AB弧的画法,显示一个整圆时,只要在显示AB上任一点(x,y)时,同时显示在圆周上其它七个对称点(y,x), (y,-x), (x,-y), (-x,-y),(-y,-x), (-y,x), (-x,y)。

基本算法

void BresenhamCircle(int R)
{int x,y,p;int x=0;int y=R;p=3-2*R;for(;x<=y;x++){SetPixel(x,y);if(p>=0){p+=4*(x-y)+10;y--;}else{p+=4*x+6;}}
}
  • 圆的多边形迫近法

基本思想整个圆弧等分成一段段的短直线,用这些短直线形成的折线来逼近圆弧。为了获得这些短直线,只需按一定的方式计算给定圆弧轨迹上一系列顶点,短直线的绘制可采用直线的生成算法,如果将圆弧分割的足够密,则短直线将足够短,形成的折线将可以和圆弧接近到任意程度,因此在允许的误差范围内,可以用显示折线代替显示圆弧

基本算法



void approachPolygon (int R)
{int x0,y0,x1,y1,n;double θi,α;θi=0;x0=Rcos(θi)*180/3.14;y0=Rsin(θi)*180/3.14;g.drawpoint(x0,y0);for(α=0.1;α<=1;α=α+0.1){n++;x1=x0cos(α)*180/3.14-y0sin(α)*180/3.14;y1=x0cos(α)*180/3.14-y0sin(α)*180/3.14;g.drawpoint(x1,y1);if(α>=1) α=α-1;if(n>=3600) break;}
}

椭圆圆扫描转换算法※

  • 中点椭圆扫描转换算法
void MidpointEllipse(int a,int b)
{int x,y;double d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);SetPixel(x,y);while(b*b*(x+1)<a*a*(y-0.5)){if(d1<0){d1+=b*b*(2*x+3);x++;}else{d1+=(b*b*(2*x+3)+a*a*(-2*y+2));x++;y--;}SetPixel(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(-2*y+3);while(y>0){if(d2>0){d2+=a*a*(-2*y+3);y--;}else{d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;y--;}SetPixel(x,y);}
}

计算机图形学(1)基本图形算法相关推荐

  1. 计算机图形学 | 欢迎来到图形世界

    计算机图形学 | 欢迎来到图形世界 计算机图形学 | 欢迎来到图形世界 1.1 初识图形学 计算机图形学 相关学科 发展历史 1.2 探秘图形应用与研究 有趣的图形应用 计算机辅助设计(Compute ...

  2. 计算机图形学二维图形基本变换实验原理,江苏大学-计算机图形学第三次实验报告-二维图形变换...

    <江苏大学-计算机图形学第三次实验报告-二维图形变换>由会员分享,可在线阅读,更多相关<江苏大学-计算机图形学第三次实验报告-二维图形变换(13页珍藏版)>请在人人文库网上搜索 ...

  3. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...

    计算机图形学实验:二维图形变换.docx (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实验三 二维图形变换一.实验任务1. 通 ...

  4. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  5. OpenGL学习笔记 - 计算机图形学和现代图形API

    一.计算机图形学 1.简述 wiki上的解释说,"计算机图形学是计算机科学的一个子领域,它研究数字合成和操纵视觉内容的方法.尽管该术语通常指的是对三维计算机图形学的研究,但它也包括二维图形和 ...

  6. 计算机图形学椭圆_椭圆算法| 计算机图形学

    计算机图形学椭圆 椭圆的性质 (Properties of ellipse) Ellipse is defined as the locus of a point in a plane which m ...

  7. 计算机图形学-二维图形变换 笔记总结与代码实战

    文章目录 1.向量基础知识 2.图形坐标系 3.二维图形变换原理 4.二维图形几何变换 5.窗口视区变换 基本二维几何变换代码 二维复合变换实战-五星红旗绘制 1.向量基础知识 为什么向量如此重要:在 ...

  8. 计算机图形学 Bresenham直线生成算法

    bresenham算法是一种光栅化的直线生成算法,是计算机图形学目前使用广泛的直线扫描转换算法,具体逻辑很简单,就是描点.所以bresenham的算法研究实际上是研究目标点的选择. 实验环境: ope ...

  9. 计算机图形学 之 DDA直线算法(数值微分法)

    1. 直线段的扫描转换算法 在数学上,直线就是由无穷多个点组成的, 在计算机屏幕显示的话, 需要做一些处理,对于光栅显示器 光栅显示器上就是用有限多个点去逼近直线, 那么这些有限个点,我们需要知道每一 ...

  10. 计算机图形学开发框架,计算机图形学-基于3d图形开发技术

    第一张 游戏模型 1.底层渲染图形API包括Direct3D(windows)和Opengl(跨平台框架),这些API定义了对GPU的操作接口,Direct3d仅支持三角形网格,Opengl支持同面的 ...

最新文章

  1. 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...
  2. Java 23 种设计模式
  3. 记一次Debian11安装
  4. 树莓派html5播放器,树莓派|5 个很适合在课堂上演示的树莓派项目
  5. docker image 实践之容器化 ganglia
  6. @hdu - 6372@ sacul
  7. ARM三个寄存器 : 堆栈指针SP(R13)、连接寄存器LR(R14)和程序计数器PC(R15)
  8. 浏览器报错:unexpected end of input 解决方法
  9. php 字符串操作函数
  10. 数字图像处理及MATLAB实现实验四——图像变换
  11. FlowNet 2.0的阅读笔记
  12. 在Spyder 中安装第三方包
  13. sinx泰勒展开_高考中怎么用泰勒公式?
  14. 永磁同步电机PMSM启动Simulink建模与仿真
  15. ISO14443 Type B类型卡的防碰撞过程以及命令解析
  16. mysql 编程算法_十大编程算法助程序员走上高手之路
  17. arm指令一般编码格式和一般语法格式
  18. 服务器2012系统备份方法,服务器2012系统如何备份数据库备份
  19. 关于MySQL的版本
  20. JS实现番茄钟倒计时

热门文章

  1. PMP考试报名中项目经验该怎样填写?
  2. 蓝精灵事件来袭: 深受喜爱的蓝色角色来 Web3 啦!
  3. Python实现黑白棋人机对弈
  4. word-spacing无效
  5. 雷人的请假对白--员工向领导到请假
  6. 微信定位精灵 android,微信定位精灵安卓版下载
  7. 9.9 力扣652. 寻找重复的子树
  8. 互联网广告人--联合御寒--品牌,代理,平台,达人 多方携手御寒
  9. 新品国产C2000,独立双核32位CPU,主频高达400MHz,QX320F280049
  10. 状态机----C语言实现