📄
字号:
lang=EN-US> </span></p>
<p style='margin-top:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:
0cm'><span lang=EN-US style='font-size:10.0pt;color:purple'>}</span><span
lang=EN-US> </span></p>
<p style='margin-top:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:
0cm'>注意:我们这里用整型变量<span lang=EN-US>color表示象素的颜色和灰度。 </span></p>
<p><span lang=EN-US style='font-size:10.0pt;color:#006666'><!--[if gte vml 1]><v:shape
id="_x0000_i1047" type="#_x0000_t75" alt="" style='width:10.5pt;height:10.5pt'>
<v:imagedata src="./第二章%20光栅图形学.files/image005.gif" o:href="http://learn.bitsde.com/hep/jisuanjituxing/material/CG_Gif_pub_032.gif"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=14 height=14
src="./第二章%20光栅图形学.files/image005.gif" v:shapes="_x0000_i1047"><![endif]></span><span
style='color:#006666'>举例:用<span lang=EN-US>DDA方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段。</span></span><!--[if gte vml 1]><v:shape
id="_x0000_s1026" type="#_x0000_t75" alt="" style='position:absolute;
margin-left:152pt;margin-top:0;width:192pt;height:129pt;z-index:1;
mso-wrap-distance-left:0;mso-wrap-distance-right:0;mso-position-horizontal:right;
mso-position-horizontal-relative:text;mso-position-vertical-relative:line'
o:allowoverlap="f">
<v:imagedata src="./第二章%20光栅图形学.files/image006.png" o:title="CG_Gif_2_001"/>
<w:wrap type="square"/>
</v:shape><![endif]--><![if !vml]><img width=256 height=172
src="./第二章%20光栅图形学.files/image007.gif" align=right v:shapes="_x0000_s1026"><![endif]></p>
<p><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><span
lang=EN-US style='font-size:10.0pt'> int(</span><i><span lang=EN-US
style='font-family:"Times New Roman"'>y</span></i><span lang=EN-US
style='font-size:10.0pt'>+0.5) </span><i><span lang=EN-US style='font-family:
"Times New Roman"'>y</span></i><span lang=EN-US style='font-size:10.0pt'>+0.5</span></p>
<p><span lang=EN-US style='font-size:10.0pt'>0
0 0</span></p>
<p><span lang=EN-US style='font-size:10.0pt'>1 0
0.4+0.5</span></p>
<p><span lang=EN-US style='font-size:10.0pt'>2
1 0.8+0.5</span></p>
<p><span lang=EN-US style='font-size:10.0pt'>3 1
1.2+0.5</span></p>
<p><span lang=EN-US style='font-size:10.0pt'>4
2 1.6+0.5
</span><span style='font-family:隶书;color:#FF9900'>图<span lang=EN-US>2.1.1 直线段的扫描转换</span></span></p>
<p style='line-height:200%'><span lang=EN-US style='font-size:10.0pt'> </span><span
lang=EN-US> 注意:上述分析的算法仅适用于</span><i><span lang=EN-US style='font-family:"Times New Roman"'>|k|
</span></i><span lang=EN-US>≤1的情形。在这种情况下,x每增加1,y最多增加1。当 </span><i><span
lang=EN-US style='font-family:"Times New Roman"'>|k| </span></i><span
lang=EN-US style='font-family:Symbol'>></span><span lang=EN-US> 1时,必须把</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>x</span></i>,<i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i>地位互换,<i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i>每增加<span
lang=EN-US>1,</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i>相应增加<span
lang=EN-US>1/</span><i><span lang=EN-US style='font-family:"Times New Roman"'>k</span></i>。在这个算法中,<i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i>与<i><span
lang=EN-US style='font-family:"Times New Roman"'>k</span></i>必须用浮点数表示,而且每一步都要对<i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i>进行四舍五入后取整,这使得它不利于硬件实现。</p>
<p><span lang=EN-US style='font-family:幼圆'><!--[if gte vml 1]><v:shape id="_x0000_i1048"
type="#_x0000_t75" alt="" style='width:24pt;height:24pt'>
<v:imagedata src="./第二章%20光栅图形学.files/image008.gif" o:href="http://learn.bitsde.com/hep/jisuanjituxing/material/CG_Gif_pub_023.gif"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=32 height=32
src="./第二章%20光栅图形学.files/image008.gif" v:shapes="_x0000_i1048"><![endif]><span
style='color:red'>动画演示:<a
href="http://learn.bitsde.com/hep/jisuanjituxing/Chapter2/dda_Ani/CG_Txt_2_201.htm"
target="_blank"><span style='color:red'>数值微分画线算法(DDA)</span></a></span></span></p>
<p><span lang=EN-US><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p>
<p><b><span lang=EN-US style='font-size:10.0pt;font-family:幼圆;color:gray'><a
href="http://learn.bitsde.com/hep/jisuanjituxing/Chapter2/#3"><span
style='text-decoration:none;text-underline:none'><!--[if gte vml 1]><v:shape
id="_x0000_i1049" type="#_x0000_t75" alt="" href="#3" style='width:21pt;
height:37.5pt' o:button="t">
<v:imagedata src="./第二章%20光栅图形学.files/image002.gif" o:href="http://learn.bitsde.com/hep/jisuanjituxing/material/CG_Gif_pub_021.gif"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=28 height=50
src="./第二章%20光栅图形学.files/image002.gif" v:shapes="_x0000_i1049"><![endif]></span></a></span><span
lang=EN-US><a
href="http://learn.bitsde.com/hep/jisuanjituxing/Chapter2/CG_Txt_2_008.htm"><span
style='font-family:幼圆;color:gray'>中点画线法</span></a><o:p></o:p></span></b></p>
<p style='line-height:200%'>假定直线斜率<i><span lang=EN-US style='font-family:"Times New Roman"'>k</span></i>在<span
lang=EN-US>0</span><span lang=EN-US style='font-family:"Times New Roman"'>~</span><span
lang=EN-US>1之间,当前象素点为(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i><span
lang=EN-US>,</span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i>),则下一个象素点有两种可选择点<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>P</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub>(<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>x<sub>p</sub></span></i><span
lang=EN-US>+1,</span><i><span lang=EN-US style='mso-bidi-font-size:10.0pt;
font-family:"Times New Roman"'>y<sub>p</sub></span></i>)或<i><span lang=EN-US
style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>P</span></i><sub><span
lang=EN-US>2</span></sub>(<i><span lang=EN-US style='mso-bidi-font-size:10.0pt;
font-family:"Times New Roman"'>x<sub>p</sub></span></i><span lang=EN-US>+1,</span><i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>y<sub>p</sub></span></i><span
lang=EN-US>+1)。若</span><i><span lang=EN-US style='mso-bidi-font-size:10.0pt;
font-family:"Times New Roman"'>P</span></i><sub><span lang=EN-US
style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub>与<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>P</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>2</span></sub>的中点(<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>x<sub>p</sub></span></i><span
lang=EN-US>+1,</span><i><span lang=EN-US style='mso-bidi-font-size:10.0pt;
font-family:"Times New Roman"'>y<sub>p</sub></span></i><span lang=EN-US>+0.5)</span><span
style='mso-bidi-font-size:10.0pt;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>称为</span><i><span lang=EN-US
style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>M</span></i>,<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>Q</span></i>为理想直线与<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>x</span></i><span
lang=EN-US>=</span><i><span lang=EN-US style='mso-bidi-font-size:10.0pt;
font-family:"Times New Roman"'>x<sub>p</sub></span></i><span lang=EN-US>+1垂线的交点。当</span><i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>M</span></i>在<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>Q</span></i>的下方时,则取<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>P</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>2</span></sub>应为下一个象素点;当<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>M</span></i>在<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>Q</span></i>的上方时,则取<i><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>P</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub>为下一个象素点。这就是中点画线法的基本原理。</p>
<p align=center style='text-align:center'><span lang=EN-US><!--[if gte vml 1]><v:shape
id="_x0000_i1050" type="#_x0000_t75" alt="" style='width:160.5pt;height:97.5pt'>
<v:imagedata src="./第二章%20光栅图形学.files/image009.gif" o:href="http://learn.bitsde.com/hep/jisuanjituxing/Chapter2/CG_Gif_2_002.gif"/>
</v:shape><![endif]--><![if !vml]><img border=0 width=214 height=130
src="./第二章%20光栅图形学.files/image009.gif" v:shapes="_x0000_i1050"><![endif]></span></p>
<p align=center style='text-align:center'><span lang=EN-US style='font-size:
10.0pt'> </span><span style='font-family:隶书;color:#FF9900'>图<span
lang=EN-US>2.1.2 中点画线法每步迭代涉及的象素和中点示意图</span></span></p>
<p style='line-height:200%'><span lang=EN-US style='font-size:10.0pt'>
</span>下面讨论中点画线法的实现。过点<span lang=EN-US>(</span><i><span lang=EN-US
style='font-family:"Times New Roman"'>x</span></i><sub><span lang=EN-US
style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub><span
lang=EN-US>,</span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub><span
lang=EN-US>)、(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span><span
lang=EN-US>, </span></sub><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub><span
lang=EN-US>)</span><span style='mso-bidi-font-size:10.0pt'>的直线段</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>L</span></i><span
style='mso-bidi-font-size:10.0pt;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>的</span>方程式为<i><span lang=EN-US
style='font-family:"Times New Roman"'>F</span></i><span lang=EN-US>(</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>x</span></i><span lang=EN-US>,
</span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><span
lang=EN-US>)</span><i><span lang=EN-US style='font-family:"Times New Roman"'>=ax+by+c=</span></i><span
lang=EN-US style='font-family:"Times New Roman"'>0</span>,其中,<i><span
lang=EN-US style='font-family:"Times New Roman"'>a=y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub><span
lang=EN-US>-</span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub><span
lang=EN-US>, </span><i><span lang=EN-US style='font-family:"Times New Roman"'>b</span></i><span
lang=EN-US>=</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub><span
lang=EN-US>-</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub><span
lang=EN-US>, </span><i><span lang=EN-US style='font-family:"Times New Roman"'>c</span></i><span
lang=EN-US>=</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub><i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub><span
lang=EN-US>-</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>1</span></sub><i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>0</span></sub>,欲判断中点<i><span
lang=EN-US style='font-family:"Times New Roman"'>M</span></i>在<i><span
lang=EN-US style='font-family:"Times New Roman"'>Q</span></i>点的上方还是下方,只要把<i><span
lang=EN-US style='font-family:"Times New Roman"'>M</span></i>代入<i><span
lang=EN-US style='font-family:"Times New Roman"'>F</span></i>(<i><span
lang=EN-US style='font-family:"Times New Roman"'>x</span></i>,<i><span
lang=EN-US style='font-family:"Times New Roman"'>y</span></i>),并判断它的符号<span
style='mso-bidi-font-size:10.0pt;mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman"'>即可。为此,我们</span>构造判别式<span lang=EN-US>:</span></p>
<p style='line-height:200%'><i><span lang=EN-US style='font-family:"Times New Roman"'>d</span></i><span
lang=EN-US>=</span><i><span lang=EN-US style='font-family:"Times New Roman"'>F</span></i><span
lang=EN-US>(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>M</span></i><span
lang=EN-US>)=</span><i><span lang=EN-US style='font-family:"Times New Roman"'>F</span></i><span
lang=EN-US>(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i><span
lang=EN-US>+1, </span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i><span
lang=EN-US>+0.5)=</span><i><span lang=EN-US style='font-family:"Times New Roman"'>a</span></i><span
lang=EN-US>(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>x</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i><span
lang=EN-US>+1)+</span><i><span lang=EN-US style='font-family:"Times New Roman"'>b</span></i><span
lang=EN-US>(</span><i><span lang=EN-US style='font-family:"Times New Roman"'>y</span></i><i><sub><span
lang=EN-US style='mso-bidi-font-size:10.0pt;font-family:"Times New Roman"'>p</span></sub></i><span
lang=EN-US>+0.5)+</span><i><span lang=EN-US style='font-family:"Times New Roman"'>c</span></i></p>
<p style='line-height:200%'><span lang=EN-US> 当</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>d</span></i><span lang=EN-US><0时,</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>M</span></i>在<i><span
lang=EN-US style='font-family:"Times New Roman"'>L</span></i><span lang=EN-US>(</span><i><span
lang=EN-US style='font-family:"Times New Roman"'>Q</span></i>点<span lang=EN-US>)下方,取</span><i><span
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -