计算机图形学第3章作业答案 - Final -(4)

2019-02-14 22:02

习题22答案

习题22. 设斜交平行投影方向是(l,m,n),求做这个投影的变换矩阵。 解答:

已知斜交平行投影方向,根据斜交平行投影特点,可设点P坐标为(0,0,?n),其做斜交平行投影后得到的点P’的坐标为(l,m,0),此时的斜交平行投影方向PP'为(l,m,n) 如下图所示:

y P’ (l,m,0) P(0,0,?n) O x z

设三维空间中有普通坐标为(x,y,z)的任意一点,经斜交投影后所得投影点普通坐标为(x',y',z')。显然z'?0,有:

x'?xz?l?n,y'?yzln?m?n

mn因此有:x'?x?z使用齐次坐标有:

y'?y?z

?x'y'z'1???xyz?1?0?1?l???n??001mn000000?0??0? 0??1??00000??0? 0??1??所以做斜交投影的变换矩阵是:Mob?1?0??l???n??0?1mn0

习题24答案

习题24. 等轴投影是投影方向与三个坐标轴有相等夹角时的正交投影,设要实现一个投影方向为(1,1,1)的等轴投影,可以先绕y轴再绕x轴做旋转变换使投影方向重合于z轴正方向,然后就可以进行正交投影了。试用这个想法推导出做等轴投影的变换矩阵,然后验证三根坐标轴上的单位向量被相等地缩短,并且可以使三个坐标轴的投影具有相等的夹角。 解答: 已知:

v?x1?z1,z1v,22u?x1?y1?z1x1v,222cos???sin???cos??vu,sin??y1 uy (0, y1,v) (x1,y1,z1) β z O α x

在视觉坐标系下可得如下变换:

?z1?v?0Ry(?)??x??1?v??0?z1?v?0Ry(??)??x?1?v??001000100x1v0z1v0?x1v0z1v0?0?0??0??1???0?0??0??1???1?0?Rx(?)???0???00v?uy1u00vuy1u00y1uvu00??0?? 0??1??0y1uvu00??0?? 0??1???1?0?Rx(??)???0???0?Mob?1?0???0??0010000000??0? 0??1?Rx(??)Ry(??)获得变换矩阵为

M'ob?Ry(?)Rx(?)Mob?2020??220??1??6??0100??0??3?2??20220????0?6?3?0001????00??20?20???22?0100???2?020???22?0001???2??1?130???332????1?10??333??1????120??333?0001??在观察坐标系下可得如下变换矩阵:

00?6??130??6??030??0??01?0??000??1100??0??000??00????01??00063?636633000?0???0??1??

A?1?B0?C??00100011??1Ry(?)Rx(?)M?1????1????1???1?????????1????1???1???????220220220220???63636306663660ob33333300000?1??0???0010001?0???1??00????0?0??0?1??010000000??0?0??1???1??0???0010001?0???22??00??????220???1???6663000?661?A'?1?B'1?C' ? 因为:

O'A'?23,O'B'?23,O'C'?2323,即O'A'?O'B'?O'C'

∴三个坐标轴上的单位向量以相同比例系数缩短

三个坐标轴上的单位向量在投影平面上的点为(2/2,?6/6),(0,6/3),(?2/2,?6/6)

O'A'?O'B'?(???120?22,?66)?(0,63)??13?23?23?cos?O'B'?O'C'?(0,???120?63)?(?22,?66)??13?23?23?cos?

O'C'?O'A'?(????120

?22,?66)?(22,?66)??13?23?23?cos?∴三个坐标轴上的投影具有相等的夹角。

习题31答案

习题31. 修改Cohen-Sutherland直线裁剪算法,使其成为一个直线“开窗”算法,即指定一个窗口后,窗口内舍弃,窗口外保留。 解答:

根据题意,可知只需要对原Cohen-Sutherland算法中的两处进行修改即可满足要求。

第一处是判断C1和C2的逻辑乘结果不为0时,此时如果该条件满足,表示线段完全在窗外,原算法此处需要将原线段完全舍弃,这里就需要将原线段完全绘制出来即可。

第二处是最后要将原线段中窗口中可见部分绘制出来,此时原算法已经完成对原线段的裁剪,得出来原线段在窗口内的部分,这里只需要改成将原线段去掉窗口以内部分后的线段绘制出来即可。

根据以上分析,修改Cohen-Sutherland直线裁剪算法为直线“开窗”算法如下:

double xl, xr, yt, yb; (这里事先给出窗口的位置,四个数值是已知的),修改的部分用蓝色表示 void Cohen_Sutherland(double x0, y0, x2, y2) {

int c, c1, c2; double x, y;

//需要将原线段的端点保存起来,以备后面需要确定原线段去除窗口内部分时使用 double x00=x0,y00=y0,x22=x2,y22=y2; makecode(x0, y0,c1); makecode(x2, y2, c2); while (c1!=0 || c2!=0) {

if (c1&c2!=0) {

showline(x00, y00, x22, y22);//显示原线段,能走到这说明原线段都在窗口外 return; }

c=c1; if (c==0) c=c2;

if (c&1==1) {y=y0+(y2-y0)*(x1-x0)/(x2-x0); x=x1;} else if (c&2==2) {y=y0+(y2-y0)*(xr-x0)/(x2-x0); x=xr;} else if (c&4==4) {x=x0+(x2-x0)*(yb-y0)/(y2-y0); y=yb;} else if (c&8==8) {x=x0+(x2-x0)*(yt-y0)/(y2-y0); y=yt;} if (c==c1)

{x0=x; y0=y; makecode(x, y, c1);} else

{x2=x; y2=y; makecode(x, y, c2);} }

//因为原算法的线段分割保证了端点的顺序性,所以采用如下的方法可确定原线段在窗口外的部分 if (x00!=x0 || y00!=y0) showline(x00,y00,x0,y0); if (x2!=x22 || y2!=y22) showline(x2,y2,x22,y22); }

此算法已经编码实现并测试通过。

另一种方法是在分割线段的同时绘制窗口外的线段,该方法无需记录初始点坐标。 double xl, xr, yt, yb; (这里事先给出窗口的位置,四个数值是已知的),修改的部分用蓝色表示 void Cohen_Sutherland(double x0, y0, x2, y2) {

int c, c1, c2; double x, y;

makecode(x0, y0,c1); makecode(x2, y2, c2); while (c1!=0 || c2!=0) {

if (c1&c2!=0) {

//显示线段,此时绘制的是分割完后,完全在窗口外同侧的线段 showline(x0, y0, x2, y2); return;

}

c=c1; if (c==0) c=c2;

if (c&1==1) {y=y0+(y2-y0)*(x1-x0)/(x2-x0); x=x1;} else if (c&2==2) {y=y0+(y2-y0)*(xr-x0)/(x2-x0); x=xr;} else if (c&4==4) {x=x0+(x2-x0)*(yb-y0)/(y2-y0); y=yb;} else if (c&8==8) {x=x0+(x2-x0)*(yt-y0)/(y2-y0); y=yt;} if (c==c1)

{showline(x0,y0,x,y);//绘制被分割抛弃的线段 x0=x; y0=y; makecode(x, y, c1);}

else

{showline(x,y,x2,y2);//绘制被分割抛弃的线段 x2=x; y2=y; makecode(x, y, c2);} } }

此算法已经编码实现并测试通过。


计算机图形学第3章作业答案 - Final -(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:ACT考试-从文本难度分析ACT考试阅读难度等级(一)-Sandy

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: