计算机图形学--多边形画圆算法

本文介绍了如何使用正多边形画圆算法来逼近圆形。通过计算正n边形每个顶点的坐标,结合角度和坐标变换,随着边数增加,图形将更接近圆形。提供的代码示例展示了用C++实现这一算法的过程,利用BresenhamLine绘制直线完成多边形的闭合。
摘要由CSDN通过智能技术生成

        多边形画圆算法和正多边形生成算法的原理是类似的,因此本文也可以作为正多边形绘制的参考。

算法思路

        所谓的多边形画圆算法就是利用圆内接正多边形去逼近圆,当正多边形的边数足够多的时候,图形看起来就会比较圆。那么我们的实现方案就可以假设我们利用正n边形去逼近圆,计算其每一顶点的坐标位置,然后将这个正多边形绘制出来就可以得到“圆形”对象了。

        下面我们在假设正n变形逼近圆且圆心位于原点的情况进行顶点坐标推算的分析。对于圆心不再原点的对象进行简单的坐标变换即可。

        由于是正n边形,那么将该图形各顶点和中心位置连接形成的夹角均为\frac{2}{n}\pi,我们将这个弧度值记为θ。假设我们现在已知的圆上一点为(xpos, ypos), 它和x轴正方向之间的夹角为α,那么,有如下结果成立:\\xpos=r*cos\alpha\\ypos=r*sin\alpha,此时我们对下一个绘制点进行推算,那么就有:
\\x`=r*cos\left ( \alpha +\theta \right )=r*cos\alpha cos\theta -r*sin\alpha sin\theta =xpos*cos\theta -ypos*sin\theta\\y`=r*sin\left ( \alpha +\theta\right )=r*sin \alpha cos\theta+r*cos \alpha sin\theta=ypos*cos\theta+xpos*sin\theta
按照上述方式进行依次各顶点的计算,然后对各边进行绘制即可。

代码实现

void PolygonCircle(const vector<pair<int, int>> center, int radius, unsigned long color)
{
	CClientDC dc(mView); //如果hDC为0时使用
//实测多边形边数等于24时,画出来的图形已经非常接近圆了
	int n = 24;
	double cosn = cos(2.0*PI/n);
	double sinn = sin(2.0*PI/n);
	double xbase = 0, ybase = radius;
	int cx = center.first, cy = center.second;
	std::vector<pair<int, int>>> v;
	v.push_back(pair<int, int>(xbase + cx, ybase + cy));
	for (int i = 1; i < n; i++)
	{
		double tmp = xbase;
		xbase = tmp * cosn - ybase * sinn;
		ybase = tmp * sinn + ybase * cosn;
		v.push_back(pair<int, int>(xbase + cx, ybase + cy));
	}
	for (int i = 1; i <= n; i++) BresenhamLine(v[i % n], v[i - 1], color);
//BresenhamLine是在之前的博客中实现过的直线绘制算法,需要可以到专栏中去找
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学课程设计任务书[1] ———————————————————————————————— 作者: ———————————————————————————————— 日期: 南京工程学院 课程设计任务书                课  程 名  称  计算机图形学  院(系、部、中心) 计算机工程学院 专       业  计算机科学与技术 班       级 多媒体091  起  止   日 期 2011.12.19—12.25 指   导 教 师 丁宇辰                     " 1.课程设计应达到的目的 " "《计算机图形学》是一门理论与实践并重的课程,既要注重理解基本知识,也要注重培" "养基本技能。相应的计算机图形学课程设计对帮助学生全面牢固地掌握课堂教学内" "容、培养学生编程能力、提高学生全面素质具有很重要的意义。通过本课程的实践" "环节,使学生具有使用计算机图形学的基本算法开发简单应用程序的能力,并理解 " "软件系统开发的基本流程。 " "2.课程设计题目及要求 " "选择实现以下任务中的1~2个。 " "1、《多边形填充》(直线、、椭利用算法自编函数进行调用) " "具体要求: " "(1)能利用交互手段实现多边形或椭的绘制,并能实现填充; " "(2)自己编写划线函数; " "(3)自己编写填充函数; " "2、《二维图形裁剪》 " "具体要求: " "设计程序实现二维图形的裁剪; " "设计坐标系,画出二维图形; " "用中点或区域代码的方实现裁剪。 " "3、《图形变换》 " "具体要求: " "绘制出图形; " "实现图形的平移、旋转、缩放、错切等变换。 " "4、《绘制曲线》 " "具体要求: " "编写一个交互绘制Bezier或B样条曲线的程序; " "给出控制点就能绘制曲线; " "自己编写函数实现。 " "5、《可见面判断》 " "具体要求: " "绘制多面体图形; " "输出各面的可见性; " "做任意角度旋转变换,再判断各面的可见性 " "6、《颜色渐变三角形》 " "具体要求: " "绘制三角形; " "实现颜色的各种变换; " "实现填充色的渐变(从一个方向开始颜色由浅入深) " "7、《绘制三维五角星》 " "具体要求: " "编写一个绘制三维五角星的程序; " "实现填充,中心点最红,渐变到外围颜色变浅; " "8. 《观察和投影变换》 " "具体要求: " "设计一立体图形; " "输出其三视图; " "定义观察窗口,输出其三维线架图。 " "9.《设计一个动画程序》 " "具体要求: " "设计一个图形,完成该图形的动画演示; " "给出使用说明。 " "10.《用OpenGL绘制一三维图形》 " "具体要求: " "绘制三维图形; " "添加纹理。 " "11.《设计一个分形树》 " "具体要求: " "写出算法分析步骤; " "实现该算法; " "改变输入,观察分形图形。 " "12.《设计B样条曲面》 " "具体要求: " "对B样条曲面的数学表达式进行分析,写出算法步骤; " "实现该算法; " "改变输入,观察曲面图形。 " "13.《自造字库,设计一个特大型汉字》 " "具体要求: " "构造汉字字库; " "实现汉字的输出; " "对汉字进行填充及各种变换。 " "14.在屏幕上使用鼠标左键绘制数量大于4的任意顶点形成控制多边形,单机鼠标 " "右键绘制三次B样条曲线,同时在控制多边形的每一个特征三角形内用虚线显示三 " "次B样条曲线的几何生成原理。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "15.给定"树叶"轮廓的控制点,要求使用B样条曲线的特殊构造技巧,使用B样条绘制" "所构造的树叶。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "16.样条曲线和正弦曲线同时绘制,进行效果对比,绘制的长度不少于两个周期。" "具体要求: " "分析原理,写出算法; " "实现该算法; " "17.自定义一个三维图形,可参考下图,绘出其三视图。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "18.模仿Windows画图的界面,编写一个交互画图的小系统程序。 " "具体要求: " "写出实现方; " "实现该方; " "19.设计一个多边形,利用活化边表算法进行填充。 " "具体要求: " "写出实现方; " "实现该方; " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "3.课程设计任务及工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值