计算机地图制图原理与方法实验报告
- 格式:docx
- 大小:129.74 KB
- 文档页数:6
计算机地图制图原理与方法实验报告
一、实验目的
(1)了解中点画线法的基本原理;
(2)掌握中点划线算法,并学会编程实现;
(3)掌握计算机中图形的变形变换算法,并学会编程实现。
二、实验内容
(1)要求对于任意输入的两个点(任意斜率),利用中点画线算法实现直线生成与绘制;
(2)要求运用上一程序完成三角形ABC的绘制,并用程序实现三角形ABC关于点(400,400)做顺时针90°的旋转变换。
A(200,100),B(100,300),C(300,300)。
三、算法描述
假定直线斜率在0~1之间。
若直线在x方向上增加一个单位,则在y方向上的增量只能在0~1之间。
假设x坐标为X p的各像素点中,与直线最近者已确定为(Xp,Yp)。
则,下一与直线最近的像素只能是正右方的(Xp+1,Yp)或右上方的(Xp+1,Yp+1)两者之一。
通过判断两点间哪一点与理想直线轨迹更近进行取舍。
以M表示两点间中点,则M点坐标为(Xp+0.5,Yp+0.5)。
则,若直线在x=Xp+1时的理想点在M点上方则选上方的点,在M点下方则选择下方的点。
这就是中点画线算法的原理。
同理,直线斜率在-1~0之间,要取舍的点为正右方(Xp+1,Yp)与右下方(Xp+1,Yp-1)。
而当直线斜率在1~+∞与-∞~-1之间时,检查直线应选点的应该从x坐标改为y坐标。
计算机图形的变换通过对图形关键的点的坐标与变换矩阵相乘得出变换后点的坐标,再经过连线得到变换后图形。
四、关键代码
void MidpointLine (int x0,int y0,int x1,int y1,int color,CDC* pDC);
void transition (int *x,int *y);
void Cwt2View::OnDraw(CDC* pDC)
{
Cwt2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
int x0,y0,x1,y1,x2,y2;
x0=200,y0=100,x1=100,y1=300,x2=300,y2=300;
MidpointLine (x1,y1,x0,y0,RGB(0,0,0),pDC);
MidpointLine (x1,y1,x2,y2,RGB(0,0,0),pDC);
MidpointLine (x0,y0,x2,y2,RGB(0,0,0),pDC);
transition (&x0,&y0);
transition (&x1,&y1);
transition (&x2,&y2);
MidpointLine (x0,y0,x1,y1,RGB(0,0,0),pDC);
MidpointLine (x1,y1,x2,y2,RGB(0,0,0),pDC);
MidpointLine (x0,y0,x2,y2,RGB(0,0,0),pDC);
}
void transition (int *x,int *y)
{
int t[3][3]={{1,0,0},{0,1,0},{-400,-400,1}};
int u[3][3]={{0,-1,0},{1,0,0},{0,0,1}};
int v[3][3]={{1,0,0},{0,1,0},{400,400,1}};
int a=0,b=0,c=0;
int p1,p2;
a=(*x * t[0][0]+*y * t[1][0]+t[2][0]);b=(*x * t[0][1]+*y * t[1][1]+t[2][1]);c=(*x * t[0][2]+*y * t[1][2]+t[2][2]);
a=a/c;b=b/c;c=0;p1=a;p2=b;
a=(p1 * u[0][0]+p2 * u[1][0]+u[2][0]);
b=(p1 * u[0][1]+p2 * u[1][1]+u[2][1]);
c=(p1 * u[0][2]+p2 * u[1][2]+u[2][2]);
a=a/c;
b=b/c;
c=0;
p1=a;
p2=b;
a=(p1 * v[0][0]+p2 * v[1][0]+v[2][0]);
b=(p1 * v[0][1]+p2 * v[1][1]+v[2][1]);
c=(p1 * v[0][2]+p2 * v[1][2]+v[2][2]);
a=a/c;
b=b/c;
*x=a;
*y=b;
}
void MidpointLine (int x0,int y0,int x1,int y1,int color,CDC* pDC)
{
int a,b,d1,d2,d,x,y,z,i,j;
float k;
if(x0>x1)
{
z=x1;x1=x0;x0=z;z=y1;y1=y0;y0=z;
}
x=x0;
y=y0;
a=y0-y1;
b=x0-x1;
k=1.0*a/b;
if (x0==x1)
{
if (y0<y1)
{
z=y0;
y0=y1;
y1=z;
}
while (y>y1)
{
pDC->SetPixel (x,y,color);
y--;
}
}
if (k>1)
{
d=-2*b+a;
d1=-2*b;
d2=2*(a-b);
while (y<=y1)
{
pDC->SetPixel(x,y,color);
if (d<0)
{
y++;
d+=d1;
}
else
{
y++;
x++;
d+=d2;
}
}
}
else if(k>0)
{
d=2*a-b;
d1=2*a;
d2=2*(a-b);
while (x<=x1)
{
pDC->SetPixel(x,y,color);
if (d<0)
{
x++;
y++;
d+=d2;
}
else
{
x++;
d+=d1;
}
}
}
else if(k>-1)
{
d=2*a+b;
d1=2*a;
d2=2*(a+b);
while (x<=x1)
{
pDC->SetPixel(x,y,color);
if (d<0)
{
x++;
d+=d1;
}
else
{
x++;
y--;
d+=d2;
}
}
}
else
{
b=x0-x1;
d=a+2*b;
d1=2*b;
d2=2*(a+b);
while (y>=y1)
{
pDC->SetPixel(x,y,color);
if (d<=0)
{
x++;
y--;
d+=d2;
}
else
{
y--;
d+=d1;
}
}
}
}
四、运行结果。