08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205

圆的特征

圆被定义为到给定中心位置(xc,yc)距离为r的点集。圆心位于原点的圆有四条对称轴x=0,y=0, x=y和x=-y。若已知圆弧上一点(x,y),可以得到其关于四条对称轴的其它7个点,这种性质称为八分对称性。因此,只要扫描转换八分之一圆弧,就可以求出整个圆弧的象素集。

显示圆弧上的八个对称点的算法:

void CirclePoints(int x,int y,int color)

{ Putpixel(x,y,color); Putpixel(y,x,color);

Putpixel(-x,y,color); Putpixel(y,-x,color);

Putpixel(x,-y,color); Putpixel(-y,x,color);

Putpixel(-x,-y,color); Putpixel(-y,-x,color);

}

中点画圆算法

果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:

d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2

若 d<0,则应取P1为下一象素,而且再下一象素的判别式为:

d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3

若d≥0,则应取P2为下一象素,而且下一象素的判别式为

d=F(xp+2,yp-1.5)=(xp+2)2+(yp-1.5)2-R2=d+2(xp-yp)+5

我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

d0=F(1,R-0.5)=1.25-R

【算法流程图】

【算法代码】

void PaintArea::drawCircleMiddle(QPainter &painter,const QPoint ¢er, int r)

{

int x,y,deltax,deltay,d;

x=0;y=r;

deltax=3;deltay=2-3-3;d=1-r;

while(x

{

if(d<0)

{

d+=deltax;

deltax+=2;

x++;

}

else

{

d+=(deltax+deltay);

deltax+=2;deltay+=2;

x++;y++;

}

painter.drawPoint(center.x()+x,center.y()+y);

painter.drawPoint(center.x()+x,center.y()-y);

painter.drawPoint(center.x()-x,center.y()+y);

painter.drawPoint(center.x()-x,center.y()-y);

painter.drawPoint(center.x()+y,center.y()+x);

painter.drawPoint(center.x()+y,center.y()-x);

painter.drawPoint(center.x()-y,center.y()+x);

painter.drawPoint(center.x()-y,center.y()-x);

}

}

Bresenham画圆算法

思想参见直线的Bresenham画法 【计算机图形学】基本图形元素:直线的生成算法

【算法流程图】

【算法代码】

void PaintArea::drawCircleBresenham(QPainter &painter,const QPoint ¢er, int r)

{

int x,y,delta,delta1,delta2,direction;

x=0;y=r;

delta=2*(1-r);

while(y>=0)

{

painter.drawPoint(x,y);

if(delta<0)

{ delta1=2*(delta+y)-1;

if(delta1<=0)direction=1; else direction=2; }

else if(delta>0)

{ delta2=2*(delta-x)-1;

if(delta2<=0)direction=2; else direction=3; }

else direction=2;

switch(direction)

{case 1:

x++;delta+=2*x+1; break;

case 2:

x++; y--; delta+=2*(x-y+1); break;

case 3:

y--;delta+=(-2*y+1); break;

}

}

}

椭圆弧生成算法

基本同圆弧算法,只是方程变得复杂F(x,y)=(bx)^2+(ay)^2-(ab)^2.

对称性:4分对称,画第一象限

分段依据:斜率为一点

 

上段圆弧:

下段圆弧:

【椭圆中点算法流程图】

【算法代码】

void PaintArea::drawEllipseMiddle(QPainter &painter,int xCenter,int yCenter, int Rx, int Ry)

{

int Rx2=Rx*Rx;

int Ry2=Ry*Ry;

int twoRx2=2*Rx2;

int twoRy2=2*Ry2;

int p,x=0,y=Ry,px=0,py=twoRx2*y;

void ellipsePlotPoints(QPainter&,int,int,int,int);

ellipsePlotPoints(painter,xCenter,yCenter,x,y);

//Region1

p=round(Ry-(Rx2*Ry)+(0.25*Rx2));

while(px

x++;

px+=twoRy2;

if(p<0)

p+=Ry2+px;

else{

y--;

py-=twoRx2;

p+=Ry2+px-py;

}

ellipsePlotPoints(painter,xCenter,yCenter,x,y);

}

//Region2

p=round(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);

while(y>0){

y--;

py-=twoRx2;

if(p>0)

p+=Rx2-py;

else{ x++;

px+=twoRy2;

p+=Rx2-py+px;

}

ellipsePlotPoints(painter,xCenter,yCenter,x,y);

}

}

void ellipsePlotPoints(QPainter &painter,int xCenter,int yCenter,int x,int y)

{ painter.drawPoint(xCenter+x,yCenter+y);

painter.drawPoint(xCenter-x,yCenter+y);

painter.drawPoint(xCenter+x,yCenter-y);

painter.drawPoint(xCenter-x,yCenter-y);

}

软件截图

这个绘图软件是用QT写的,我会另外写一篇介绍编程结构,待续~

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7909607

c语言计算机图形来画八分画圆,【计算机图形学】基本图形元素:圆的生成算法...相关推荐

  1. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法

    在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 ...

  2. 计算机图形画圆弧的方法,计算机图形学_圆弧的生成

    <计算机图形学_圆弧的生成>由会员分享,可在线阅读,更多相关<计算机图形学_圆弧的生成(19页珍藏版)>请在人人文库网上搜索. 1.计算机图形学,ComputerGraphic ...

  3. java画bezier曲面_计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制

    <计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制>由会员分享,可在线阅读,更多相关<计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制(9页珍 ...

  4. 计算机图形及分类的相关知识,“计算机图形学”课程教与学

    摘 要:本文针对作者几年来在"计算机图形学"课程教学过程中实际遇到的问题,从教师如何教授知识和学生如何学习知识两个方面进行深入分析和研究,提出了改进课堂教学.实验教学以及学生学习的 ...

  5. 计算机图形学画直线程序豆丁网,计算机图形学DDA生成直线画法程序.doc

    计算机图形学DDA生成直线画法程序 实验一.直线的生成 一.实验目的 掌握DDA直线画法.中点画线法和Bresenham画线法 掌握VC++简单程序设计方法 二.实验内容 根据提供的程序框架,修改部分 ...

  6. 计算机图形系是学什么的,计算机图形学

    解: A(-2,6) x1=-2, y1=6 B(7,-2) x2=7, y2=-2 窗口:wxl=0, wxr=4, wyb=0, wyt=3 * 0≤U≤1 P1=-Δx=-(7+2)=-9 q1 ...

  7. 计算机图形Opengl的实验报告,opengl计算机图形学实验报告之3D漫游世界.doc

    opengl计算机图形学实验报告之3D漫游世界.doc 北师大珠海分校信息技术学院计算机图形学实验报告实验报告文件命名方式学号姓名_实验序号_实验名称.doc姓名学号1001010092专业计算机任课 ...

  8. 计算机图形图像学的专业特性,计算机图形学第1_5章课后习题参考答案

    第一章 1.试述计算机图形学研究的基本内容? 答:见课本P5-6页的1.1.4节. 2.计算机图形学.图形处理与模式识别本质区别是什么?请各举一例说明. 答:计算机图形学是研究根据给定的描述,用计算机 ...

  9. 用计算机画中点和角平分线,计算机图形学作业(中点法画直线和八分画圆法)

    1.中点法画直线: void MidBresenhamLine(CDC *pDC,int x0,int y0,int x1,int y1,int color){ int dx,dy,d,up,down ...

最新文章

  1. python元组元素的提取比_Python 元组数据类型(tuple)详解 [访问元组元素][修改元组元素][删除元组][学习 Python 必备基础知识][看此一篇就够了]...
  2. 2006年上半年 网络工程师 上下午试卷【附带答案】
  3. 《CCNA安全640-554认证考试指南》——6.4节复习所有考试要点
  4. IT人员加班处于恐惧之中
  5. 10个JavaScript代码片段,帮助你成为更好的开发者
  6. 数据建模_漫谈数据仓库之维度建模
  7. 机器学习基础(十七)—— boosting
  8. python合并表格用什么库_python合并多个excel表格数据库-python实现excel合并
  9. ai人工智能培训讲师计算机视觉讲师叶梓:计算机视觉领域的自监督学习模型——MAE-9
  10. 招行权证割肉比赛开演 10个交易日后寿终正寝
  11. 华为CANN训练营笔记——应用开发全流程 [5](with 代码版)
  12. 和风天气开发平台使用
  13. vue使用keep-alive缓存页面 回到滚动位置
  14. [日推荐]『口红IN』女票生气了怎么哄?这里有妙招!
  15. 还没量产的FF上市!贾跃亭:必须回国!这次,谁为他梦想“窒息”
  16. UVa 1617 笔记本(Laptop)
  17. python下载电影_python下载电影
  18. window遇到 stopcode: 0xc000021a 无法启动的问题解决
  19. 系统重装后MySQL的数据恢复
  20. 2-物流和快递行业ABC模型

热门文章

  1. 中邮集团“天机网”剑指淘宝
  2. strlen函数、length函数、size函数的区别
  3. 自己在framework模块遇到问题分析及修改
  4. Java编程——调色板
  5. 前列腺癌的发病率统计及诊断方法
  6. STM32单片机入门学习笔记——定时器TIM第三部分
  7. 收支科目不为零_急产品销售收入是只哪个科目,工业企业和商业企业的做帐是只是科目不 爱问知识人...
  8. 攻略世界树 (网络流)
  9. Java初级必做习题2
  10. _, preds = torch.max(outputs.data, 1)