画图板-- 中点算法画圆

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

      圆心位于原点的圆有四条对称轴x=0,y=0,x=yx=-y,从而圆上一点(x,y),可得到其关于四条对称轴的七个对称点,这称为八对称性,下面的函数就用来显示(x,y)及其七个对称点.

200772802.jpg

None.gifvoid CirclePoints(int x,int y,long color,CDC *pDC)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gif           
//第1象限
InBlock.gif

InBlock.gif           pDC
->SetPixel(x,y,color);
InBlock.gif
InBlock.gif           pDC
->SetPixel(y,x,color);
InBlock.gif
InBlock.gif           
//第2象限
InBlock.gif

InBlock.gif           pDC
->SetPixel(-x,y,color);
InBlock.gif
InBlock.gif           pDC
->SetPixel(-y,x,color);
InBlock.gif
InBlock.gif           
//第3象限
InBlock.gif

InBlock.gif           pDC
->SetPixel(-y,-x,color);
InBlock.gif
InBlock.gif           pDC
->SetPixel(-x,-y,color);
InBlock.gif
InBlock.gif           
//第4象限
InBlock.gif

InBlock.gif           pDC
->SetPixel(x,-y,color);
InBlock.gif
InBlock.gif           pDC
->SetPixel(y,-x,color);
InBlock.gif
ExpandedBlockEnd.gif}

None.gif


中点画圆算法就是每部单位间隔取样并且计算离圆最近的位置。在继续之前,我这里补充一个关于圆对称性的知识点,通过在圆中计算考虑使用对称性计算开销可以减小到原来的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 = y1/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重复执行35的步骤,否则结束该算法

程序如下:

None.gifvoid Circle::Draw(CDC *pDC)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//中点算法画圆
InBlock.gif
    int x,y;
InBlock.gif    
double p;
InBlock.gif    pDC
->SetViewportOrg(pMid);
InBlock.gif    x
=0;
InBlock.gif    y
=radis;
InBlock.gif    p
=1.25-radis;
InBlock.gif    
while(x<=y+1)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        CirclePoints(x,y,m_lPenColor,pDC);
InBlock.gif        x
++;
InBlock.gif        
if(p>=0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            y
--;
InBlock.gif            p
+=2.0*(x-y)+5;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
InBlock.gif            p
+=2*x+3;
ExpandedSubBlockEnd.gif    }

InBlock.gif    pDC
->SetViewportOrg(0,0);
ExpandedBlockEnd.gif}

None.gif

200772801.jpg

源代码下载

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 内核如何描述一个进程?

哈喽&#xff0c;我是吴同学&#xff0c;继续记录我的学习心得。一、关于写文章许多知识&#xff0c;书上或者网络上都有&#xff0c;就算这两个地方都没有&#xff0c;代码里也会有答案。但有时恰恰是 资料太多&#xff0c;反而让人难以检索出有用的信息。面对同样的资料&…

供应商关系管理SRM为企业的节流增贡献

在供应链下游的需求链上&#xff0c;企业为了增加市场份额、提高销售收入&#xff0c;更为重视面向客户的管理和信息化管理方面的投入&#xff0c;纷纷引入客户关系管理CRM的管理理念和信息化系统&#xff0c;在“客户第一”的经营策略下借助IT技术的手段来提高对客户的服务水平…

UART/I2C/SPI/1-wire四大通信接口的神解释

1、 裘千丈轻功水上漂之UART射雕英雄传中的裘千丈说&#xff0c;UART就是我的轻功水上漂过河。想从河上过&#xff08;通信&#xff09;&#xff0c;提前布暗桩&#xff0c;行走时步伐按桩距固定&#xff08;波特率提前确定&#xff09;&#xff0c;步幅太大或太小都会落水。为…

last_kmsg和ram console

相关文章Android 7.1使用脚本保存LOGCAT和KMSG日志到文件首先&#xff0c;在kernel里面通过printk吐log的时候会是下面的一个过程&#xff1a;printk会将信息格式化到kernel log buffer里面去。然后将这些格式化信息送到console去&#xff0c;在我们的系统里面有两个console&am…

字符串类

1.String类 常用方法&#xff1a; 参考&#xff1a;http://wenku.baidu.com/link?urltz-3Dpwj-JSJQdG6vSo0J1L1G9oJS4eQJjYgogieIzgjdNNLmj-U9EpWhOnVthz4egAKv0SNmLkqzNz2WsiZ2EmPGMu2UXhB6yy-E4yvMQ3 NB&#xff1a; 这里的”s1s2“是地址相等,而是s1.equals(s2)是内容相等…

github网页

GitHub主页创建仓库想必大家都有自己的Github账号吧&#xff0c;没有的可以到GitHub官网注册账号&#xff0c;注册完后&#xff0c;我们来下一步&#xff0c;在我们的GitHub上面右上角的New repository来创建一个仓库。 仓库名必须遵守相应格式&#xff1a;your_username.githu…

有用的Copy-On-write,写时复制

写时复制和写时拷贝是一个意思写时复制是一种策略&#xff0c;并不是Linux独有的&#xff0c;如果你正在设计某个系统架构&#xff0c;也可以参考这种思想。写时复制的英文解释如下Copy-on-write (sometimes referred to as "COW") is an optimization strategy used…

雷军:如果程序人生的话,这条路太漫长

这篇文章是在雷总个人博客看到的&#xff0c;里面聊到了他作为程序员的一些经历、初衷以及思考。写的不错&#xff0c;便转来给大家看看。-- 如果程序人生的话&#xff0c;这条路太漫长我并非天生喜欢写程序&#xff0c;上高中时也没有想过程序员的生活。我学电脑非常偶然&…

51单片机——硬件基础

单片机——硬件基础知识 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、单片机内部资源 STC89C52&#xff1a;8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 &#xff08;1&#xff09;Flash&#xff08;硬盘&#xff09;——程…

马上工作了,想问下要注意哪些问题?

这是一位读者在知识星球提问的&#xff0c;涉及的内容很多&#xff0c;但是这些问题&#xff0c;我觉得很多人都需要注意&#xff0c;分享出来让大家看&#xff0c;也希望留言说下自己的看法。1一、 offer情况 1. 已签三方 2. 公司是国内靠前的芯片原厂&#xff0c;深圳&#x…

CSS绘图

1. 自适应的椭圆 背景知识&#xff1a;border-radius属性的基本用法 使用border-radius制作一个圆很简单&#xff0c;只要给任何正方形元素设置固定宽高及一半长度以上的border-radius&#xff0c;就可以得到圆形 1234background: #fb3;width: 200px;height: 200px;border-radi…

51单片机——定时器

单片机——定时器 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、定时器和计数器 时钟周期&#xff1a;单片机时序中的最小单位&#xff0c;集体计算的放法就是时钟源分之一 机器周期&#xff1a;单片机完成一个操作的最短时间&#xff0c;12个时钟…

当年要是这样搞,我的C++也不至于这样!

C一直被称作永不过时的开发语言&#xff0c;比如游戏、服务器、人工智能等领域都必须用到C&#xff01;虽然网上有很多教程和资料&#xff0c;但仍有很多人说C难学&#xff0c;究其原因是没有找到正确的学习方法&#xff01;GoogleTest框架一直广泛应用于C/C项目测试 &#xff…

ABP之创建实体

ABP框架是一个非常庞大的框架&#xff0c;里面的东西有很多&#xff0c;那么如果我需要使用ABP进行项目的开发&#xff0c;具体的使用流程是怎样的呢&#xff1f;接下来将以一个简单的电影票管理“系统”为例子具体的实现一下。 一. 实体的创建 实体是属于领域层的&#xff0c;…

三亚野生植物园

近来朋友外出旅游颇多,大家分享快乐和美景的同时&#xff0c;文字往来也丰富。我的三亚行也该落幕了&#xff0c;休整得差不多了&#xff0c;重整行装&#xff0c;再踏旅途……诸君逍遥游芙蓉叶残桂满岩&#xff0c;粤女梦起游天姥。白塔青湖鸣沙丘&#xff0c;渡海峨眉牵白鹿。…

10张图22段代码,万字长文带你搞懂虚拟内存模型和malloc内部原理

成功是急不来的。不计较眼前得失&#xff0c;将注意力真正着眼于正在做的事情本身&#xff0c;持续付出努力&#xff0c;才能一步步向前迈进&#xff0c;逐渐达到理想的目标。不着急&#xff0c;才能从容不迫&#xff0c;结果自会水到渠成。大家好&#xff0c;我是程序喵&#…

51单片机——中断

单片机——中断 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、中断&#xff1a;放下手中的事情去处理另一种事情。 2、定时器中断 定时器是单片机模块的一个资源&#xff0c;确确实实存在的一个模块&#xff0c;中断是单片机的一种运行机制。不是一…

转!!ftp的主动模式(port)与被动模式(PASV)

转自 http://www.phpweblog.net/killjin/archive/2008/01/06/2653.htmlftp中主动模式(port)与被动模式(PASV)目录 开场白 基础 主动FTP 主动FTP的例子 被动FTP 被动FTP的例子 总结 参考资料 附录 1: 配置常见FTP服务器 开场白 处理防火墙和其他网络连接问题时最常见的…

深入MTK平台bootloader启动分析笔记

bootloader到kernel启动总逻辑流程图ARM架构中&#xff0c;EL0/EL1是必须实现&#xff0c;EL2/EL3是选配&#xff0c;ELx跟层级对应关系&#xff1a;EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor&#xff08;虚拟化&#xff09;EL3 -- ARM trust firmware 、pre-loade…

Android反翻译详解

这段时间在学Android应用开发&#xff0c;在想既然是用Java开发的应该很好反编译从而得到源代码吧&#xff0c;google了一下&#xff0c;确实很简单&#xff0c;以下是我的实践过程。 在此郑重声明&#xff0c;贴出来的目的不是为了去破解人家的软件&#xff0c;完全是一种学习…