资源描述
习题2答案
习题2. 写出完成如下平面图形变换的变换矩阵;
(1) 保持点(5,10)固定,方向放大3倍,方向放大2倍。
(2) 绕坐标原点顺时针旋转。
(3) 对直线成轴对称。
(4) 对直线成轴对称。
(5) 沿与水平方向成角的方向扩大倍,沿与水平方向成角的方向扩大倍。
(6) 对于平面上任意一点成为中心对称。
(7) 对平面上任意一条方程为的直线成轴对称。
解答:
(1)变换矩阵如下:
(2) 变换矩阵如下:
(3) 变换矩阵如下:
(4) 变换矩阵如下:
(5) 变换矩阵如下:
(6) 变换矩阵如下:
(7) 变换矩阵如下:对平面上任意一条方程为的直线成轴对称
当时,
或者当时,
习题5答案
习题5. 举例说明由平移、比例或旋转构成的组合变换一般不能交换变换的次序,说明什么情况下可以交换次序。
平移与比例不能交换变换的次序
解答:
平移与比例不能交换变换的次序,如下:
平移与旋转不能交换变换的次序,如下:
当时,比例与旋转不能交换变换的次序,而当时,比例与旋转可以交换变换的次序,如下:
即如果组合变换由一系列比例和旋转变换组成,并且比例变换中,则可以交换变换次序。
习题7答案
习题7. 平面上两点P和V的齐次坐标是()和(),验证过这两点的直线采用齐次坐标的方程是:
解答:
P和V两点的齐次坐标规范化得:,
设直线过P,V两点的直线上的任意一点的齐次坐标为,则它的规范化结果为
可得过P,V两点的直线方程为:
得到过P,V两点的采用齐次坐标的方程为
证明完毕
习题12答案
习题12. 若已知某一正方形显示器的坐标范围是以dxmin、dxmax、dymin和dymax规定的矩形区,且(dymax – dymin) = 3/4 (dxmax - dxmin),为保证图形不失真并充分利用显示区,请写出自用户坐标至该显示器坐标的视见变换矩阵。
解答:
设用户坐标区的坐标范围是以wxmin、wxmax、wymin和wymax规定的矩形区域。为保证图形在此显示器上显示不失真,其视见变换矩阵如下:
k如下确定:设,,
(1) 若,因为有,所以有,所以有,则;
(2) 若,即,则
习题15答案
习题15. 给出三维空间中通过原点和点的一条直线,试用下面提示的三种不同方法把这条直线旋转到正的z轴上,说明求出的三个变换矩阵可能不同,但就完成要求表换得效果看是相同的。
(1)绕x轴旋转到xz平面,然后绕y轴旋转到z轴;
(2)绕y轴旋转到yz平面,然后绕x轴旋转到z轴;
(3)绕z轴旋转到xz平面,然后绕y轴旋转到z轴。
解答:
(1)绕x轴旋转到xz平面,然后绕y轴旋转到z轴
x
z
y
α
β
(x1,y1,z1)
(x1, 0, v)
O
(2)绕y轴旋转到yz平面,然后绕x轴旋转到z轴
x
z
y
α
β
(x1,y1,z1)
(0, y1,v)
O
(3)绕z轴旋转到xz平面,然后绕y轴旋转到z轴
x
z
y
α
β
(x1,y1,z1)
(v,0,z1)
O
通过上面可知,虽然三个变换矩阵不同,但是都变换成,所以效果是相同的。
习题17答案
习题17. 求完成如下空间图形变换的变换矩阵:
(1) 图形中点(0.5,0.2,-0.2)保持不动,和方向放大3倍,方向不变。
(2) 产生与原点对称的图形。
(3) 产生对平面对称的图形。
(4) 绕过原点和(1,1,1)的直线旋转。
(5) 绕过(0,0,1)和(-1,-1,-1)两点的直线旋转。
解答:
(1)变换矩阵如下:
(2) 变换矩阵如下:
(3) 变换矩阵如下:
(4) 在以过坐标原点的任意直线为旋转轴作旋转变换的变换矩阵中代入向量值及旋转角度,得变换矩阵如下:
(5) 利用(4)中的变换矩阵加以平移,得变换矩阵如下:
习题19答案
习题19. 设三维空间有一个平面,其方程为Ax + By + Cz + D = 0,要通过平移和旋转组合的变换,使其重合于z = 0坐标平面,求变换矩阵。
解答:
设给定平面与x轴的交点为P1,与y轴的交点为P2,与z轴的交点为P3。
P4
O
P1
P3
P2
z
x
y
如上图所示,根据平面方程,可知与三个坐标轴的交点坐标,分别为
从P2点作线段P1P3的垂线,与P1P3的交点为P4。
设为,为
将指定平面变换到与z = 0坐标平面重合,可以通过以下步骤完成:
P4
O
P1
P3
P2
z
x
y
首先,做平移,使P3点与原点O重合,如上图所示。
然后,做旋转,使P3P1重合于x坐标轴,如下图所示。
P4
O
P1
P3
P2
z
x
y
最后,做旋转,使P2点也落入z = 0坐标平面中,此时P1,P2,P3三点都在z = 0坐标平面中,原始平面重合于z = 0坐标平面。
即变换矩阵为:
因为有:
∵,
,
所以有变换矩阵为:
根据第一幅图所示,可以计算出三角函数值:
∵P1P3的长度为,OP3的长度为,OP1的长度为
∴,
∵
∴OP4的长度为,同时OP2的长度为
∴P2P4的长度为
∴,
这里计算长度时没有取绝对值,因为根据第一幅图进行变换的时候实际假定了平面与三个坐标轴的交点都在坐标轴的正方向上,所以为了考虑一般性,计算三角函数值的时候带入了方向性(正负)。
所以最终变换矩阵为:
可以验证此变换矩阵的正确性,设点(x0,y0,z0)为平面上一点,该点经上面的变换矩阵变换后,z坐标值:
z’ =
而作为平面上一点,必然有,所以z’ = 0,该变化后平面与z = 0坐标平面重合。
需要说明的是,这里假定了A、B、C三个值都不为0,即最一般的情况。
习题22答案
习题22. 设斜交平行投影方向是,求做这个投影的变换矩阵。
解答:
已知斜交平行投影方向,根据斜交平行投影特点,可设点P坐标为,其做斜交平行投影后得到的点P’的坐标为,此时的斜交平行投影方向为
如下图所示:
P’
O
P
z
x
y
设三维空间中有普通坐标为的任意一点,经斜交投影后所得投影点普通坐标为。显然,有:
因此有:
使用齐次坐标有:
所以做斜交投影的变换矩阵是:
习题24答案
习题24. 等轴投影是投影方向与三个坐标轴有相等夹角时的正交投影,设要实现一个投影方向为(1,1,1)的等轴投影,可以先绕轴再绕轴做旋转变换使投影方向重合于轴正方向,然后就可以进行正交投影了。试用这个想法推导出做等轴投影的变换矩阵,然后验证三根坐标轴上的单位向量被相等地缩短,并且可以使三个坐标轴的投影具有相等的夹角。
解答:
已知:
x
z
y
α
β
(x1,y1,z1)
(0, y1,v)
O
在视觉坐标系下可得如下变换:
获得变换矩阵为
在观察坐标系下可得如下变换矩阵:
因为:
,即
∴三个坐标轴上的单位向量以相同比例系数缩短
三个坐标轴上的单位向量在投影平面上的点为,,
∴三个坐标轴上的投影具有相等的夹角。
习题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);}
}
}
此算法已经编码实现并测试通过。
展开阅读全文