﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-小阮的菜田-随笔分类-计算几何</title><link>http://www.cppblog.com/jericho/category/15963.html</link><description>一个人一种命，各安天命吧。</description><language>zh-cn</language><lastBuildDate>Thu, 30 Jun 2011 18:05:01 GMT</lastBuildDate><pubDate>Thu, 30 Jun 2011 18:05:01 GMT</pubDate><ttl>60</ttl><item><title>N个点中求三个点组成的三角形面积最大</title><link>http://www.cppblog.com/jericho/archive/2011/06/30/149850.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 30 Jun 2011 12:37:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/06/30/149850.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/149850.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/06/30/149850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/149850.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/149850.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 先求凸包, 最大三角形的三个顶点一定在凸包的点上.Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//Rotating&nbsp;Calipers&nbsp;algorithm#include&nbsp;&lt;stdio.h&gt;#includ...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/06/30/149850.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/149850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-06-30 20:37 <a href="http://www.cppblog.com/jericho/archive/2011/06/30/149850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求多边形面积</title><link>http://www.cppblog.com/jericho/archive/2011/04/27/145171.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Wed, 27 Apr 2011 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/04/27/145171.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/145171.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/04/27/145171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/145171.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/145171.html</trackback:ping><description><![CDATA[<br>根据差乘<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;polygonArea(TPolygon&nbsp;p,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br><img id=Codehighlighter1_38_241_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_241_Open_Text.style.display='none'; Codehighlighter1_38_241_Closed_Image.style.display='inline'; Codehighlighter1_38_241_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_38_241_Closed_Image onclick="this.style.display='none'; Codehighlighter1_38_241_Closed_Text.style.display='none'; Codehighlighter1_38_241_Open_Image.style.display='inline'; Codehighlighter1_38_241_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_38_241_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_38_241_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">已知多边形各顶点的坐标，求其面积</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;area;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_130_213_Open_Image onclick="this.style.display='none'; Codehighlighter1_130_213_Open_Text.style.display='none'; Codehighlighter1_130_213_Closed_Image.style.display='inline'; Codehighlighter1_130_213_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_130_213_Closed_Image onclick="this.style.display='none'; Codehighlighter1_130_213_Closed_Text.style.display='none'; Codehighlighter1_130_213_Open_Image.style.display='inline'; Codehighlighter1_130_213_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_130_213_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_130_213_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;area&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(p.p[i&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].x&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p.p[i&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;n].y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;p.p[i&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;n].x&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p.p[i&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].y);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;area&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/jericho/aggbug/145171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-04-27 21:29 <a href="http://www.cppblog.com/jericho/archive/2011/04/27/145171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 2079 Triangle (N个点找最大三角形: 凸包)</title><link>http://www.cppblog.com/jericho/archive/2011/04/26/145083.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 26 Apr 2011 12:55:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/04/26/145083.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/145083.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/04/26/145083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/145083.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/145083.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题意：二面平面，给N个点，求最大三角形。分析：先求凸包降低数据规模，最大三角形肯定是凸包的点，然后枚举凸包的各点求三角形。#include&nbsp;&lt;stdio.h&gt;#include&nbsp;&lt;stdlib.h&gt;#include&nbsp;&lt;math.h&gt;const&nbsp;int&nbsp;MAXN&nbsp;=&nbsp;50005;int&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/04/26/145083.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/145083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-04-26 20:55 <a href="http://www.cppblog.com/jericho/archive/2011/04/26/145083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点定位问题: 点q是否在多边形P内</title><link>http://www.cppblog.com/jericho/archive/2011/02/06/139768.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Sun, 06 Feb 2011 14:55:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/02/06/139768.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/139768.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/02/06/139768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/139768.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/139768.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 判断点q是否在多边形内的一种方法，过q作水平射线L，&nbsp;&nbsp;如果L与多边形P的边界不相交，则q在P的外部。否则，&nbsp;&nbsp;L和P的边界相交，具体地说，交点个数为奇（偶）数时，点q在P的内（外）部。（参考 计算几何P19 ）/**//*判断点q是否在多边形内的一种方法，过q作水平射线L，如果L与多边形P的边界不相交，则q在P的外部。否则，L和P的边界相交，具体地说，...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/02/06/139768.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/139768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-02-06 22:55 <a href="http://www.cppblog.com/jericho/archive/2011/02/06/139768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算几何 - 判断线段相交(转)</title><link>http://www.cppblog.com/jericho/archive/2011/01/18/138719.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 18 Jan 2011 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/01/18/138719.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/138719.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/01/18/138719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/138719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/138719.html</trackback:ping><description><![CDATA[<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan" class=MsoNormal align=left><strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">一<span lang=EN-US>.</span>矢量基本知识</span></strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">因为后面的计算需要一些矢量的基本知识，这里只是简单的列举如下，如果需要更加详细的信息，可以自行搜索<span lang=EN-US>wikipedia</span>或<span lang=EN-US>google</span>。<span lang=EN-US><br><strong>1.</strong></span><strong>矢量的概念</strong>：如果一条线段的端点是有次序之分的，我们把这种线段成为有向线段<span lang=EN-US>(directed segment)</span>。如果有向线段<span lang=EN-US>p1p2</span>的起点<span lang=EN-US>p1</span>在坐标原点，我们可以把它称为矢量<span lang=EN-US>(vector)p2</span>。<span lang=EN-US><br><strong>2.</strong></span><strong>矢量加减法</strong>：设二维矢量<span lang=EN-US>P = ( x1, y1 )</span>，<span lang=EN-US>Q = ( x2 , y2 )</span>，则矢量加法定义为：<span lang=EN-US> P + Q = ( x1 + x2 , y1 + y2 )</span>，同样的，矢量减法定义为：<span lang=EN-US> P - Q = ( x1 - x2 , y1 - y2 )</span>。显然有性质<span lang=EN-US> P + Q = Q + P</span>，<span lang=EN-US>P - Q = - ( Q - P )</span>。<span lang=EN-US><br><strong>3.</strong></span><strong>矢量的叉积</strong>：计算矢量叉积是与直线和线段相关算法的核心部分。设矢量<span lang=EN-US>P = ( x1, y1 )</span>，<span lang=EN-US>Q = ( x2, y2 )</span>，则矢量叉积定义为由<span lang=EN-US>(0,0)</span>、<span lang=EN-US>p1</span>、<span lang=EN-US>p2</span>和<span lang=EN-US>p1+p2</span>所组成的平行四边形的带符号的面积，即：<span lang=EN-US>P &#215; Q = x1*y2 - x2*y1</span>，其结果是一个标量。显然有性质<span lang=EN-US> P &#215; Q = - ( Q &#215; P ) </span>和<span lang=EN-US> P &#215; ( - Q ) = - ( P &#215; Q )</span>。一般在不加说明的情况下，本文下述算法中所有的点都看作矢量，两点的加减法就是矢量相加减，而点的乘法则看作矢量叉积。<span lang=EN-US><br></span>叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系：<span lang=EN-US><br></span>　　若<span lang=EN-US> P &#215; Q &gt; 0 , </span>则<span lang=EN-US>P</span>在<span lang=EN-US>Q</span>的顺时针方向。<span lang=EN-US><br></span>　　若<span lang=EN-US> P &#215; Q &lt; 0 , </span>则<span lang=EN-US>P</span>在<span lang=EN-US>Q</span>的逆时针方向。<span lang=EN-US><br></span>　　若<span lang=EN-US> P &#215; Q = 0 , </span>则<span lang=EN-US>P</span>与<span lang=EN-US>Q</span>共线，但可能同向也可能反向。<span lang=EN-US><br><strong>4.</strong></span><strong>折线段的拐向判断</strong>：折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段<span lang=EN-US>p0p1</span>和<span lang=EN-US>p1p2</span>，通过计算<span lang=EN-US>(p2 - p0) &#215; (p1 - p0)</span>的符号便可以确定折线段的拐向：<span lang=EN-US><br></span>　　若<span lang=EN-US>(p2 - p0) &#215; (p1 - p0) &gt; 0,</span>则<span lang=EN-US>p0p1</span>在<span lang=EN-US>p1</span>点拐向右侧后得到<span lang=EN-US>p1p2</span>。<span lang=EN-US><br></span>　　若<span lang=EN-US>(p2 - p0) &#215; (p1 - p0) &lt; 0,</span>则<span lang=EN-US>p0p1</span>在<span lang=EN-US>p1</span>点拐向左侧后得到<span lang=EN-US>p1p2</span>。<span lang=EN-US><br></span>　　若<span lang=EN-US>(p2 - p0) &#215; (p1 - p0) = 0,</span>则<span lang=EN-US>p0</span>、<span lang=EN-US>p1</span>、<span lang=EN-US>p2</span>三点共线。<span lang=EN-US><br></span>这一条判断也可用来判断点在线段或直线的哪一测。<span lang=EN-US><br><br></span>为了后文的叙述方便，先定义几个结构：<span lang=EN-US><o:p></o:p></span></span></p>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_12_39_Open_Image onclick="this.style.display='none'; Codehighlighter1_12_39_Open_Text.style.display='none'; Codehighlighter1_12_39_Closed_Image.style.display='inline'; Codehighlighter1_12_39_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_12_39_Closed_Image onclick="this.style.display='none'; Codehighlighter1_12_39_Closed_Text.style.display='none'; Codehighlighter1_12_39_Open_Image.style.display='inline'; Codehighlighter1_12_39_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;point</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_12_39_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_12_39_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_52_91_Open_Image onclick="this.style.display='none'; Codehighlighter1_52_91_Open_Text.style.display='none'; Codehighlighter1_52_91_Closed_Image.style.display='inline'; Codehighlighter1_52_91_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_52_91_Closed_Image onclick="this.style.display='none'; Codehighlighter1_52_91_Closed_Text.style.display='none'; Codehighlighter1_52_91_Open_Image.style.display='inline'; Codehighlighter1_52_91_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;v</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_52_91_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_52_91_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;start;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;end;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">计算两条直线的叉积<span lang=EN-US>(cross production), </span>这里由于定义的都是二维的情况，本质上说，在平面上两个向量的叉积应该是垂直平面的，这里函数返回的整数值即为<span lang=EN-US>z</span>轴上的值：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_30_436_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_436_Open_Text.style.display='none'; Codehighlighter1_30_436_Closed_Image.style.display='inline'; Codehighlighter1_30_436_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_30_436_Closed_Image onclick="this.style.display='none'; Codehighlighter1_30_436_Closed_Text.style.display='none'; Codehighlighter1_30_436_Open_Image.style.display='inline'; Codehighlighter1_30_436_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;crossProduct(v</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;v1,&nbsp;v</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;v2)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_30_436_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_30_436_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;vt1,&nbsp;vt2;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt1.start.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt1.start.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt1.end.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end.x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">start.x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt1.end.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end.y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">start.y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt2.start.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt2.start.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt2.end.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end.x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">start.x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vt2.end.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end.y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;v2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">start.y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;vt1.end.x&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;vt2.end.y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;vt2.end.x&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;vt1.end.y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br>
<p style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><strong>二<span lang=EN-US>.</span>判断两条直线相交</strong><span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>先来看一个简单的情况，即判断两条直线是否相交。<span lang=EN-US><br></span>第一个可能会想到的办法，就是判断斜率，这个在中学时代就学过了，不过斜率需要考虑垂直的特殊情况，比较麻烦。更好的办法或许是计算两个向量的叉积，如果为<span lang=EN-US>0</span>，则是平行或者重合的，否则两直线相交。<span lang=EN-US><br></span>代码就不贴了，直接调用上面的函数就<span lang=EN-US>ok</span>了。<br><span lang=EN-US><br><br></span><strong>三<span lang=EN-US>.</span>判断两线段相交</strong><span lang=EN-US><br></span>经典方法，就是跨立试验了，即如果一条线段跨过另一条线段，则线段的两个端点分别在另一条线段的两侧。但是，还需要检测边界情况，即两条线段中可能某条线段的某个端点正好落在另一条线段上。这也是算法导论中介绍的算法。<span lang=EN-US><br></span>程序模拟如下：<span lang=EN-US><o:p></o:p></span></span></p>
<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_45_233_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_233_Open_Text.style.display='none'; Codehighlighter1_45_233_Closed_Image.style.display='inline'; Codehighlighter1_45_233_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_45_233_Closed_Image onclick="this.style.display='none'; Codehighlighter1_45_233_Closed_Text.style.display='none'; Codehighlighter1_45_233_Open_Image.style.display='inline'; Codehighlighter1_45_233_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;direction(point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pi,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pj,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pk</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_45_233_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_45_233_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;p1,&nbsp;p2;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;crossProduct(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p1,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p2);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_282_746_Open_Image onclick="this.style.display='none'; Codehighlighter1_282_746_Open_Text.style.display='none'; Codehighlighter1_282_746_Closed_Image.style.display='inline'; Codehighlighter1_282_746_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_282_746_Closed_Image onclick="this.style.display='none'; Codehighlighter1_282_746_Closed_Text.style.display='none'; Codehighlighter1_282_746_Open_Image.style.display='inline'; Codehighlighter1_282_746_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;onSegment(point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pi,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pj,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pk</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_282_746_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_282_746_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;minx,&nbsp;miny,&nbsp;maxx,&nbsp;maxy;&nbsp;<br><img id=Codehighlighter1_340_399_Open_Image onclick="this.style.display='none'; Codehighlighter1_340_399_Open_Text.style.display='none'; Codehighlighter1_340_399_Closed_Image.style.display='inline'; Codehighlighter1_340_399_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_340_399_Closed_Image onclick="this.style.display='none'; Codehighlighter1_340_399_Closed_Text.style.display='none'; Codehighlighter1_340_399_Open_Image.style.display='inline'; Codehighlighter1_340_399_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_340_399_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_340_399_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_404_460_Open_Image onclick="this.style.display='none'; Codehighlighter1_404_460_Open_Text.style.display='none'; Codehighlighter1_404_460_Closed_Image.style.display='inline'; Codehighlighter1_404_460_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_404_460_Closed_Image onclick="this.style.display='none'; Codehighlighter1_404_460_Closed_Text.style.display='none'; Codehighlighter1_404_460_Open_Image.style.display='inline'; Codehighlighter1_404_460_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">else</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_404_460_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_404_460_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_492_551_Open_Image onclick="this.style.display='none'; Codehighlighter1_492_551_Open_Text.style.display='none'; Codehighlighter1_492_551_Closed_Image.style.display='inline'; Codehighlighter1_492_551_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_492_551_Closed_Image onclick="this.style.display='none'; Codehighlighter1_492_551_Closed_Text.style.display='none'; Codehighlighter1_492_551_Open_Image.style.display='inline'; Codehighlighter1_492_551_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_492_551_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_492_551_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;miny&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_556_612_Open_Image onclick="this.style.display='none'; Codehighlighter1_556_612_Open_Text.style.display='none'; Codehighlighter1_556_612_Closed_Image.style.display='inline'; Codehighlighter1_556_612_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_556_612_Closed_Image onclick="this.style.display='none'; Codehighlighter1_556_612_Closed_Text.style.display='none'; Codehighlighter1_556_612_Open_Image.style.display='inline'; Codehighlighter1_556_612_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">else</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_556_612_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_556_612_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;miny&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pi</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pj</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(minx&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;maxx&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;miny&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;pk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">y&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;maxy)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_815_1303_Open_Image onclick="this.style.display='none'; Codehighlighter1_815_1303_Open_Text.style.display='none'; Codehighlighter1_815_1303_Closed_Image.style.display='inline'; Codehighlighter1_815_1303_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_815_1303_Closed_Image onclick="this.style.display='none'; Codehighlighter1_815_1303_Closed_Text.style.display='none'; Codehighlighter1_815_1303_Open_Image.style.display='inline'; Codehighlighter1_815_1303_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;segmentIntersect(point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p1,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p2,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p3,&nbsp;point</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p4)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_815_1303_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_815_1303_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;direction(p3,&nbsp;p4,&nbsp;p1);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;direction(p3,&nbsp;p4,&nbsp;p2);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;direction(p1,&nbsp;p2,&nbsp;p3);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d4&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;direction(p1,&nbsp;p2,&nbsp;p4);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(d1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d2&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;d3&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;d4&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">d1&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;onSegment(p3,&nbsp;p4,&nbsp;p1))&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">d2&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;onSegment(p3,&nbsp;p4,&nbsp;p2))&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">d3&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;onSegment(p1,&nbsp;p2,&nbsp;p3))&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">d4&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;onSegment(p1,&nbsp;p2,&nbsp;p4))&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;</span></div>
<br><br><span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">实际上，如果想改进上述算法，还可以在跨立试验前加一步，就是先做快速排斥试验。那就是，先分别判断以两条线段为对角线的矩形是否相交，如果不相交，则两个线段肯定不相交。<span lang=EN-US><br><br></span><strong>四<span lang=EN-US>.</span>判断两条线段相交，然后计算交点</strong><span lang=EN-US><br></span>设一条线段为<span lang=EN-US>L0=P1P2, </span>另一条线段或直线为<span lang=EN-US>L1=Q1Q2, </span>要计算的就是<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>的交点。<br><span lang=EN-US><br>1.</span>首先判断<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>是否相交<span lang=EN-US>(</span>方法已在前文讨论过<span lang=EN-US>), </span>如果不相交则没有交点<span lang=EN-US>, </span>否则说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>一定有交点<span lang=EN-US>, </span>下面就将<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>都看作直线来考虑<span lang=EN-US>. <br><br>2.</span>如果<span lang=EN-US>P1</span>和<span lang=EN-US>P2</span>横坐标相同<span lang=EN-US>, </span>即<span lang=EN-US>L0</span>平行于<span lang=EN-US>Y</span>轴<span lang=EN-US> <br>a)</span>若<span lang=EN-US>L1</span>也平行于<span lang=EN-US>Y</span>轴<span lang=EN-US> <br>&nbsp;&nbsp;&nbsp; i.</span>若<span lang=EN-US>P1</span>的纵坐标和<span lang=EN-US>Q1</span>的纵坐标相同<span lang=EN-US>, </span>说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>共线<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是直线的话他们有无穷的交点<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是线段的话可用<span lang=EN-US>"</span>计算两条共线线段的交点<span lang=EN-US>"</span>的算法求他们的交点<span lang=EN-US>(</span>该方法在前文已讨论过<span lang=EN-US>);<br>&nbsp;&nbsp;&nbsp; ii.</span>否则说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>平行<span lang=EN-US>, </span>他们没有交点<span lang=EN-US>; <br>b)</span>若<span lang=EN-US>L1</span>不平行于<span lang=EN-US>Y</span>轴<span lang=EN-US>, </span>则交点横坐标为<span lang=EN-US>P1</span>的横坐标<span lang=EN-US>, </span>代入到<span lang=EN-US>L1</span>的直线方程中可以计算出交点纵坐标<span lang=EN-US>; <br><br>3.</span>如果<span lang=EN-US>P1</span>和<span lang=EN-US>P2</span>横坐标不同<span lang=EN-US>, </span>但是<span lang=EN-US>Q1</span>和<span lang=EN-US>Q2</span>横坐标相同<span lang=EN-US>, </span>即<span lang=EN-US>L1</span>平行于<span lang=EN-US>Y</span>轴<span lang=EN-US>, </span>则交点横坐标为<span lang=EN-US>Q1</span>的横坐标<span lang=EN-US>, </span>代入到<span lang=EN-US>L0</span>的直线方程中可以计算出交点纵坐标<span lang=EN-US>; <br><br>4.</span>如果<span lang=EN-US>P1</span>和<span lang=EN-US>P2</span>纵坐标相同<span lang=EN-US>, </span>即<span lang=EN-US>L0</span>平行于<span lang=EN-US>X</span>轴<span lang=EN-US><br>a)</span>若<span lang=EN-US>L1</span>也平行于<span lang=EN-US>X</span>轴<span lang=EN-US>,<br>&nbsp;&nbsp;&nbsp; i.</span>若<span lang=EN-US>P1</span>的横坐标和<span lang=EN-US>Q1</span>的横坐标相同<span lang=EN-US>, </span>说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>共线<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是直线的话他们有无穷的交点<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是线段的话可用<span lang=EN-US>"</span>计算两条共线线段的交点<span lang=EN-US>"</span>的算法求他们的交点<span lang=EN-US>(</span>该方法在前文已讨论过<span lang=EN-US>);<br>&nbsp;&nbsp;&nbsp; ii.</span>否则说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>平行<span lang=EN-US>, </span>他们没有交点<span lang=EN-US>; <br>b)</span>若<span lang=EN-US>L1</span>不平行于<span lang=EN-US>X</span>轴<span lang=EN-US>, </span>则交点纵坐标为<span lang=EN-US>P1</span>的纵坐标<span lang=EN-US>, </span>代入到<span lang=EN-US>L1</span>的直线方程中可以计算出交点横坐标<span lang=EN-US>; <br><br>5.</span>如果<span lang=EN-US>P1</span>和<span lang=EN-US>P2</span>纵坐标不同<span lang=EN-US>, </span>但是<span lang=EN-US>Q1</span>和<span lang=EN-US>Q2</span>纵坐标相同<span lang=EN-US>, </span>即<span lang=EN-US>L1</span>平行于<span lang=EN-US>X</span>轴<span lang=EN-US>, </span>则交点纵坐标为<span lang=EN-US>Q1</span>的纵坐标<span lang=EN-US>, </span>代入到<span lang=EN-US>L0</span>的直线方程中可以计算出交点横坐标<span lang=EN-US>; <br><br>6.</span>剩下的情况就是<span lang=EN-US>L1</span>和<span lang=EN-US>L0</span>的斜率均存在且不为<span lang=EN-US>0</span>的情况<span lang=EN-US> <br>a)</span>计算出<span lang=EN-US>L0</span>的斜率<span lang=EN-US>K0, L1</span>的斜率<span lang=EN-US>K1;<br>b)</span>如果<span lang=EN-US>K1 = K2 <br>&nbsp;&nbsp;&nbsp; i.</span>如果<span lang=EN-US>Q1</span>在<span lang=EN-US>L0</span>上<span lang=EN-US>, </span>则说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>共线<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是直线的话有无穷交点<span lang=EN-US>, </span>假如<span lang=EN-US>L1</span>是线段的话可用<span lang=EN-US>"</span>计算两条共线线段的交点<span lang=EN-US>"</span>的算法求他们的交点<span lang=EN-US>(</span>该方法在前文已讨论过<span lang=EN-US>);<br>&nbsp;&nbsp;&nbsp; ii.</span>如果<span lang=EN-US>Q1</span>不在<span lang=EN-US>L0</span>上<span lang=EN-US>, </span>则说明<span lang=EN-US>L0</span>和<span lang=EN-US>L1</span>平行<span lang=EN-US>, </span>他们没有交点<span lang=EN-US>.<br>c)</span>联立两直线的方程组可以解出交点来<span lang=EN-US><br></span>这个算法并不复杂<span lang=EN-US>, </span>但是要分情况讨论清楚<span lang=EN-US>, </span>尤其是当两条线段共线的情况需要单独考虑<span lang=EN-US>, </span>所以在前文将求两条共线线段的算法单独写出来<span lang=EN-US>. </span>另外<span lang=EN-US>, </span>一开始就先利用矢量叉乘判断线段与线段<span lang=EN-US>(</span>或直线<span lang=EN-US>)</span>是否相交<span lang=EN-US>, </span>如果结果是相交<span lang=EN-US>, </span>那么在后面就可以将线段全部看作直线来考虑<span lang=EN-US>. </span>需要注意的是<span lang=EN-US>, </span>我们可以将直线或线段方程改写为<span lang=EN-US>ax+by+c=0</span>的形式<span lang=EN-US>, </span>这样一来上述过程的部分步骤可以合并<span lang=EN-US>, </span>缩短了代码长度<span lang=EN-US>, </span>但是由于先要求出参数<span lang=EN-US>, </span>这种算法将花费更多的时间</span></span> 
<img src ="http://www.cppblog.com/jericho/aggbug/138719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-01-18 10:02 <a href="http://www.cppblog.com/jericho/archive/2011/01/18/138719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>