码迷,mamicode.com
首页 > 编程语言 > 详细

中点画圆算法

时间:2016-05-25 20:21:49      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:

如同光栅画线算法,每步都以间隔单位取样并确定离指定圆最近的像素位置。为了减少计算量,可以将圆八分,根据Bresenham画线算法。我们首先给出点位置函数:

    技术分享

即可得知:(1)技术分享, 技术分享位于圆边界内;(2)技术分享技术分享位于圆边界上;(3)技术分享, 技术分享位于圆边界外。

第一象限中,假设在技术分享绘制了像素点,下一步需要确定绘制的位置是技术分享,还是技术分享更接近圆。

则决策参数的圆函数方程在这两个像素的中点求值得到,

    技术分享

技术分享

    技术分享

    技术分享

其中技术分享技术分享还是技术分享,取决于技术分享的符号。

算法过程:

1.输入圆半径技术分享和圆心技术分享,并得到圆周上的第一个点:

    技术分享

2.计算决策参数的初始值:

    技术分享

3.在每个技术分享位置,从技术分享开始,完成下列测试:假如技术分享,圆心在技术分享的圆的下一个点为技术分享,并且

    技术分享

否则,圆的下一个点是技术分享,并且

    技术分享

其中技术分享技术分享

4.确定在其他七个八分圆中的对称点。

5.将每个计算出的像素位置技术分享移动到圆心在技术分享的圆路径上,并画坐标值:

     技术分享

6.重复步骤3到步骤5,直至技术分享

 1 class ScreenPt {
 2 private:
 3     GLint x, y;
 4 
 5 public:
 6     ScreenPt() {
 7         x = y = 0;
 8     }
 9     void setCoords(GLint xCoordValue, GLint yCoordValue) {
10         x = xCoordValue;
11         y = yCoordValue;
12     }
13     GLint getx() const {
14         return x;
15     }
16     GLint gety() const {
17         return y;
18     }
19     void incrementx() {
20         ++x;
21     }
22     void decrementy() {
23         --y;
24     }
25 };
26 
27 void setPixel(GLint xCoord, GLint yCoord)
28 {
29     glBegin(GL_POINTS);
30     glVertex2i(xCoord, yCoord);
31     glEnd();
32 }
33 
34 void circlePlotPoints(GLint xc, GLint yc, ScreenPt circPt)
35 {
36     setPixel(xc + circPt.getx(), yc + circPt.gety());
37     setPixel(xc - circPt.getx(), yc + circPt.gety());
38     setPixel(xc + circPt.getx(), yc - circPt.gety());
39     setPixel(xc - circPt.getx(), yc - circPt.gety());
40     setPixel(xc + circPt.gety(), yc + circPt.getx());
41     setPixel(xc - circPt.gety(), yc + circPt.getx());
42     setPixel(xc + circPt.gety(), yc - circPt.getx());
43     setPixel(xc - circPt.gety(), yc - circPt.getx());
44 }
45 
46 void circleMidpoint(GLint xc, GLint yc, GLint radius)
47 {
48     ScreenPt circPt;
49 
50     GLint p = 1 - radius;   //Initial value for    midpoint parameter
51 
52     circPt.setCoords(0, radius);  //Set coords for top point of circle.
53     // Plot the initial point in each circle quadrant
54     circlePlotPoints(xc, yc, circPt);
55     // Calculate next point and polt in each octant
56     while (circPt.getx() < circPt.gety()) {
57         circPt.incrementx();
58         if (p < 0) {
59             p += 2 * circPt.getx() + 1;
60         }
61         else {
62             circPt.decrementy();
63             p += 2 * (circPt.getx() - circPt.gety()) + 1;
64         }
65         circlePlotPoints(xc, yc, circPt);
66     }
67 }

 

中点画圆算法

标签:

原文地址:http://www.cnblogs.com/clairvoyant/p/5528067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!