在不使用OpenGL中的画圆函数的情况下,使用中点画圆法画出的圆如下图:

具体思路:

1、使用中点画圆法编写能绘制1/8个圆的函数;

2、使用对称的方法,改变函数参数,画出圆的其余部分。

具体函数结构可以是这样子滴:

void MidCircle(int cx,int cy,int r)  //cx,cy为输入的圆心坐标
{
double x=0;  //相对于输入圆心cx的横坐标
double y=0;  //相对于输入圆心cy的纵坐标

float f;
x=0;y=r; f=1.25-r;
while(x<=y)
{
point(x+cx,y+cy); //对称画八分之一园
point(x+cx,cy-y);
point(cx-x,cy+y);
point(cx-x,cy-y);
point(y+cy,x+cx); 
point(cy-y,x+cx);
point(cy+y,cx-x);
point(cy-y,cx-x);

if(f<0) f+=0.2*x+0.03;
else { f+=0.2*(x-y)+0.05; y=y-0.1;}
x=x+0.1;

}
};

算法的核心就是绿色部分,f是一个判断变量,判断下一个中点是否在园内,这个变量是怎么冒出来的呢?来回顾回顾下面的数学知识:

假设圆的方程为:x2+y2=r2

函数F(x,y)= x2+y2-r2,则

F(x,y)>0,对应圆外点

F(x,y) = 0,对应圆上点

F(x,y) < 0,对应圆内点

这里的f就是上面的F,那么,为什么在一开始f=1.25-r?

f=1.25-r 是上图M的坐标带入F函数后的值,即F(1,r-0.5)=1^2+(r-0.5)^2-r^2;展开即可,这是判别式的初始表达式,之后会根据中点落的位置发生变化。

中点画圆法的核心思想就是不断判断下一个中点是否在园内,若在,就向右画一个点,若不在,就向右下角画一个点。

那之后的if语句里f后面那一堆乱七八糟的式子是哪来的呢?

如果F(xm,ym)<0,说明圆弧在P1M之间,取P1点为下一象素。

且下一象素的F(xp+2,yp-0.5)=F(xp+1,yp-0.5)+2xp+3,前后两个中点的函数值带入后就差2xp+3,这就是if后第一个判别式

如果F(xm,ym)≥0,说明圆弧在P2M之间,则取P2为下一象素。

且下一象素的F(xp+2,yp-1.5)=F(xp+1,yp-0.5)+2(xp-yp)+5,同理,2(xp-yp)+5是if后第二个判别式。

在画完第一个点后,画后续的点将不断切换使用上述两个判别式,此时的判别式已经不再是最初的那个f=1.25-r 了,那只是一个初始判别式。

如此继续下去,可以画出1/8个圆。

示例程序中我取得点与点之间的步长是0.1(这与OpenGL的坐标分度有关系,不代表屏幕上存在半个像素的情况),所以判别式稍有不同,不过就是几个小数点的事,可以试试。

对称的方法就是在圆心的基础上不断改变偏移量,让每个象限的对称位置都画上点,就是整个圆。

OpenGL中使用中点画圆法画圆相关推荐

  1. WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...

  2. 在Unity3D中利用描点法画圆

    直接法: 调用函数即可 //N为描点的个数,CirclePoint圆心距离,radius半径, mycolor为颜色 void MyDrawCircles(int N, Vector3 CircleP ...

  3. 使用ObjectARX在AutoCAD2002中画圆

    AutoCAD中有三种方法可以画圆:"圆心.半径"法画圆."两点"法画圆."三点"法画圆.下面采用这三种方法,使用ObjectARX在Aut ...

  4. 中点圆c语言程序,[图形学] 画圆(基于中点算法)

    图形学中的中点算法画圆,以下是该算法的 C 语言实现: /// // 程序名称:基于中点算法画圆 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版 // 作 者: ...

  5. python3画圆、直线_Bresenham直线算法与画圆算法

    在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...

  6. 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  7. 【OpenGL C++】画一个空心汉字和一个圆,并填充汉字(中点画线法,中点画圆法,种子填充法)

    内容:画一个空心汉字和一个圆 设计一个画任意直线和圆的算法,可选所学的任一图形扫描转换算法(中点或bresenham算法),不能使用任何画线/画圆的API: 使用画线算法实现空心汉字的绘制,汉字必须为 ...

  8. 计算机图形学之画圆(中点画圆法、Bresenham画圆法)

    参考学习了一些前辈的代码,总结了以下这个,感谢前人栽树,同时欢迎交流. 整个画圆利用了圆的八对称性,故只需画出八分之一圆就可利用对称性就可以画出整个圆. 专门写了一个函数来画圆的点,其中(x0,y0) ...

  9. Bresenham画圆 正负画圆法 中点画圆法

    这里做些代码的归纳 具体关于三种算法的区别,百度找找 其中的putpixel()函数为easyx库里面的绘点函数 // 使用 Bresenham 画圆法 void Circle_Bresenham(i ...

最新文章

  1. 恭喜!中科大少年班放榜:2020年全国录取48人
  2. 讨论工字型接收线圈天线不同匝数对于低频定位信号检测影响:150kHz导航信号
  3. 2018我的Java高级工程师面试总结
  4. Ubuntu访问Windows共享文件夹
  5. beta:scrum5
  6. 很多人喜欢露脚踝你觉得时尚吗?
  7. 醉了!吃着火锅哼着歌,男朋友强行给我科普什么是补码!
  8. 计蒜客 2019 蓝桥杯省赛 A 组模拟赛(一) B:炮台实验
  9. cartographer探秘第四章之代码解析(三) --- scan match
  10. spring security执行原理流程
  11. linux 下令chmod 755的意思
  12. 常见线缆接口类型总结
  13. faiss-3: 基础模块
  14. LT8911EXB MIPI DSI CSI转EDP
  15. 联想Z5:0%电量还能通话半小时,网友质疑是造假?
  16. Oracle 11g RAC 修改服务器各类ip地址【转载】
  17. qrious二维码生成插件
  18. /proc/sysrq-trigger
  19. 响应式(自适应屏幕)
  20. 基于JSP的在线学习网站 的设计与实现

热门文章

  1. 饥荒:在制做mod之前
  2. 移动端 REM 适配
  3. 会声会影2020对比Vegas pro17,两款最新视频制作软件下载使用区别对比
  4. Excel在统计分析中的应用—第八章—假设检验-方差已知下总体均值的双侧检验
  5. html 转 pdf 乱码,前端如何将HTML 生成PDF并避免中文乱码的解决方法
  6. 大数据-phoenix
  7. 无聊的生活,无聊的世界
  8. P67、H67、H61、P55、H57、H55 区别
  9. SQLSERVER中的 CEILING函数和 FLOOR函数
  10. k8s笔记22--使用fluent-bit采集集群日志