计算机图形学课后答案_部分
第四章
1、将中点画线算法推广以便能画出任意斜率的直线
算法
:
(1) 输入直线的起点坐标P(x,y)和终点坐标P(x,y). 000111
(2) 定义直线当前点坐标x和y,定义中点偏差判别式d、直线斜率k、
像素点颜色rgb
(3) x= x,y= y计算d=0.5-k,k=( y-y)/(x-x), rgb=RGB=(0,0,255). 001010
(4) 绘制点(x,y),判断d的符号,若d<0,则(x, y)更新为(x+1,y+1),
d更新为d+1-k,否则(x, y)更新为(x+1,y),d更新为d-k.
(5) 如果当前点x小于(x,重复步骤(4),否则结束。 1
程序主要代码:
MidPointLine(x0,y0,x1,y1,color)
{
int a,b,delta1,delta2,d,x,y;
a = y0 – y1;
b = x1 – x0;
d = 2*a – b;
delta1 = 2 * a;
delta2 = 2 * (a+b);
x = x0;
y = y0;
if (a
x1)
{
If (d<0)
{
x++;
y++;
d+ = delta2;
}
Else
{
X++;
D+=delta1;
}
Putpixel(x,y,color);
}
Else
While (x=0)
{
y = y + 1;
e = e – 2 * dy;
}
}
}
4、试编写按逆时针方向生成第二个8分圆的中点算法
算法设计:
(1) 输入圆的半径
定义圆当前点坐标x和y、中点偏差判别式d、像素点颜色rgb (2)
(3) 计算d=1.25-R,x=0,y=R, rgb=RGB=(0,0,255).
(4) 绘制点(x, y),及其在八分圆中的另外7个对称点‘
(5) 判断d的符号,若d<0,则(x, y)更新为(x+1,y),d更新为d+2x+3,否则(x, y)
更新为(x+1,y-1),d更新为d+2(x-y)+5.
(6) 当x小于等于y,重复步骤(4)和(5),否则结束。
MidpointCircle(r,color)
int r, color;
{
float x,y;
float d;
x=0;
y=r;
d=1.25 –r/1.414;
drawpixel(x, y, color);
while (x=0)
{
drawpixel(x,y,color);
if (delta<0)
{
delta1=2*(delta+y-b)-1;
if (delta1<=0)
direction=1;
else
direction=2;
}
else if (delta>0)
{
delta2=2*(delta-x+xc)-1;
if (delta2<=0)
direction=2;
else
direction=3;
}
else
direction=2;
switch (direction)
{
case 1:x++;
delta+=2*(x-xc)+1;
break;
case 2:x++;
y++;
delta+=2*(x-a-y+yc+1);
break;
case 3:y--;
delta+=-2*(y-yc)+1;
break;
}
}
}
(2) 采用中点画圆算法
#include #include #include
MidpointCircle(r,color)
int r, color;
{
float x,y;
float d;
x=0;
y=r;
d=1.25 –r/1.414;
putpixel(xc+x, yc+y, color);
while (x方法进行,代码如下:
midpoint(x1,y1,x2,y2,r,color,k)
{
int x,y;
float d;
x=x1;
y=y1;
d=(x1+1)^2+(y1-0.5)^2-r^2;
putpixel(x,y,color);
while (x<=x2)
{
if (d<0)
{
d+=2*x+3;
x++;
}
else
{
d+=2*(x-y)+5;
x++;
y=y+k;
}
}
putpixel(x,y,color);
main()
{
scanf(“%d”,&n);//分割的圆弧数
for (i=1;i<=n;i++)
{
scanf(“%d,%d,%d,%d,%d”,&x1,&y1,&x2,&y2,,&k); //要求x1
表 达式为
-1 3 -3 1 P1
32 P(t)=[t t t 1] 3 -6 3 0 P2
-3 3 0 0 P3
1 0 0 0 P4
-1 3 -3 1 0 0 0
32 = [t t t 1] 3 -6 3 0 1 1 1
-3 3 0 0 2 -1 -1
1 0 0 0 3 0 0
0 6 6
32 => P(t)=[t t t 1] 0 -9 -9
3 3 3
0 0 0
然后分别令t=0, 1/3, 2/3, 1 计算上述式子即可
当t,0时
P(0)= 0 0 0 1 0 6 6
0 -9 -9
3 3 3
0 0 0
= 0 0 0
当t,1/3时
32 P(1/3)= 1/3 1/3 1/3 1 0 6 6
0 -9 -9
3 3 3
0 0 0
= 1 2/9 2/9
当t,2/3时
32 P(2/3)= (2/3) (2/3) 2/3 1 0 6 6
0 -9 -9
3 3 3
0 0 0
= 2 -2/9 2/9
当t,1时
P(0)= 1 1 1 1 0 6 6
0 -9 -9
3 3 3
0 0 0
= 3 0 0
11,已知由P,0,0,0,,P,2,2,-2,,P,2,-1,-1,,P,3,0,0,,Q12341,4,0,0,,Q,6,-2,1,,Q,8,-3,2,,Q,10,0,1,确定的两段三234
1次Bezier曲线,试求其在P(Q1)处达到C连续的条件 4
解:设两段连续的三次Bezier曲线分别为:
P(t), Q(t) t?[0 1]
3223 则 P(t1)=(1-t)P+3t(1-t)P+3t(1-t)P+tP1111211314
t1?[0 1]
3223 Q(t2)=(1-t)Q+3t(1-t)Q+3t(1-t)Q+tQ 2122222324
t2?[0 1]
将P、P、P、P的分量分别代入P(t)得到相应的分量 12343223 Px(t)= (1-t)*0 + 3t(1-t)*2 + 3t(1-t)*2 + t*4
32 = 4t – 6t + 6t 3223 Py(t)= (1-t)*0 + 3t(1-t)*2 + 3t(1-t)*(-1) + t*0
32 = 9t – 15t + 6t 3223 Pz(t)= (1-t)*0 + 3t(1-t)*(-2) + 3t(1-t)*(-1) + t*0
32 = -3t + 9t - 6t
即三次Bezier曲线的矩阵式为:
32 P(t)= [t t t 1] 4 9 -3 0
-6 -15 9 0
6 6 -6 0
0 0 0 0 将Q、Q、Q、Q的分量分别代入Q(t)得到相应的分量 12343223 Qx(t)= (1-t)*4 + 3t(1-t)*6 + 3t(1-t)*8 + t*10
= 6t + 4 3223 Qy(t)= (1-t)*0 + 3t(1-t)*(-2) + 3t(1-t)*(-3) + t*0
32 = 3t + 3t - 6t 3223 Qz(t)= (1-t)*0 + 3t(1-t)*1 + 3t(1-t)*2 + t*1
3 = -2t + 3t
即三次Bezier曲线的矩阵式为:
32 Q(t)= [t t t 1] 0 3 -2 0
0 3 0 0
6 -6 3 0
4 0 0 4
1 P(t)和Q(t)在P(Q)处达到C连续的条件是: 41
P(1)和Q(0) 在P(Q)处重合,且其在在P(Q)处的切矢量方向相同,大小相等 4141
即:
P(t=1) =Q(t=0)
P’(t=1)=Q’(t=0)
第七章
2(试
下述几何变换的矩阵运算具有互换性:
(1)两个连续的旋转变换;(2)两个连续的平移变换;
(3)两个连续的变比例变换;(4)当比例系数相等时的旋转和比例变换; (1)证明:设第一次的旋转变换为:
cosθ1 sinθ1 0
T1= - sinθ1 cosθ1 0
0 0 1
第二次的旋转变换为:
Cosθ2 sinθ2 0
T2= - sinθ2 cosθ2 0
0 0 1 则因为
T1*T2 = cosθ1 sinθ1 0 cosθ2 sinθ2 0
- sinθ1 cosθ1 0 - sinθ2 cosθ2 0
0 0 1 0 0 1
= cosθ1 cosθ2+sinθ1 sinθ2 cosθ1 sinθ2+ sinθ1 cosθ2 0
- sinθ1 cosθ2- cosθ1 sinθ2 -sinθ1 sinθ1+ cosθ1 cosθ2 0
0 0 1
Cos(θ1+θ2) sin(θ1+θ2) 0
= - sin(θ1+θ2) cos(θ1+θ2) 0
0 0 1
cosθ2 sinθ2 0 cosθ1 sinθ1 0
T2*T1 = - sinθ2 cosθ2 0 - sinθ1 cosθ1 0
0 0 1 0 0 1
cosθ1 cosθ2+ sinθ1 sinθ2 cosθ1 sinθ2+ sinθ1 cosθ2 0
= - sinθ2cosθ1- cosθ2 sinθ1 -sinθ1 sinθ1+ cosθ1 cosθ2 0
0 0 1
Cos(θ1+θ2) sin(θ1+θ2) 0
= - sin(θ1+θ2) cos(θ1+θ2) 0
0 0 1
即T1*T2= T2*T1, 两个连续的旋转变换具有互换性
(2)证明:设第一次的平移变换为:
1 0 0
T1= 0 1 0
Tx1 Ty1 1
第二次的平移变换为:
1 0 0
T2= 0 1 0
Tx2 Ty2 1
则因为
T1*T2 = 1 0 0 1 0 0
0 1 0 0 1 0
Tx1 Ty1 1 Tx2 Ty2 1
1 0 0
= 0 1 0
Tx1+Tx2 Ty1+Ty2 1
而
T2*T1 = 1 0 0 1 0 0
0 1 0 0 1 0
Tx2 Ty2 1 Tx1 Ty1 1
1 0 0
= 0 1 0
Tx1+Tx2 Ty1+Ty2 1
即T1*T2= T2*T1, 两个连续的平移变换具有互换性
(3)证明:设第一次的变比例变换为:
Sx1 0 0
T1= 0 Sy1 0
0 0 1
第二次的变比例变换为:
Sx2 0 0
T2 = 0 Sy2 0
0 0 1
则因为
T1*T2 = Sx1 0 0 Sx2 0 0
0 Sy1 0 0 Sy2 0
0 0 1 0 0 1
Sx1*Sx2 0 0
= 0 Sy1*Sy2 0
0 0 1
而
T2*T1 = Sx2 0 0 Sx1 0 0
0 Sy2 0 0 Sy1 0
0 0 1 0 0 1
Sx1*Sx2 0 0
= 0 Sy1*Sy2 0
0 0 1
即T1*T2= T2*T1, 两个连续的变比例变换具有互换性
(4)证明:设第一次为比例系数相等时的比例变换:
S 0 0
T1= 0 S 0
0 0 1
第二次的为旋转变换:
cosθ sinθ 0
T2= - sinθ cosθ 0
0 0 1
则因为
T1*T2 = S 0 0 cosθ sinθ 0
0 S 0 - sinθ cosθ 0
0 0 1 0 0 1
S cosθ S sinθ 0
= - S sinθ S cosθ2 0
0 0 1
而
T2*T1 = cosθ sinθ 0 S 0 0
sinθ cosθ 0 0 S 0 -
0 0 1 0 0 1
S cosθ S sinθ 0
= -S sinθ S cosθ 0
0 0 1
即T1*T2= T2*T1, “当比例系数相等时的旋转和比例“变换具有互换性
3、证明二维点相对x轴作对称,紧跟着相对y=-x直线作对称变换完全等价于该
点相对坐标原点作旋转变换。
证明:
(1) 点相对x轴作对称的变换矩阵
1 0 0
T1= 0 -1 0
0 0 1
(2) 相对于y=-x直线作对称变换矩阵
0 -1 0
T2= -1 0 0
0 0 1
1 0 0 0 -1 0 0 -1 0
因为 T1*T2= 0 -1 0 * -1 0 0 = 1 0 0
0 0 1 0 0 1 0 0 1
cos(-90º) sin(-90 º) 0
= - sin(-90 º) cos(-90º) 0
0 0 1
即该点相对坐标原点作顺时针方向转90 º的旋转变换
4、证明
2 1-t 2t
2 2 1+ t1+t
T= 完全表示一个旋转变换。
2 -2t 1-t
2 2 1+t1+t
证明:令t=tg(θ/2)
2 21-t,/(1+ t)= cosθ则:,
2,2t,/(1+ t)= sinθ
即
cosθ sinθ
T=
- sinθ cosθ
将T扩充为一个三行齐次坐标的变换矩阵为:
cosθ sinθ 0
T= - sinθ cosθ 0
0 0 1
该矩阵表示为一个旋转变换
5、例:三角形ABC各顶点坐标为A(3,0)B(4,2)C(6,0),其绕原点逆时针旋转90?,再向X方向平移2,Y方向平移-1。 解:因为:θ=90?
变换矩阵为
COS90? SIN90? 0 0 1 0
TR= - SIN90? COS90? 0 = -1 0 0
2 -1 1 2 -1 -1
则
A 3 0 1 0 1 0 2 2 1 A‘
B 4 2 1 -1 0 0 = 0 3 1 B‘
C 6 0 1 2 -1 1 2 5 1 C‘
如果先进行平移变换,再进行旋转变换,
1 0 0 COS90? SIN90? 0 0 1 0 Tr= 0 1 0 - SIN90? COS90? 0 = -1 0 0
2 -1 1 0 0 1 1 2 1
则
A 3 0 1 0 1 0 1 5 1 A‘
B 4 2 1 - 1 0 0 = -1 6 1 B‘
C 6 0 1 1 2 1 1 8 1 C‘
结论:变换顺序不同,结果也不同