计算机图形学圆弧生成算法具体程序实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
pDC->SetPixel(xc+x,yc+y,color);
pDC->SetPixel(xc+x,yc-y,color);
pDC->SetPixel(xc-x,yc+y,color);
pDC->SetPixel(xc-x,yc-y,color);
}
}
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);
若d <0,则取P为下一像素点,且再下一像素点的判别式为
d =F(M)= F(x ,y )=(x ) +( y ) -R
= d +2x +3
若 d 0 则取p作为下一像素点,且再下一像素点的判别式为
d = F(x ,y )=(x ) +( y ) -R
= d +2(x -y )+5
取第一个像素点为(0.R)则判断式d 的初始值为:
∈(0, )
该算法使用了三角函数和浮点运算,运算速度依然很慢。
五:中点画圆法(以从(0,R)到(R/ , R/ )的1/8圆为例)
1.基本原理
假定当前已确定了圆弧上的一个个像素点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
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);
针对上部分(k>-1),在x轴上取单位步长确定下一像素位置
针对下部分(k<-1),在y轴上取单位步长确定下一像素位置
由F(x,y)=b x +a y -a b 可以得到椭圆的斜率dy/dx=-2b x/2a y,在上下部分的交界处有斜率dy/dx=-1即2b x=2a y
首先讨论圆弧的上部分:假设当前已确定一圆弧上的像素点(x ,y )则下一对候选像素点是(x +1,y -0.5)即判断式为
设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
Setpixel(-x,-y,color);setpixel(-y,-x,color);
}
四:八分之一圆弧的扫描变换的实现。
1.算法根据圆的基本方,沿X轴从0到 /2R,以单位步长计算
对应的y值来获得圆周上每点的位置:y= ,
缺点:算法每一步均包含大量的复杂计算(浮点乘)且所绘制的像素间隔不一致
解决方法:使用极坐标r和 来计算圆弧上的点
pDC->SetPixel(-x+200,-y+200,color);
pDC->SetPixel(-y+200,-x+200,color);
Sleep(30);
}
void Yuan::MidpointCircle(int r,int color,CDC *pDC)
{
int x,y;
int e;
x=0;
则若F(x,y)<0,则说明中点M(x,y)在椭圆边界内:
若F(x,y)>0,则说明中点M(x,y)在椭圆边界上;
若F(x,y)>0,则说明中点M(x,y)在椭圆边界外;
4:பைடு நூலகம்据椭圆的对称性,只需讨论第一象限椭圆弧的生成。
在处理该段椭圆弧时,进一步与把他分为两部分:上下部分。以弧上斜率为-1的点作为边界,
d =F =1.25-R
为避免浮点运算,令e=d-0.25
此时初始化运算d=1.25-R对应于e=1-R
判别式d<0对应于e<-0.25,又由于e的初始值和运算过程中的增值为整数故e始终为整数,那e<-0.25可用e<0代替。
2.代码实现及结果:
#include<iostream>
#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);
d = F(x +1,y -0.5)=b (x +1) +a ( y -0.5) -a b 他的符号确定下一像素点取正右方还是左下方像素,
若d <0,中点在椭圆内,则取正右方,判别式为
d = F(x +2,y -0.5)=b (x +2) +a ( y -0.5)
= d + b (2 x +1)
因此往正右方向判别式d1的增量为b (2 x +1)
while(dx<dy)
{
x++;
dx+=twobb;
if(d<0)
{
d+=bb+dx;
}
else
{
dy-=twoaa;
d+=bb+dx-dy;
y--;
}
pDC->SetPixel(xc+x,yc+y,color);
pDC->SetPixel(xc+x,yc-y,color);
pDC->SetPixel(xc-x,yc+y,color);
int d,dx=0,dy=twoaa*y;
d=int(bb+aa*(-b+0.25)+0.5);
pDC->SetPixel(xc+x,yc+y,color);
pDC->SetPixel(xc+x,yc-y,color);
pDC->SetPixel(xc-x,yc+y,color);
pDC->SetPixel(xc-x,yc-y,color);
int m_nRadius;
public:
double m_dMidTime;
double m_dGenTime;
public:
CCircle();
CCircle(int radius);
void MidpointEllipse(int xc, int yc, int a, int b, int color, CDC *pDC);
数学与软件科学学院 实验报告
学期:2010至2011第一学期2010年10月5日
课程名称:计算机图形学专业:信息与计算科学2007级5班
实验编号:03实验项目:圆弧生成算法
指导教师:庞朝阳学号:20070605实验成绩:
一、实验目的及要求
1:圆弧上的八个对称点的算法描述;
2:了解圆弧的的基本绘制算法;
若d >0那中点在椭圆外,则取左下方像素,判别式为:
d = F(x ,y -1.5)=b (x ) +a ( y -1.5) -1
= d + b (2 x +1)+2 a y
因此沿左下方,判别式d1的增量为b (2 x +1)+2 a y
d 的初始条件是:据圆弧起点(0,b)得到第一个中点是
(1,b-0.5),对应判别式为:
this->m_dMidTime=0.0;
}
void CCircle::MidpointEllipse(int xc, int yc, int a, int b, int color, CDC *pDC)
{
int aa=a*a, bb=b*b;
int twoaa=2*aa, twobb=2*bb;
int x=0,y=b;
d =F(1,b-0.5)= b + a (b-0.5) -a b
= b + a (-b+0.25)
其中,每一步的迭代过程中需要随时的计算和比较从上部分转入下部分的条件是否成立,从而将逼近方向由x改为y。
2.代码实现及结果:
#include "math.h"
class CCircle
{
protected:
1:对于一般的椭圆,可将中心平移到坐标原点,确定好中心在原点的标准位置的椭圆像素点集后,在平移到(x0,y0)位置,将问题转化为标准位置的椭圆的绘制问题
2:若椭圆的长轴和短轴方向不与坐标轴x与Y平行则可采用旋坐标轴的变换方式,同样将问题转变为标准位置的椭圆绘制。
3:定义椭圆中点算法的判别式:
F(x,y)=b x +a y -a b
y=r;
e=1-r;
this->CirclePoints(x,y,color,pDC);
while(x<=y)
{
if(e<0)
{
e+=2*x+3;
}
else
{
e+=2*(x-y)+5;
y--;
}
x++;
this->CirclePoints(x,y,color,pDC);
}
}
实验结果:
六:椭圆的绘制
(1):基本原理
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);
pDC->SetPixel(xc-x,yc-y,color);
}
d=int(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb+0.5);
while(y>0)
{
y--;
dy-=twoaa;
if(d>0)
{
d+=aa-dy;
}
else
{
x++;
dx+=twobb;
d+=aa-dy+dx;
3:绘制椭圆;
二.基本思想
1:圆弧被定义为到给定中心位置(x0,y0)距离为r的点集,圆心为与原点的圆有四条对称轴:x=0, y=0, x=y, x=-y 。已知圆弧上一点(x ,y),则可以的到关于四条对称轴的其他7个点(八对称性),因此只需要扫描八分之一的圆弧就可以求的整个圆弧的所有点。
三:首先来了解一下圆弧上的八个对称点的算法描述(以中心在原点,半径为整数R的圆为例)。
};
CCircle::CCircle(int radius)
{
this->m_nRadius=radius;
this->m_dGenTime=0.0;
this->m_dMidTime=0.0;
}
CCircle::CCircle()
{
this->m_nRadius=200;
this->m_dGenTime=0.0;
相关文档
最新文档