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

光栅图形中点的表示

屏幕坐标系在左上角

地址=(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. poj1195(二维树状数组)
  2. View及ViewGroup的事件分发及传递(二)
  3. docker之centos7安装docker
  4. 基于eureka如何使用spring cloud zuul 网关
  5. 深入理解计算机系统学习记录(一)
  6. 设置 input元素placeholder的字体颜色
  7. 河南省高考让不让带计算机,河南高考2018严禁携带的东西有哪些?这种衣服不能进考场...
  8. Spring Security用户认证和权限控制(默认实现)
  9. 最常问的Java面试题,有Get吗?
  10. 怎么把一个控件放到tab页面上去?_C/C++应用无障碍化如何支持Tab键浏览
  11. Eclipse集成ijkplayer并实现本地和网络视频播放等
  12. OpenSea2月总交易额为9390.4万美元 用户总数突破5万人
  13. python判断汉字偏胖_写了2年python,知道 if __name__ == '__main__' 什么意思吗?
  14. viper4android 6.0脉冲,【详解】v4a音效脉冲样本
  15. 《等一朵花开》读书感悟
  16. java+redis 实现搜索附近人功能
  17. 怎么在服务器上安装SSL证书?服务器证书安装配置指南
  18. 进程和计划任务管理|linux
  19. 使用SwipeRecyclerView配合下拉刷新出现Scrapped or attached views may not be recycled. isScrap:false isAttached:
  20. Python画爱心——一颗会跳动的爱心~

热门文章

  1. STM32F103C8T6连接LD3320语音识别模块(USART)
  2. 使用 jquery.wordexport.js导出的Word排版
  3. 少儿编程教培管理系统介绍:源码+Scratch课程学习
  4. 【转载】详细设计说明书模板
  5. 用ChatGPT可以去微博做个大V了(狗头)
  6. 软件工程领域CCF B类会议:SANER介绍(以SANER 2019为例)
  7. JAVAWeb开发:Tomcat出现The origin server did not find a current representation for the target reso...的问题
  8. android opengl ppt,Opengl example.ppt
  9. android视频播放截图并制作成gif图片
  10. 南宁装修工长带队,价格公道不乱增加项目