画图板-- 中点算法画圆

简介:
 为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。
      圆心位于原点的圆有四条对称轴x=0,y=0,x=y和x=-y,从而圆上一点(x,y),可得到其关于四条对称轴的七个对称点,这称为八对称性,下面的函数就用来显示(x,y)及其七个对称点.
200772802.jpg
void CirclePoints(int x,int y,long color,CDC *pDC)

{

           //第1象限

           pDC->SetPixel(x,y,color);

           pDC->SetPixel(y,x,color);

           //第2象限

           pDC->SetPixel(-x,y,color);

           pDC->SetPixel(-y,x,color);

           //第3象限

           pDC->SetPixel(-y,-x,color);

           pDC->SetPixel(-x,-y,color);

           //第4象限

           pDC->SetPixel(x,-y,color);

           pDC->SetPixel(y,-x,color);

}


中点画圆算法就是每部单位间隔取样并且计算离圆最近的位置。在继续之前,我这里补充一个关于圆对称性的知识点,通过在圆中计算考虑使用对称性计算开销可以减小到原来的1/8。对称性质原理:
(1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;
(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置;
(3)圆是满足y = x or y = -x轴对称的,这样只需要计算原来的1/2点的位置;
通过上面三个性质分析得知,对于元的计算只需要分析其中1/8的点即可。
例如:分析出来目标点(x,y)必然存在(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)的另外7个点。
关于中心画圆算法,通过计算x = 0到 x = y的1/8圆的范围,然后通过对称原理得到其他7/8个点的信息。
这里和Bresenham算法有很多相似之处,同样有一个决定下一个位置的关键值P来做权衡处理。
在中点画圆算法中,通过平移的方法将假设圆心在坐标原点,然后计算,最后再平移到真实原心位置。
 
如果我们构造函数 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
200772803.jpg
中点画圆算法内容:
1,输入圆心位置和圆的半径,得到圆周上的第一个点Point1;
(假设起始点为坐标原点,后面将通过坐标平移来处理非圆心在圆点)
2,计算决策关键参数的初始值,P = 5/4 - r;
3,在每个Xn的位置,从n = 0开始,更具决策值P来判断:
    如果P<0,下一个点的位置为(Xn+1,Yn);
       并且执行P = P + 2*x+3;
    如果P>=0,下一个点的位置为(Xn+1,Yn-1);
       并且执行P = P + 2.0*(x-y)+5;
4,通过对称原理计算其他7个对称相关点;
5,移动坐标到圆心点(x1,y1)
      X = X + x1;
      Y = Y + y1;
6,如果X<Y重复执行3到5的步骤,否则结束该算法
程序如下:
void Circle::Draw(CDC *pDC)
{//中点算法画圆
    int x,y;
    double p;
    pDC->SetViewportOrg(pMid);
    x=0;
    y=radis;
    p=1.25-radis;
    while(x<=y+1)
    {
        CirclePoints(x,y,m_lPenColor,pDC);
        x++;
        if(p>=0)
        {
            y--;
            p+=2.0*(x-y)+5;
        }
        else
            p+=2*x+3;
    }
    pDC->SetViewportOrg(0,0);
}

200772801.jpg

源代码下载

PS:程序中还有很多bug,画圆的时候鼠标拖拽出的橡胶线和圆的实际半径大小不一致,画直线的两种算法在重绘的时候还有问题,郁闷呀,虚心求教。。。。

本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/28/834407.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
53 0
|
算法 图形学
计算机图形学 之 中点画线算法
计算机图形学 之 中点画线算法
281 1
|
Rust 算法 安全
【算法】1828. 统计一个圆中点的数目(java / c / c++ / python / go / rust)
给你一个数组 points ,其中 points[i] = [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries ,其中 queries[j] = [xj, yj, rj] ,表示一个圆心在 (xj, yj) 且半径为 rj 的圆。 对于每一个查询 queries[j] ,计算在第 j 个圆 内 点的数目。如果一个点在圆的 边界上 ,我们同样认为它在圆 内 。 请你返回一个数组 answer ,其中 answer[j]是第 j 个查询的答案。
【算法】1828. 统计一个圆中点的数目(java / c / c++ / python / go / rust)
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
112 80
|
1天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
23天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
29天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
9天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
16天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
25天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
106 15

热门文章

最新文章