计算机图形学圆弧生成算法具体程序实现
数学与软件科学学院 实验报告
学期: 2010 至 2011 第 一 学期 2010年 10月 5日
课程名称: 计算机图形学 专业:信息与计算科学2007级5班
实验编号: 03 实验项目: 圆弧生成算法
指导教师: 庞朝阳 学号实验成绩:
一、实验目的及要求
1:圆弧上的八个对称点的算法描述;
2:了解圆弧的的基本绘制算法;
3:绘制椭圆;
二.基本思想
1:圆弧被定义为到给定中心位置(x0,y0)距离为r的点集,圆心为与原点的圆有四条对称轴:x=0, y=0, x=y, x=-y 。已知圆弧上一点(x ,y),则可以的到关于四条对称轴的其他7个点(八对称性),因此只需要扫描八分之一的圆弧就可以求的整个圆弧的所有点。
三:首先来了解一下圆弧上的八个对称点的算法描述(以中心在原点,半径为整数R的圆为例)。
Void circlepoints(int x, int y ,int color)
{
Setpixel(x,y,color); setpixel(y, x,color);
Setpixel(-x,y,color); setpixel(y,-x,color);
Setpixel(x,-y,color); setpixel(-y,x,color);
Setpixel(-x,-y,color);setpixel(-y,-x,color);
}
四:八分之一圆弧的扫描变换的实现。
算法根据圆的基本方,沿X轴从0到/2R,以单位步长计算
对应的y值来获得圆周上每点的位置:y=,
缺点:算法每一步均包含大量的复杂计算(浮点乘)且所绘制的像素间隔不一致
解决方法:使用极坐标r和来计算圆弧上的点
∈(0,)
该算法使用了三角函数和浮点运算,运算速度依然很慢。
五:中点画圆法(以从(0,R)到(R/, R/)的1/8圆为例)
基本原理
假定当前已确定了圆弧上的一个个像素点P(x,y),则下一像素点只会是右方的P(x,y)或右下方的P(x,y)如图
构造函数F(x,y)=x+y-R,对于圆上的点有F(x,y)=0;对于圆外点有F(x,y)>0,对于圆内点有F(x,y)<0
设M为P、P的中点,即M(x,y).则当F(M)<0时,中点M在圆内,即P离圆弧较近,则取点P为F的下一像素。
F(M)>0时, P离圆弧较近,取P为F的下一像素点
当 F(M)=0时,约定取P。
根据以上原理,构造判别式:
d=F(M)= F(x,y)=(x)+( y)-R
若d<0,则取P为下一像素点,且再下一像素点的判别式为
d=F(M)= F(x,y)=(x)+( y)-R
= d+2x+3
若 d0 则取p作为下一像素点,且再下一像素点的判别式为
d= F(x,y)=(x)+( y)-R
= d+2(x-y)+5
取第一个像素点为(0.R)则判断式d的初始值为:
d=F=1.25-R
为避免浮点运算,令e=d-0.25
此时初始化运算d=1.25-R对应于e=1-R
判别式d<0对应于e
2.代码实现及结果:
#include
#include"stdafx.h"
using namespace std;
class Yuan
{
public:
int x;
int y;
int r;
int color;
public:
void MidpointCircle(int r,int color,CDC *pDC);
void CirclePoints(int x,int y,int color,CDC *pDC);
void Chu(int x,int y);
};
void Yuan::Chu(int x,int y)
{
this->x=x;
this->y=y;
}
void Yuan::CirclePoints(int x,int y,int color,CDC *pDC)
{
pDC->SetPixel(x+200,y+200,color);
pDC->SetPixel(y+200,x+200,color);
pDC->SetPixel(-x+200,y+200,color);
pDC->SetPixel(y+200,-x+200,color);
pDC->SetPixel(x+200,-y+200,color);
pDC->SetPixel(-y+200,x+200,color);