OpenGL中使用中点画圆法画圆
在不使用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,说明圆弧在P1和M之间,取P1点为下一象素。
且下一象素的F(xp+2,yp-0.5)=F(xp+1,yp-0.5)+2xp+3,前后两个中点的函数值带入后就差2xp+3,这就是if后第一个判别式
如果F(xm,ym)≥0,说明圆弧在P2和M之间,则取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中使用中点画圆法画圆相关推荐
- WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
- 在Unity3D中利用描点法画圆
直接法: 调用函数即可 //N为描点的个数,CirclePoint圆心距离,radius半径, mycolor为颜色 void MyDrawCircles(int N, Vector3 CircleP ...
- 使用ObjectARX在AutoCAD2002中画圆
AutoCAD中有三种方法可以画圆:"圆心.半径"法画圆."两点"法画圆."三点"法画圆.下面采用这三种方法,使用ObjectARX在Aut ...
- 中点圆c语言程序,[图形学] 画圆(基于中点算法)
图形学中的中点算法画圆,以下是该算法的 C 语言实现: /// // 程序名称:基于中点算法画圆 // 编译环境:Visual C++ 6.0 / 2010,EasyX 2011惊蛰版 // 作 者: ...
- python3画圆、直线_Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 【OpenGL C++】画一个空心汉字和一个圆,并填充汉字(中点画线法,中点画圆法,种子填充法)
内容:画一个空心汉字和一个圆 设计一个画任意直线和圆的算法,可选所学的任一图形扫描转换算法(中点或bresenham算法),不能使用任何画线/画圆的API: 使用画线算法实现空心汉字的绘制,汉字必须为 ...
- 计算机图形学之画圆(中点画圆法、Bresenham画圆法)
参考学习了一些前辈的代码,总结了以下这个,感谢前人栽树,同时欢迎交流. 整个画圆利用了圆的八对称性,故只需画出八分之一圆就可利用对称性就可以画出整个圆. 专门写了一个函数来画圆的点,其中(x0,y0) ...
- Bresenham画圆 正负画圆法 中点画圆法
这里做些代码的归纳 具体关于三种算法的区别,百度找找 其中的putpixel()函数为easyx库里面的绘点函数 // 使用 Bresenham 画圆法 void Circle_Bresenham(i ...
最新文章
- 恭喜!中科大少年班放榜:2020年全国录取48人
- 讨论工字型接收线圈天线不同匝数对于低频定位信号检测影响:150kHz导航信号
- 2018我的Java高级工程师面试总结
- Ubuntu访问Windows共享文件夹
- beta:scrum5
- 很多人喜欢露脚踝你觉得时尚吗?
- 醉了!吃着火锅哼着歌,男朋友强行给我科普什么是补码!
- 计蒜客 2019 蓝桥杯省赛 A 组模拟赛(一) B:炮台实验
- cartographer探秘第四章之代码解析(三) --- scan match
- spring security执行原理流程
- linux 下令chmod 755的意思
- 常见线缆接口类型总结
- faiss-3: 基础模块
- LT8911EXB MIPI DSI CSI转EDP
- 联想Z5:0%电量还能通话半小时,网友质疑是造假?
- Oracle 11g RAC 修改服务器各类ip地址【转载】
- qrious二维码生成插件
- /proc/sysrq-trigger
- 响应式(自适应屏幕)
- 基于JSP的在线学习网站 的设计与实现