目录↓
文章目录
- 二、1、描述直线扫描的DDA算法、中点画线法和Bresenham算法,并用程序实现Bresenham算法
- 二、2、用中点画线扫描法转换从点A(1,0)到点B(4,7)经过的直线段,并给出每一步的判别式
- 二、4、字符串精度可按哪三个精度进行
- 二、5、为了在显示器等输出设备上输出字符,系统中必须装备有相应的字符。字符中存储了每个字符的形状信息,字符分为那两种类型?各有哪些特点?
- 二、8、解释走样和反走样的概念,并表述反走样的主要方法
- 三、3、设一条二次Bezier曲线的控制顶点为 P 0 P_0 P0、 P 1 P_1 P1和 P 2 P_2 P2,另一条Bezier曲线的顶点是 Q 0 Q_0 Q0、 Q 1 Q_1 Q1和 Q 2 Q_2 Q2。 P 2 = Q 0 P_2=Q_0 P2=Q0。写出两条曲线可以精确合并(表示)为一条二次Bezier曲线的条件
- 三、4、已知Bezier曲线上的4个点分别为 Q 0 ( 50 , 0 ) Q_0(50,0) Q0(50,0), Q 1 ( 100 , 0 ) Q_1(100,0) Q1(100,0), Q 2 ( 0 , 50 ) Q_2(0,50) Q2(0,50), Q 3 ( 0 , 100 ) Q_3(0,100) Q3(0,100),它们对应的参数分别为0,1/3,2/3,1,反求Bezier曲线的控制顶点。给出4次Bezier曲线的控制顶点。给出4次Bezier曲线退化为3次Bezier,控制顶点 P 0 P_0 P0, P 1 P_1 P1, P 2 P_2 P2, P 3 P_3 P3应该满足的条件
- 三、5、设一条三次 Bezier 曲线的控制顶点为 P0,P1,P2,P3。对曲线上一点 *P*(0.5),及一个给定的目标点 T,给出一种调整 Bezier 曲线形状的方法,使得 P(0.5)精确通过点T。
- 三、6、计算以(30,0),(60,10),(80,30),(90,60),(90,90)为控制顶点的 4 次 Bézier 曲线在*t*=1/2 处的值,并画出 de Casteljau 三角形。
- 三、7、推导 Bezier 曲线的升阶公式;给定三次 Bezier 曲线的控制顶点(0,0), (0,100), (100,0), (100,100),计算升阶一次后的控制顶点。
- 三、9、试证明 n 次 Bezier 曲线退化为 n-1 次 Bezier 曲线的条件为 Δ n P 0 \Delta^nP_0 ΔnP0=0。
- 三、14、形体表示有哪些常见的方法
二、1、描述直线扫描的DDA算法、中点画线法和Bresenham算法,并用程序实现Bresenham算法
- 直线扫描DDA算法:
- 当直线斜率小于1时,从x的左端点开始,向x右端点步进,步长为1,以此计算出y的坐标,并取(x,int(y+0.5))为当前点的坐标。当直线斜率绝对值大于1,以y轴作为步进方向
- 中点画线法:
- 假定直线斜率k在0~1之间,当前像素点为( x p x_p xp, y p y_p yp),则下一个像素点为 p 1 p_1 p1( x p x_p xp+1, y p y_p yp)或 p 2 p_2 p2( x p x_p xp+1, y p y_p yp+1)。设 p 1 p_1 p1和 p 2 p_2 p2的中点为M( x p x_p xp+1, y p y_p yp+0.5),Q为理想直线和x= x p x_p xp+1的垂线的交点。当M在Q的上面时,取 p 1 p_1 p1为下一像素点;反之, p 2 p_2 p2为下一像素点。
- Bresenham算法:
- 过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。
-
用程序实现Bresenham算法
void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float k, e; dx = x1-x0, dy = y1- y0, k=dy/dx; e=-0.5, x=x0, y=y0; for (i=0; i<=dx; i++) { drawpixel (x, y, color); x=x+1,e=e+k; if (e>=0) { y++, e=e-1;} } }
二、2、用中点画线扫描法转换从点A(1,0)到点B(4,7)经过的直线段,并给出每一步的判别式
x 0 x_0 x0=1, y 0 y_0 y0=0, x 1 x_1 x1=4, y 1 y_1 y1=7
以y为步进方向
a= x 0 x_0 x0- x 1 x_1 x1=-3
==b= y 1 y_1 y1- y 0 y_0 y0===7
c= x 1 y 0 − x 0 y 1 x_1y_0-x_0y_1 x1y0−x0y1=-7
d=F=F(M)=F( y p + 1 y_p+1 yp+1, x p + 0.5 x_p+0.5 xp+0.5)=a( y p + 1 y_p+1 yp+1)+b( x p + 0.5 x_p+0.5 xp+0.5)+c
2d = 2a y p y_p yp+2b x p x_p xp+2a+b+2c
i | y i y_i yi | x i x_i xi | 2d |
---|---|---|---|
1 | 0 | 1 | 2a+3b+2c=-6+21-14=1 |
2 | 1 | 1 | 4a+3b+2c=-12+21-14=-5(d小于0,所以取 p 2 p_2 p2) |
3 | 2 | 2 | 6a+5b+2c=-18+35-14=3 |
4 | 3 | 2 | 8a+5b+2c=-24+35-14=-3() |
5 | 4 | 3 | 10a+7b+2c=-30+49-14=5 |
6 | 5 | 3 | 12a+7b+2c=-36+49-14=-1() |
7 | 6 | 4 | 14a+9b+2c=-42+63-14=7 |
8 | 7 | 4 | 16a+9b+2c=-48+63-14=1 |
二、4、字符串精度可按哪三个精度进行
串精度:将包围字串的外接矩形对窗口作裁剪,当字符串方框整个在窗口内时予以显示,否则不显示。
字符精度:将包围字的外接矩形对窗口作裁剪,当字符方框整个在窗口内时予以显示,否则不显示。
笔画\象素精度:将矢量字符的笔划分解成直线段对窗口作裁剪;将点阵字符像素相对窗口边界作取舍当字符方框整个在窗口内时予以显示,否则不显示。
二、5、为了在显示器等输出设备上输出字符,系统中必须装备有相应的字符。字符中存储了每个字符的形状信息,字符分为那两种类型?各有哪些特点?
点阵字符:存储量大,易于表示
矢量字符:存储量小,美观,变换方便;但需要光栅化(将几何数据经过一系列变换(可以说是连点描边)最终转换为像素)后才能显示
二、8、解释走样和反走样的概念,并表述反走样的主要方法
走样:由于显示器的空间分辨率优先,因像素逼近误差,使所画图形产生畸变(台阶、锯齿)的现象(用离散量表示连续量引起的失真)
反走样:用于减少或消除这种效果的技术
反走样的主要方法:
- 提高分辨率:显示器分辨率提高,直线经过的像素加倍,锯齿也加倍,同时每个阶梯的宽度减少,显示出来的直线就更加平滑。只能减轻而不能消除锯齿现象
- 区域采样:假定每个像素是具有一定面积的小区域,将直线段看做具有一定宽度的狭长矩形,当直线段和像素有交时,求出两者的相交区域面积,然后根据相交区域面积的大小确定该像素的亮度值。
- 加权区域采样:在区域采样的基础上,使相交区域对像素亮度的贡献依赖于该区域与像素中心的距离
三、3、设一条二次Bezier曲线的控制顶点为 P 0 P_0 P0、 P 1 P_1 P1和 P 2 P_2 P2,另一条Bezier曲线的顶点是 Q 0 Q_0 Q0、 Q 1 Q_1 Q1和 Q 2 Q_2 Q2。 P 2 = Q 0 P_2=Q_0 P2=Q0。写出两条曲线可以精确合并(表示)为一条二次Bezier曲线的条件
假设原曲线的控制顶点为 p 0 p_0 p0,X, Q 2 Q_2 Q2。因为两条曲线可以精确合并,说明两条曲线是由一条曲线在参数 0 < t < 1 0<t<1 0<t<1处分割得到。
要求1: P 1 P_1 P1, P 2 ( Q 0 ) P_2(Q_0) P2(Q0), Q 1 Q_1 Q1三点共线
要求2:根据抛物线三切线定理:
Q 2 − Q 1 Q 1 − X = Q 1 − Q 0 Q 0 − P 1 = X − P 1 P 1 − P 0 \frac{Q_2-Q_1}{Q_1-X}=\frac{Q_1-Q_0}{Q_0-P_1}=\frac{X-P_1}{P_1-P_0} Q1−XQ2−Q1=Q0−P1Q1−Q0=P1−P0X−P1
消除X,得到
Q 1 − Q 2 − Q 1 Q 1 − Q 0 ( Q 0 − P 1 ) = P 1 − P 1 − P 0 P 2 − P 1 ( Q 1 − Q 0 ) Q_1-\frac{Q_2-Q_1}{Q_1-Q_0}(Q_0-P_1)=P_1-\frac{P_1-P_0}{P_2-P_1}(Q_1-Q_0) Q1−Q1−Q0Q2−Q1(Q0−P1)=P1−P2−P1P1−P0(Q1−Q0)
三、4、已知Bezier曲线上的4个点分别为 Q 0 ( 50 , 0 ) Q_0(50,0) Q0(50,0), Q 1 ( 100 , 0 ) Q_1(100,0) Q1(100,0), Q 2 ( 0 , 50 ) Q_2(0,50) Q2(0,50), Q 3 ( 0 , 100 ) Q_3(0,100) Q3(0,100),它们对应的参数分别为0,1/3,2/3,1,反求Bezier曲线的控制顶点。给出4次Bezier曲线的控制顶点。给出4次Bezier曲线退化为3次Bezier,控制顶点 P 0 P_0 P0, P 1 P_1 P1, P 2 P_2 P2, P 3 P_3 P3应该满足的条件
由曲线上的点和对应t,反求控制顶点
-
反求控制顶点
-
假设控制顶点为 P 0 P_0 P0, P 1 P_1 P1, P 2 P_2 P2, P 3 P_3 P3,由Bezier曲线(端点)性质可知
-
P 0 = Q 0 = Q ( 0 ) = ( 50 , 0 ) P_0=Q_0=Q(0)=(50,0) P0=Q0=Q(0)=(50,0) P 3 = Q 3 = Q ( 1 ) = ( 0 , 100 ) P_3=Q_3=Q(1)=(0,100) P3=Q3=Q(1)=(0,100)
-
根据Bezier曲线的公式(各坐标的插值公式定义: P ( t ) = ∑ i = 0 n P i C n i t i ( 1 − t ) n − i P(t)=\sum_{i=0}^{n}{P_i}{C_n^i}t^i(1-t)^{n-i} P(t)=∑i=0nPiCniti(1−t)n−i)
- Q 1 Q_1 Q1: ( 8 / 27 ) P 0 + ( 4 / 9 ) P 1 + ( 2 / 9 ) P 2 + ( 1 / 27 ) P 3 = ( 100 , 0 ) (8/27)P_0+(4/9)P_1+(2/9)P_2+(1/27)P_3=(100,0) (8/27)P0+(4/9)P1+(2/9)P2+(1/27)P3=(100,0)
- Q 2 Q_2 Q2: ( 1 / 27 ) P 0 + ( 2 / 9 ) P 1 + ( 4 / 9 ) P 2 + ( 8 / 27 ) P 3 = ( 0 , 50 ) (1/27)P_0+(2/9)P_1+(4/9)P_2+(8/27)P_3=(0,50) (1/27)P0+(2/9)P1+(4/9)P2+(8/27)P3=(0,50)
- 求解得 P 1 = ( 775 / 3 , − 125 / 3 ) P_1=(775/3,-125/3) P1=(775/3,−125/3); P 2 = ( − 400 / 3 , 200 / 3 ) P_2=(-400/3,200/3) P2=(−400/3,200/3)
-
-
退化条件
对Bezier曲线定义式展开,4 次 Bezier 曲线退化为三次 Bezier 的条件是参数t最高次 t 3 t^3 t3的系数和为0:
Δ 3 P 0 = ∑ i = 0 3 ( − 1 ) i C 3 i P 3 − i = 0 \Delta^3P_0=\sum_{i=0}^{3}(-1)^iC_3^iP_{3-i}=0 Δ3P0=∑i=03(−1)iC3iP3−i=0
三、5、设一条三次 Bezier 曲线的控制顶点为 P0,P1,P2,P3。对曲线上一点 P(0.5),及一个给定的目标点 T,给出一种调整 Bezier 曲线形状的方法,使得 P(0.5)精确通过点T。
假设我们改变其中的一个控制顶点,比如把 P 1 P_1 P1改成 P 1 + λ P_1+\lambda P1+λ,使得P(0.5)精确通过点T,将修改后的曲线记为 P ^ ( t ) \widehat{P}(t) P (t),则
P ^ ( t ) ∣ 1 2 = ∑ t = 0 3 P i B i , 3 ( t ) ∣ 1 2 + λ B 1 , 3 ( 1 2 ) \widehat{P}(t)|_\frac{1}{2}=\sum_{t=0}^3P_iB_{i,3}(t)|_\frac{1}{2}+\lambda{B}_{1,3}(\frac{1}{2}) P (t)∣21=∑t=03PiBi,3(t)∣21+λB1,3(21)
即 T = P ( 1 2 ) + λ B 1 , 3 ( 1 2 ) T = P(\frac{1}{2})+\lambda{B_{1,3}}(\frac{1}{2}) T=P(21)+λB1,3(21)
求得 λ = ( T − P ( 1 2 ) / B 1 , 3 ( 1 2 ) ) \lambda = (T-P(\frac{1}{2})/B_{1,3}(\frac12)) λ=(T−P(21)/B1,3(21))
所以调整方法为:把 P 1 P_1 P1调整到 P 1 + ( T − P ( 1 2 ) ) / B 1 , 3 ( 1 2 ) P_1+(T-P(\frac{1}{2}))/B_{1,3}(\frac12) P1+(T−P(21))/B1,3(21)
三、6、计算以(30,0),(60,10),(80,30),(90,60),(90,90)为控制顶点的 4 次 Bézier 曲线在t=1/2 处的值,并画出 de Casteljau 三角形。
递推公式:$P_0^n =(1-t)P_0{n-1}+tP_1{n-1} $
de Casteljau 三角形如下
P 0 ( 30 , 0 ) P_0(30,0) P0(30,0)↘
P 1 ( 60 , 10 ) P_1(60,10) P1(60,10)↘➡ P 0 1 ( 45 , 5 ) P_0^1(45,5) P01(45,5)↘
P 2 ( 80 , 30 ) P_2(80,30) P2(80,30)↘➡ P 1 1 ( 70 , 20 ) P_1^1(70,20) P11(70,20)↘➡ P 0 2 ( 57.5 , 12.5 ) P_0^2(57.5,12.5) P02(57.5,12.5)↘
P 3 ( 90 , 60 ) P_3(90,60) P3(90,60)↘➡ P 2 1 ( 85 , 45 ) P_2^1(85,45) P21(85,45)↘➡ P 1 2 ( 77.5 , 32.5 ) P_1^2(77.5,32.5) P12(77.5,32.5)↘➡ P 0 3 ( 67.5 , 22.5 ) P_0^3(67.5,22.5) P03(67.5,22.5)↘
P 4 ( 90 , 90 ) P_4(90,90) P4(90,90)➡ P 2 1 ( 70 , 75 ) P_2^1(70,75) P21(70,75)➡ P 2 2 ( 87.5 , 60 ) P_2^2(87.5,60) P22(87.5,60)➡ P 1 3 ( 82.5 , 46.25 ) P_1^3(82.5,46.25) P13(82.5,46.25)➡ P 0 4 ( 75 , 34.375 ) P_0^4(75,34.375) P04(75,34.375)
三、7、推导 Bezier 曲线的升阶公式;给定三次 Bezier 曲线的控制顶点(0,0), (0,100), (100,0), (100,100),计算升阶一次后的控制顶点。
升阶:保持Bezier曲线的形状和方向不变,增加定义它的控制顶点,提高该Bezier曲线的次数
推导 Bezier 曲线的升阶公式
设给定原始控制顶点 P 0 , P 1 , . . . , P n P_0,P_1,...,P_n P0,P1,...,Pn,定义了一条n次Bezier曲线:
P ( t ) = ∑ i = 0 n P i B i , n ( t ) t ∈ [ 0 , 1 ] P(t)=\sum_{i=0}^{n}P_iB_{i,n}(t)\ \ \ \ \ \ t\in[0,1] P(t)=∑i=0nPiBi,n(t) t∈[0,1]
增加一个顶点,仍定义同一条曲线的新控制顶点为 P 0 ∗ P_0^* P0∗, P 1 ∗ P_1^* P1∗,…, P n + 1 ∗ P_{n+1}^* Pn+1∗,则有
$\sum_{i=0}{n}P_iC_niti(1-t){n-i} = \sum_{i=0}{n+1}P_i*C_{n+1}iti(1-t)^{n+1-i} $
对上式左边乘以(t+(1-t)),得到
$\sum_{i=0}{n}P_iC_ni(t{i+1}(1-t){n-i}+t{i}(1-t){n+1-i}) = \sum_{i=0}{n+1}P_i*C_{n+1}iti(1-t)^{n+1-i} $
对比左右两式 t i ( 1 − t ) n + 1 − i t^{i}(1-t)^{n+1-i} ti(1−t)n+1−i的系数,得
P i ∗ C n + 1 i = P i C n i + P i − 1 C n i − 1 P_i^*C_{n+1}^i=P_iC_{n}^i+P_{i-1}C_{n}^{i-1} Pi∗Cn+1i=PiCni+Pi−1Cni−1
化简得
P i ∗ = ( 1 − i n + 1 ) P i + i n + 1 P i − 1 P_i^*=(1-\frac{i}{n+1})P_i+\frac{i}{n+1}P_{i-1} Pi∗=(1−n+1i)Pi+n+1iPi−1
计算升阶一次后的控制顶点。
本题n=3
原始 | 升阶 |
---|---|
P 0 ( 0 , 0 ) P_0(0,0) P0(0,0) | P 0 ∗ ( 0 , 0 ) P_0^*(0,0) P0∗(0,0) |
P 1 ( 0 , 100 ) P_1(0,100) P1(0,100) | P 1 ∗ ( 0 , 75 ) P_1^*(0,75) P1∗(0,75) |
P 2 ( 100 , 0 ) P_2(100,0) P2(100,0) | P 2 ∗ ( 50 , 50 ) P_2^*(50,50) P2∗(50,50) |
P 3 ( 100 , 100 ) P_3(100,100) P3(100,100) | P 3 ∗ ( 100 , 25 ) P_3^*(100,25) P3∗(100,25) |
P 4 ∗ ( 100 , 100 ) P_4^*(100,100) P4∗(100,100) |
三、9、试证明 n 次 Bezier 曲线退化为 n-1 次 Bezier 曲线的条件为 Δ n P 0 \Delta^nP_0 ΔnP0=0。
n次Bezier曲线:
P ( t ) = ∑ i = 0 n P i B i , n ( t ) = ∑ i = 0 n P i C n i t i ( 1 − t ) n − i P(t)=\sum_{i=0}^{n}P_iB_{i,n}(t)=\sum_{i=0}^{n}P_iC_n^it^i(1-t)^{n-i} P(t)=∑i=0nPiBi,n(t)=∑i=0nPiCniti(1−t)n−i
可知 t n t^n tn系数为
∑ i = 0 n ( − 1 ) i C n n − i P n − i = ∑ i = 0 n ( − 1 ) i C n i P n − i \sum_{i=0}^{n}(-1)^{i}C_{n}^{n-i}P_{n-i}=\sum_{i=0}^{n}(-1)^{i}C_{n}^{i}P_{n-i} ∑i=0n(−1)iCnn−iPn−i=∑i=0n(−1)iCniPn−i
根据公式
Δ k P i = Δ ( Δ k − 1 P i ) = Δ k − 1 P i + 1 − Δ k − 1 P i = ∑ i = 0 k ( − 1 ) i C k i P k − i \Delta^{k}P_{i}=\Delta(\Delta^{k-1}P_i)=\Delta^{k-1}P_{i+1}-\Delta^{k-1}P_i=\sum_{i=0}^{k}(-1)^{i}C_{k}^{i}P_{k-i} ΔkPi=Δ(Δk−1Pi)=Δk−1Pi+1−Δk−1Pi=∑i=0k(−1)iCkiPk−i
所以可得:
Δ n P 0 = ∑ i = 0 n ( − 1 ) i C n i P n − i \Delta^nP_0 = \sum_{i=0}^{n}(-1)^{i}C_{n}^{i}P_{n-i} ΔnP0=∑i=0n(−1)iCniPn−i
n 次 Bezier 曲线退化为 n-1 次 Bezier 曲线条件是 t 的次数最高项 t n t_n tn系数等于 0,所以原式 Δ n P 0 \Delta^nP_0 ΔnP0=0得证
三、14、形体表示有哪些常见的方法
- 线框模型
- 只能表示一些简单模型
- 实体模型
- 完整的、无歧义地表示三维形状
- 不适合物体表面的运算:关照计算、阴影计算和光线求交计算
- 表面模型
- 基于连续参数曲面的表示方法:样条等
- 离散表面表示方法:三角网格。
- 容易表达工业中较光滑的曲线曲面,难以表达真实世界的物体