中点画线法画圆

中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法。画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆。

类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处:

(1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3;

(2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5;

(3) d0=1-r,即点(0,r)代入圆中的值。

根据上述条件可以得出中点画圆代码(编程环境:codeblacks+EGE库):

 1 #include <iostream>
 2 #include <graphics.h>
 3 using namespace std;
 4 //进行对称点打亮
 5 void wholeColor(int xc,int yc,int x,int y,int color)
 6 {
 7        putpixel(xc+x,yc+y,color);putpixel(xc+y,yc+x,color);
 8        putpixel(xc-x,yc+y,color);putpixel(xc-y,yc+x,color);
 9        putpixel(xc+x,yc-y,color);putpixel(xc+y,yc-x,color);
10        putpixel(xc-x,yc-y,color);putpixel(xc-y,yc-x,color);
11 }
12 //画圆
13 void circle(int xc,int yc,int r,int color)
14 {
15     int x=0,y=r,d=1-r;
16     wholeColor(xc,yc,x,y,color);
17     while(x<=y)
18     {
19         if(d<0)        //走正右方
20         {
21             d+=2*x+3;
22             x++;
23         }else{        //走右下方
24
25         d+=2*(x-y)+5;x++;y--;
26         }
27        wholeColor(xc,yc,x,y,color);
28     }
29 }
30
31 int main()
32 {
33     initgraph(640,480);      //图形库初始化
34     circle(200,300,56,RED);  //中点坐标和半径,颜色
35     getch();                 //等待用户操作
36     closegraph();            //关闭图形
37     return 0;
38 }
时间: 2024-10-14 13:13:09

中点画线法画圆的相关文章

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线

计算机图形学DDA画线法+中点画线法+Bresenham画线法

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法

#include<iostream>#include<graphics.h>  // 这样引用 EasyX 图形库#include<conio.h>#include<time.h>#include<math.h>#include<stdlib.h>using namespace std; //Bresenham画线void Bresenham_line(int x0,int y0,int x1,int y1){ int x,y,dx,

扫描转换算法——DDA、中点画线画圆、椭圆

我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示. 数值微分法(DDA):以下PPT截图来自北京化工大学李辉老师 代码实现: import matplotlib.pyplot as plt import matplotlib.patches as patches from pylab import * def init(ax): #将主标签设置为1的倍数 majorLocator = MultipleLocator(1); #设置主刻度标签

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

简单谈谈自己对htm与css中画圆的理解。

近几天,在利用css编辑中,发现不少边框图像要求是矩形圆角或者直接画一个圆的例子,下面和大家一起分享下对画圆的看法. 在这次的分享中,我侧重给大家看一些例子来更好的理解, 我们都明白,画圆时要用到“border-radius:”,而且在每次画圆时,我们都应该先设定一个width和height. 那么我们可以这样理解, 我们的圆是在一个矩形(正方形)中进行裁剪的,而border-radius就是我们要裁剪的尺寸. 给大家一些图片,更好的去理解. 首先,我们设定一个width为100px,高度为10

中点画圆算法

[中点画圆算法] 此算是一种圆的光栅化算法.定义以下函数: 通过上述函数,可以得到点(x,y)与半径为r的圆的关系: 已知点(Xk,Yk),我们需要知道(Xk+1,Yk).(Xk+1,Yk-1)哪一个更接近圆.决策方程如下: 如果Pk小于0,那么中点位于圆内,扫描线Yk上的像素更接近于圆.否则,中点位于圆外,应该选择Yk - 1. 参考:<计算机图形学>3.9.2 中点画圆算法 中点画圆算法

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,