<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>个人学习</title><link>http://blog.vckbase.com/hengai/category/782.html</link><description>这里的内容都是个人学习用的，大部分都是从网上看到的或者是请教别人而知道的</description><managingEditor>hengai</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>hengai</dc:creator><title>如果在程序结束后删除自身</title><link>http://blog.vckbase.com/hengai/articles/12241.html</link><pubDate>Wed, 21 Sep 2005 04:36:00 GMT</pubDate><guid>http://blog.vckbase.com/hengai/articles/12241.html</guid><wfw:comment>http://blog.vckbase.com/hengai/comments/12241.html</wfw:comment><comments>http://blog.vckbase.com/hengai/articles/12241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/hengai/comments/commentRss/12241.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hengai/services/trackbacks/12241.html</trackback:ping><description>&lt;P&gt;&lt;FONT face=宋体 size=2&gt;很多时候需要在自己的EXE结束后，删除自身，这时候问题就来了。&lt;BR&gt;有很多种方法，有一种就是调用 cmd.exe 来执行&lt;BR&gt;下面是一篇文章：&lt;A href="http://blog.vckbase.com/zyq654321/archive/2004/10/28/1142.aspx"&gt;http://blog.vckbase.com/zyq654321/archive/2004/10/28/1142.aspx&lt;/A&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=宋体 size=2&gt;
&lt;DIV class=postText&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;可执行文件即&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;EXE&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;文件在运行过程中，由系统管理其打开的句柄。此时对该文件的一些操作是被系统禁止的，比如删除操作。然而在某些场合，可能须要程序有自我删除的功能，也就是程序运行结束后删除自身。基于这个想法，可以有一种很简单的方法来实现这个基本功能。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;本方法基于两点来实现删除功能。一是利用&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;windows&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;command program&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的删除文件操作；再者就是启动新的进程来执行这个删除操作。下面就仔细说明。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Windows&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中的&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;command program&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;是一个系统的&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;shell program. &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;在&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;windows95/98/Me&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中，其文件名为&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;command.com&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;，而在&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;NT/2000/XP&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;中则是&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;cmd.exe&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;。我们可以通过环境变量&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;COMSPEC&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;得到其全路径名。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;假定目前我们所使用的是&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;XP&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;，在命令行中输入&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;:&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;cmd.exe /?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;即得到&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;command shell&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的使用方法；其中&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt; /c &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;的含义是：执行字符串指定的命令然后终断，这正是我们所须要的。这样利用&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;command shell&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;删除一个文件的命令如下：&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;cmd.exe /c &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:place w:st="on"&gt;&lt;st1:State w:st="on"&gt;del&lt;/st1:State&gt;&lt;/st1:place&gt; mypro.exe&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这里要注意一点，文件名应该是短文件名（文件名不得超过&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;8&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;个字符&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;,&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;后缀不超过&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;3&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;个字符）。如果实际文件是长文件句，那么程序中我们可以用&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;GetShortPathName&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;这个&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;API&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;函数来转换。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;接下来我们要做是如何在一新的进程中成功的执行这一指令。起来一个新进程的命令主要有&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;ShellExecute&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;和&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;CreateProcess&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;。&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;先使用&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;ShellExecute&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"&gt;为例。在程序的结束处使用如下语句：&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;　　&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-bidi-font-size: 10.5pt"&gt;ShellExecute(NULL, &lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;"open","cmd.exe", "/c &lt;st1:place w:st="on"&gt;&lt;st1:State w:st="on"&gt;del&lt;/st1:State&gt;&lt;/st1:place&gt; mypro.exe ", NULL, SW_HIDE);&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;FONT face=宋体&gt;　　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;编译后运行文件发现执行成功，文件运行完后被删除。但是后面做多次实验后，发现有时文件执行完后并不会被删除。通过分析，认为在删除操作执行时，可执行文件还未关闭。也就是说只有在执行文件的进程关闭后，执行删除操作的进程才能完成操作。这样就有了一个问题，系统负责进程和线程的调度执行，我们无法人为规定进程或线程以某种秩序执行。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;FONT face=宋体&gt;　　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;对此我的解决办法是，建立执行删除操作的进程时设定其为挂起状态，从而为其的设定一个低优先级别，同时提高执行文件的进程级别，然后才正式起动新进程。这样基本可以保证两个进程的先后执行。这样新的解决方法就是用&lt;SPAN lang=EN-US&gt;CreateProcess&lt;/SPAN&gt;以&lt;SPAN lang=EN-US&gt;CREATE_SUSPEND&lt;/SPAN&gt;标志来建立新进程，然后用&lt;SPAN lang=EN-US&gt;SetPriorityClass&lt;/SPAN&gt;来设定相应的优先级，主进程的优先级是&lt;SPAN lang=EN-US&gt;HIGH_PRIORITY_CLASS&lt;/SPAN&gt;，而执行删除操作的进程的优先级是&lt;SPAN lang=EN-US&gt;IDLE_PRIORITY_CLASS&lt;/SPAN&gt;。经过数百次的测试，删除操作都是成功的。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;FONT face=宋体&gt;　　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;下面是一个封装了删除操作的函数&lt;SPAN lang=EN-US&gt;,&lt;/SPAN&gt;函数内起动一个进程执行&lt;SPAN lang=EN-US&gt;command shell&lt;/SPAN&gt;的&lt;SPAN lang=EN-US&gt;del&lt;/SPAN&gt;命令。在程序最后结束处调用它，就可以简单的实现程序的自删除功能。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="COLOR: blue; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;#include&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt; &amp;lt;windows.h&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="COLOR: blue; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;#include&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt; &amp;lt;shellapi.h&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="COLOR: blue; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;#include&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt; &amp;lt;stdio.h&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="COLOR: blue; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;int&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt; DeleteMyExe()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;TCHAR tcsExename[MAX_PATH];&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;TCHAR tcsParam[MAX_PATH * 2];&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;TCHAR tcsCmd[MAX_PATH];&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;HANDLE hProcess = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// get exe filename and command shell program&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;( 0 == GetModuleFileName(NULL, tcsExename, MAX_PATH) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;||&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;0 == GetEnvironmentVariable(_T("COMSPEC"), tcsCmd, MAX_PATH))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;FAILRET;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// get short filename for command shell program&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;( 0 == GetShortPathName(tcsExename, tcsExename, MAX_PATH))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;FAILRET;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// create a command process, set its priority, then start it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;STARTUPINFO si;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;PROCESS_INFORMATION pi;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ZeroMemory( &amp;amp;si, &lt;SPAN style="COLOR: blue"&gt;sizeof&lt;/SPAN&gt;(si) );&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;si.cb&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;= &lt;SPAN style="COLOR: blue"&gt;sizeof&lt;/SPAN&gt;(si);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;si.dwFlags&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;= STARTF_USESHOWWINDOW;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;si.wShowWindow = SW_HIDE;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ZeroMemory( &amp;amp;pi, &lt;SPAN style="COLOR: blue"&gt;sizeof&lt;/SPAN&gt;(pi) );&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;_stprintf(tcsParam, _T("%s /c &lt;st1:place w:st="on"&gt;&lt;st1:State w:st="on"&gt;del&lt;/st1:State&gt;&lt;/st1:place&gt; %s"), tcsCmd, tcsExename);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt;(!CreateProcess(NULL,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;tcsParam,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;NULL,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;NULL,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;FALSE,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;CREATE_SUSPENDED,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;NULL,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;NULL,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;amp;si,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;amp;pi))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; GetLastError();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// heigthen priority of the current process&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// set file attribute to normal &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SetFileAttributes(tcsExename, FILE_ATTRIBUTE_NORMAL);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// depress priority of command process, then start it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;SetPriorityClass(pi.hProcess, IDLE_PRIORITY_CLASS);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;ResumeThread(pi.hThread);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"&gt;}&lt;/SPAN&gt;&lt;SPAN lang=EN-US style="mso-bidi-font-size: 10.5pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/hengai/aggbug/12241.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hengai</dc:creator><title>[学习] 计算几何算法概览</title><link>http://blog.vckbase.com/hengai/articles/12015.html</link><pubDate>Mon, 12 Sep 2005 07:52:00 GMT</pubDate><guid>http://blog.vckbase.com/hengai/articles/12015.html</guid><wfw:comment>http://blog.vckbase.com/hengai/comments/12015.html</wfw:comment><comments>http://blog.vckbase.com/hengai/articles/12015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/hengai/comments/commentRss/12015.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hengai/services/trackbacks/12015.html</trackback:ping><description>&lt;TABLE cellSpacing=0 cellPadding=0 width="90%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT style="BACKGROUND-COLOR: #000080" face=Tahoma color=#ffffe6&gt;
&lt;P align=center&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=宋体 color=#0000ff size=4&gt;&lt;STRONG&gt;计算几何算法概览&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=justify&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=宋体 color=#0000ff size=4&gt;&lt;STRONG&gt;&lt;FONT color=#000000 size=2&gt;转载自：&lt;A href="http://www.gameres.com/Articles/Program/Abstract/Geometry.htm"&gt;游戏开发资源网&lt;/A&gt;&amp;nbsp;&lt;A href="http://www.gameres.com/Articles/Program/Abstract/Geometry.htm"&gt;http://www.gameres.com/Articles/Program/Abstract/Geometry.htm&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="100%"&gt;&lt;FONT face=Tahoma size=2&gt;&lt;B&gt;
&lt;P align=left&gt;&lt;BR&gt;一、引言&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;计算机的出现使得很多原本十分繁琐的工作得以大幅度简化，但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案，比如几何问题。作为计算机科学的一个分支，计算几何主要研究解决几何问题的算法。在现代工程和数学领域，计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。在本文中，我们将对计算几何常用的基本算法做一个全面的介绍，希望对您了解并应用计算几何的知识解决问题起到帮助。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;B&gt;二、目录&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;本文整理的计算几何基本概念和常用算法包括如下内容：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#矢量的概念"&gt;矢量的概念&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#矢量加减法"&gt;矢量加减法&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#矢量叉积"&gt;矢量叉积&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#折线段的拐向判断"&gt;折线段的拐向判断&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断点是否在线段上"&gt;判断点是否在线段上&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断两线段是否相交"&gt;判断两线段是否相交&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断线段和直线是否相交"&gt;判断线段和直线是否相交&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断矩形是否包含点"&gt;判断矩形是否包含点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断线段、折线、多边形是否在矩形中"&gt;判断线段、折线、多边形是否在矩形中&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断矩形是否在矩形中"&gt;判断矩形是否在矩形中&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断圆是否在矩形中"&gt;判断圆是否在矩形中&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断点是否在多边形中"&gt;判断点是否在多边形中&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断线段是否在多边形内"&gt;判断线段是否在多边形内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断折线是否在多边形内"&gt;判断折线是否在多边形内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断多边形是否在多边形内"&gt;判断多边形是否在多边形内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断矩形是否在多边形内"&gt;判断矩形是否在多边形内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断圆是否在多边形内"&gt;判断圆是否在多边形内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断点是否在圆内"&gt;判断点是否在圆内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断线段、折线、矩形、多边形是否在圆内"&gt;判断线段、折线、矩形、多边形是否在圆内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#判断圆是否在圆内"&gt;判断圆是否在圆内&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#计算点到线段的最近点"&gt;计算点到线段的最近点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#计算点到折线、矩形、多边形的最近点"&gt;计算点到折线、矩形、多边形的最近点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#计算点到圆的最近距离"&gt;计算点到圆的最近距离及交点坐标&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#计算两条共线的线段的交点"&gt;计算两条共线的线段的交点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#计算线段或直线与线段的交点"&gt;计算线段或直线与线段的交点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#求线段或直线与折线、矩形、多边形的交点"&gt;求线段或直线与折线、矩形、多边形的交点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#求线段或直线与圆的交点"&gt;求线段或直线与圆的交点&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#凸包的概念"&gt;凸包的概念&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html#凸包的求法"&gt;凸包的求法&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;B&gt;三、算法介绍&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=矢量的概念&gt;矢量的概念&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;如果一条线段的端点是有次序之分的，我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点，我们可以把它称为矢量(vector)p2。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=矢量加减法&gt;矢量加减法&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;设二维矢量P = ( x1, y1 )，Q = ( x2 , y2 )，则矢量加法定义为： P + Q = ( x1 + x2 , y1 + y2 )，同样的，矢量减法定义为： P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P，P - Q = - ( Q - P )。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=矢量叉积&gt;矢量叉积&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 )，Q = ( x2, y2 )，则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积，即：P &amp;#215; Q = x1*y2 - x2*y1，其结果是一个标量。显然有性质 P &amp;#215; Q = - ( Q &amp;#215; P ) 和 P &amp;#215; ( - Q ) = - ( P &amp;#215; Q )。一般在不加说明的情况下，本文下述算法中所有的点都看作矢量，两点的加减法就是矢量相加减，而点的乘法则看作矢量叉积。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;若 P &amp;#215; Q &amp;gt; 0 , 则P在Q的顺时针方向。&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;若 P &amp;#215; Q &amp;lt; 0 , 则P在Q的逆时针方向。&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;若 P &amp;#215; Q = 0 , 则P与Q共线，但可能同向也可能反向。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=折线段的拐向判断&gt;折线段的拐向判断&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段p0p1和p1p2，通过计算(p2 - p0) &amp;#215; (p1 - p0)的符号便可以确定折线段的拐向：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;若(p2 - p0) &amp;#215; (p1 - p0) &amp;gt; 0,则p0p1在p1点拐向右侧后得到p1p2。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;若(p2 - p0) &amp;#215; (p1 - p0) &amp;lt; 0,则p0p1在p1点拐向左侧后得到p1p2。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;若(p2 - p0) &amp;#215; (p1 - p0) = 0,则p0、p1、p2三点共线。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;具体情况可参照下图：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;IMG height=600 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_1.gif" width=420&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断点是否在线段上&gt;判断点是否在线段上&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;设点为Q，线段为P1P2 ，判断点Q在该线段上的依据是：( Q - P1 ) &amp;#215; ( P2 - P1 ) = 0 且 Q 在以 P1，P2为对角顶点的矩形内。前者保证Q点在直线P1P2上，后者是保证Q点不在线段P1P2的延长线或反向延长线上，对于这一步骤的判断可以用以下过程实现：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Fixedsys size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;ON-SEGMENT(pi,pj,pk)&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Fixedsys size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;if min(xi,xj) &amp;lt;= xk &amp;lt;= max(xi,xj) and min(yi,yj) &amp;lt;= yk &amp;lt;= max(yi,yj)&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Fixedsys size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;then return true;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Fixedsys size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;else return false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;特别要注意的是，由于需要考虑水平线段和垂直线段两种特殊情况，min(xi,xj)&amp;lt;=xk&amp;lt;=max(xi,xj)和min(yi,yj)&amp;lt;=yk&amp;lt;=max(yi,yj)两个条件必须同时满足才能返回真值。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断两线段是否相交&gt;判断两线段是否相交&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;我们分两步确定两条线段是否相交：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;(1)快速排斥试验&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　　&lt;/SPAN&gt;设以线段 P1P2 为对角线的矩形为R， 设以线段 Q1Q2 为对角线的矩形为T，如果R和T不相交，显然两线段不会相交。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;(2)跨立试验&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;如果两线段相交，则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ，则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧，即( P1 - Q1 ) &amp;#215; ( Q2 - Q1 ) * ( P2 - Q1 ) &amp;#215; ( Q2 - Q1 ) &amp;lt; 0。上式可改写成( P1 - Q1 ) &amp;#215; ( Q2 - Q1 ) * ( Q2 - Q1 ) &amp;#215; ( P2 - Q1 ) &amp;gt; 0。当 ( P1 - Q1 ) &amp;#215; ( Q2 - Q1 ) = 0 时，说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线，但是因为已经通过快速排斥试验，所以 P1 一定在线段 Q1Q2上；同理，( Q2 - Q1 ) &amp;#215;(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是：( P1 - Q1 ) &amp;#215; ( Q2 - Q1 ) * ( Q2 - Q1 ) &amp;#215; ( P2 - Q1 ) &amp;gt;= 0。同理判断Q1Q2跨立P1P2的依据是：( Q1 - P1 ) &amp;#215; ( P2 - P1 ) * ( P2 - P1 ) &amp;#215; ( Q2 - P1 ) &amp;gt;= 0。具体情况如下图所示：&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;IMG height=280 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_2.gif" width=480 border=0&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;在相同的原理下，对此算法的具体的实现细节可能会与此有所不同，除了这种过程外，大家也可以参考《算法导论》上的实现。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断线段和直线是否相交&gt;判断线段和直线是否相交&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;有了上面的基础，这个算法就很容易了。如果线段P1P2和直线Q1Q2相交，则P1P2跨立Q1Q2，即：( P1 - Q1 ) &amp;#215; ( Q2 - Q1 ) * ( Q2 - Q1 ) &amp;#215; ( P2 - Q1 ) &amp;gt;= 0。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断矩形是否包含点&gt;判断矩形是否包含点&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要判断该点的横坐标和纵坐标是否夹在矩形的左右边和上下边之间。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断线段、折线、多边形是否在矩形中&gt;判断线段、折线、多边形是否在矩形中&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;因为矩形是个凸集，所以只要判断所有端点是否都在矩形中就可以了。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断矩形是否在矩形中&gt;判断矩形是否在矩形中&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要比较左右边界和上下边界就可以了。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断圆是否在矩形中&gt;判断圆是否在矩形中&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;很容易证明，圆在矩形中的充要条件是：圆心在矩形中且圆的半径小于等于圆心到矩形四边的距离的最小值。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断点是否在多边形中&gt;判断点是否在多边形中&lt;/A&gt;：&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;判断点P是否在多边形中是计算几何中一个非常基本但是十分重要的算法。以点P为端点，向左方作射线L，由于多边形是有界的，所以射线L的左端一定在多边形外，考虑沿着L从无穷远处开始自左向右移动，遇到和多边形的第一个交点的时候，进入到了多边形的内部，遇到第二个交点的时候，离开了多边形，&amp;#8230;&amp;#8230;所以很容易看出当L和多边形的交点数目C是奇数的时候，P在多边形内，是偶数的话P在多边形外。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;但是有些特殊情况要加以考虑。如图下图(a)(b)(c)(d)所示。在图(a)中，L和多边形的顶点相交，这时候交点只能计算一个；在图(b)中，L和多边形顶点的交点不应被计算；在图(c)和(d) 中，L和多边形的一条边重合，这条边应该被忽略不计。如果L和多边形的一条边重合，这条边应该被忽略不计。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;IMG height=600 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_3.gif" width=300&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;为了统一起见，我们在计算射线L和多边形的交点的时候，1。对于多边形的水平边不作考虑；2。对于多边形的顶点和L相交的情况，如果该顶点是其所属的边上纵坐标较大的顶点，则计数，否则忽略；3。对于P在多边形边上的情形，直接可判断P属于多边行。由此得出算法的伪代码如下：&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Fixedsys size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; count ← 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以P为端点，作从右向左的射线L;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for 多边形的每条边s&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do if P在边s上&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if s不是水平的&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then if s的一个端点在L上&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 该端点是s两端点中纵坐标较大的端点&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then count ← count+1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if s和L相交&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then count ← count+1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if count mod 2 = 1&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else return false;&lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;其中做射线L的方法是：设P'的纵坐标和P相同，横坐标为正无穷大（很大的一个正数），则P和P'就确定了射线L。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;判断点是否在多边形中的这个算法的时间复杂度为O(n)。&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;另外还有一种算法是用带符号的三角形面积之和与多边形面积进行比较，这种算法由于使用浮点数运算所以会带来一定误差，不推荐大家使用。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断线段是否在多边形内&gt;判断线段是否在多边形内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;线段在多边形内的一个必要条件是线段的两个端点都在多边形内，但由于多边形可能为凹，所以这不能成为判断的充分条件。如果线段和多边形的某条边内交（两线段内交是指两线段相交且交点不在两线段的端点），因为多边形的边的左右两侧分属多边形内外不同部分，所以线段一定会有一部分在多边形外(见图a)。于是我们得到线段在多边形内的第二个必要条件：线段和多边形的所有边都不内交。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;线段和多边形交于线段的两端点并不会影响线段是否在多边形内；但是如果多边形的某个顶点和线段相交，还必须判断两相邻交点之间的线段是否包含于多边形内部（反例见图b)。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;IMG height=250 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_4.gif" width=339&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;因此我们可以先求出所有和线段相交的多边形的顶点，然后按照X-Y坐标排序(X坐标小的排在前面，对于X坐标相同的点，Y坐标小的排在前面，这种排序准则也是为了保证水平和垂直情况的判断正确)，这样相邻的两个点就是在线段上相邻的两交点，如果任意相邻两点的中点也在多边形内，则该线段一定在多边形内。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;证明如下：&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;命题1：&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;如果线段和多边形的两相邻交点P1 ，P2的中点P' 也在多边形内，则P1, P2之间的所有点都在多边形内。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;证明：&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;假设P1,P2之间含有不在多边形内的点，不妨设该点为Q，在P1, P'之间，因为多边形是闭合曲线，所以其内外部之间有界，而P1属于多边行内部，Q属于多边性外部，P'属于多边性内部，P1-Q-P'完全连续，所以P1Q和QP'一定跨越多边形的边界，因此在P1,P'之间至少还有两个该线段和多边形的交点，这和P1P2是相邻两交点矛盾，故命题成立。证毕。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;由命题1直接可得出推论：&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;推论2：&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;设多边形和线段PQ的交点依次为P1,P2,&amp;#8230;&amp;#8230;Pn，其中Pi和Pi+1是相邻两交点，线段PQ在多边形内的充要条件是：P，Q在多边形内且对于i =1, 2,&amp;#8230;&amp;#8230;, n-1，Pi ,Pi+1的中点也在多边形内。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;在实际编程中，没有必要计算所有的交点，首先应判断线段和多边形的边是否内交，倘若线段和多边形的某条边内交则线段一定在多边形外；如果线段和多边形的每一条边都不内交，则线段和多边形的交点一定是线段的端点或者多边形的顶点，只要判断点是否在线段上就可以了。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;至此我们得出算法如下：&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Fixedsys size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 线端PQ的端点不都在多边形内&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 点集pointSet初始化为空;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for 多边形的每条边s&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do if 线段的某个端点在s上&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then 将该端点加入pointSet;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if s的某个端点在线段PQ上&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then 将该端点加入pointSet;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if s和线段PQ相交 &lt;FONT color=#808080&gt;// 这时候已经可以肯定是内交了&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将pointSet中的点按照X-Y坐标排序;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n，所以最多是常数级的复杂度，几乎可以忽略不计。因此算法的时间复杂度也是O(n)。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断折线是否在多边形内&gt;判断折线是否在多边形内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要判断折线的每条线段是否都在多边形内即可。设折线有m条线段，多边形有n个顶点，则该算法的时间复杂度为O(m*n)。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断多边形是否在多边形内&gt;判断多边形是否在多边形内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要判断多边形的每条边是否都在多边形内即可。判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断矩形是否在多边形内&gt;判断矩形是否在多边形内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;将矩形转化为多边形，然后再判断是否在多边形内。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断圆是否在多边形内&gt;判断圆是否在多边形内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要计算圆心到多边形的每条边的最短距离，如果该距离大于等于圆半径则该圆在多边形内。计算圆心到多边形每条边最短距离的算法在后文阐述。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断点是否在圆内&gt;判断点是否在圆内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;计算圆心到该点的距离，如果小于等于半径则该点在圆内。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断线段、折线、矩形、多边形是否在圆内&gt;判断线段、折线、矩形、多边形是否在圆内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;因为圆是凸集，所以只要判断是否每个顶点都在圆内即可。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=判断圆是否在圆内&gt;判断圆是否在圆内&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;设两圆为O1,O2，半径分别为r1, r2，要判断O2是否在O1内。先比较r1，r2的大小，如果r1&amp;lt;r2则O2不可能在O1内；否则如果两圆心的距离大于r1 - r2 ，则O2不在O1内；否则O2在O1内。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=计算点到线段的最近点&gt;计算点到线段的最近点&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;如果该线段平行于X轴（Y轴），则过点point作该线段所在直线的垂线，垂足很容易求得，然后计算出垂足，如果垂足在线段上则返回垂足，否则返回离垂足近的端点；如果该线段不平行于X轴也不平行于Y轴，则斜率存在且不为0。设线段的两端点为pt1和pt2，斜率为：k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );该直线方程为：y = k* ( x - pt1.x) + pt1.y。其垂线的斜率为 - 1 / k，垂线方程为：y = (-1/k) * (x - point.x) + point.y 。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;联立两直线方程解得：x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) ，y = k * ( x - pt1.x) + pt1.y;然后再判断垂足是否在线段上，如果在线段上则返回垂足；如果不在则计算两端点到垂足的距离，选择距离垂足较近的端点返回。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=计算点到折线、矩形、多边形的最近点&gt;计算点到折线、矩形、多边形的最近点&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;只要分别计算点到每条线段的最近点，记录最近距离，取其中最近距离最小的点即可。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=计算点到圆的最近距离及交点坐标&gt;计算点到圆的最近距离及交点坐标&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;如果该点在圆心，因为圆心到圆周任一点的距离相等，返回UNDEFINED。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;连接点P和圆心O，如果PO平行于X轴，则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x - radius 或 centerPoint.x + radius。如果PO平行于Y轴，则根据P在O的上边还是下边计算出最近点的纵坐标为 centerPoint.y -+radius或 centerPoint.y - radius。如果PO不平行于X轴和Y轴，则PO的斜率存在且不为0，这时直线PO斜率为k = （ P.y - O.y ）/ ( P.x - O.x )。直线PO的方程为：y = k * ( x - P.x) + P.y。设圆方程为:(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2，联立两方程组可以解出直线PO和圆的交点，取其中离P点较近的交点即可。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=计算两条共线的线段的交点&gt;计算两条共线的线段的交点&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;对于两条共线的线段，它们之间的位置关系有下图所示的几种情况。图(a)中两条线段没有交点；图 (b) 和 (d) 中两条线段有无穷焦点；图 (c) 中两条线段有一个交点。设line1是两条线段中较长的一条，line2是较短的一条，如果line1包含了line2的两个端点，则是图(d)的情况，两线段有无穷交点；如果line1只包含line2的一个端点，那么如果line1的某个端点等于被line1包含的line2的那个端点，则是图(c)的情况，这时两线段只有一个交点，否则就是图(b)的情况，两线段也是有无穷的交点；如果line1不包含line2的任何端点，则是图(a)的情况，这时两线段没有交点。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;IMG height=600 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_5.gif" width=280&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=计算线段或直线与线段的交点&gt;计算线段或直线与线段的交点&lt;/A&gt;:&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;设一条线段为L0 = P1P2，另一条线段或直线为L1 = Q1Q2 ，要计算的就是L0和L1的交点。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;1． 首先判断L0和L1是否相交（方法已在前文讨论过），如果不相交则没有交点，否则说明L0和L1一定有交点，下面就将L0和L1都看作直线来考虑。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;2． 如果P1和P2横坐标相同，即L0平行于Y轴 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;a) 若L1也平行于Y轴， &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　　&lt;/SPAN&gt;i. 若P1的纵坐标和Q1的纵坐标相同，说明L0和L1共线，假如L1是直线的话他们有无穷的交点，假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点（该方法在前文已讨论过）；&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;ii. 否则说明L0和L1平行，他们没有交点； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;b) 若L1不平行于Y轴，则交点横坐标为P1的横坐标，代入到L1的直线方程中可以计算出交点纵坐标； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;3． 如果P1和P2横坐标不同，但是Q1和Q2横坐标相同，即L1平行于Y轴，则交点横坐标为Q1的横坐标，代入到L0的直线方程中可以计算出交点纵坐标； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;4． 如果P1和P2纵坐标相同，即L0平行于X轴 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;a) 若L1也平行于X轴， &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;i. 若P1的横坐标和Q1的横坐标相同，说明L0和L1共线，假如L1是直线的话他们有无穷的交点，假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点（该方法在前文已讨论过）；&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;ii. 否则说明L0和L1平行，他们没有交点； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;b) 若L1不平行于X轴，则交点纵坐标为P1的纵坐标，代入到L1的直线方程中可以计算出交点横坐标； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;5． 如果P1和P2纵坐标不同，但是Q1和Q2纵坐标相同，即L1平行于X轴，则交点纵坐标为Q1的纵坐标，代入到L0的直线方程中可以计算出交点横坐标； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;6． 剩下的情况就是L1和L0的斜率均存在且不为0的情况 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;a) 计算出L0的斜率K0，L1的斜率K1 ； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;b) 如果K1 = K2&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　　&lt;/SPAN&gt;i. 如果Q1在L0上，则说明L0和L1共线，假如L1是直线的话有无穷交点，假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点（该方法在前文已讨论过）；&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　　&lt;/SPAN&gt;ii. 如果Q1不在L0上，则说明L0和L1平行，他们没有交点。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;c) 联立两直线的方程组可以解出交点来&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;这个算法并不复杂，但是要分情况讨论清楚，尤其是当两条线段共线的情况需要单独考虑，所以在前文将求两条共线线段的算法单独写出来。另外，一开始就先利用矢量叉乘判断线段与线段（或直线）是否相交，如果结果是相交，那么在后面就可以将线段全部看作直线来考虑。需要注意的是，我们可以将直线或线段方程改写为ax+by+c=0的形式，这样一来上述过程的部分步骤可以合并，缩短了代码长度，但是由于先要求出参数，这种算法将花费更多的时间。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=求线段或直线与折线、矩形、多边形的交点&gt;求线段或直线与折线、矩形、多边形的交点&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;分别求与每条边的交点即可。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=求线段或直线与圆的交点&gt;求线段或直线与圆的交点&lt;/A&gt;:&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;设圆心为O，圆半径为r，直线（或线段）L上的两点为P1,P2。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;1. 如果L是线段且P1，P2都包含在圆O内，则没有交点；否则进行下一步。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;2. 如果L平行于Y轴， &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;a) 计算圆心到L的距离dis；&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　&lt;/SPAN&gt;b) 如果dis &amp;gt; r 则L和圆没有交点；&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　　&lt;/SPAN&gt;c) 利用勾股定理，可以求出两交点坐标，但要注意考虑L和圆的相切情况。&lt;BR&gt;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;3. 如果L平行于X轴，做法与L平行于Y轴的情况类似； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;4. 如果L既不平行X轴也不平行Y轴，可以求出L的斜率K，然后列出L的点斜式方程，和圆方程联立即可求解出L和圆的两个交点； &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;5. 如果L是线段，对于2，3，4中求出的交点还要分别判断是否属于该线段的范围内。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=凸包的概念&gt;凸包的概念&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;点集Q的凸包(convex hull)是指一个最小凸多边形，满足Q中的点或者在多边形边上或者在其内。下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;IMG height=300 src="http://www.gameres.com/Articles/Program/Abstract/Geometry_6.gif" width=493&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;　&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;&lt;B&gt;&lt;A name=凸包的求法&gt;凸包的求法&lt;/A&gt;：&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;现在已经证明了凸包算法的时间复杂度下界是O(n*logn),但是当凸包的顶点数h也被考虑进去的话，Krikpatrick和Seidel的剪枝搜索算法可以达到O(n*logh)，在渐进意义下达到最优。最常用的凸包算法是Graham扫描法和Jarvis步进法。本文只简单介绍一下Graham扫描法，其正确性的证明和Jarvis步进法的过程大家可以参考《算法导论》。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;对于一个有三个或以上点的点集Q，Graham扫描法的过程如下： &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Fixedsys size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Fixedsys size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;令p0为Q中Y-X坐标排序下最小的点&amp;nbsp;&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;设&amp;lt;p1,p2,...pm&amp;gt;为对其余点按以p0为中心的极角逆时针排序所得的点集（如果有多个点有相同的极角，除了距p0最远的点外全部移除&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;压p0进栈S&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;压p1进栈S&lt;BR&gt;&lt;SPAN lang=zh-cn&gt;　　&lt;/SPAN&gt;压p2进栈S&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i ← 3 to m&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while 由S的栈顶元素的下一个元素、S的栈顶元素以及pi构成的折线段不拐向左侧&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对S弹栈&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;压pi进栈S&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S;&lt;/FONT&gt;&lt;FONT face=Tahoma size=2&gt;&lt;BR&gt;　&lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;此过程执行后，栈S由底至顶的元素就是Q的凸包顶点按逆时针排列的点序列。需要注意的是，我们对点按极角逆时针排序时，并不需要真正求出极角，只需要求出任意两点的次序就可以了。而这个步骤可以用前述的矢量叉积性质实现。 &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;FONT face=Tahoma size=2&gt;&lt;B&gt;四、结语&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P align=left&gt;&lt;SPAN lang=zh-cn&gt;&lt;FONT face=Tahoma size=2&gt;　&lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN lang=zh-cn&gt;　&lt;/SPAN&gt;尽管人类对几何学的研究从古代起便没有中断过，但是具体到借助计算机来解决几何问题的研究，还只是停留在一个初级阶段，无论从应用领域还是发展前景来看，计算几何学都值得我们认真学习、加以运用，希望这篇文章能带你走进这个丰富多彩的世界。 &lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src ="http://blog.vckbase.com/hengai/aggbug/12015.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hengai</dc:creator><title>[个人学习] 所有文章的索引</title><link>http://blog.vckbase.com/hengai/articles/12013.html</link><pubDate>Mon, 12 Sep 2005 07:49:00 GMT</pubDate><guid>http://blog.vckbase.com/hengai/articles/12013.html</guid><description>&lt;P align=center&gt;&lt;FONT face=宋体 size=2&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;这里是个人学习里面所有文章的索引&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=宋体 size=2&gt;&lt;FONT color=#ff0000&gt;这里不允许评论，仅仅提供一个索引。内容会不停的更新。&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=宋体 size=2&gt;&lt;FONT color=#0000ff size=3&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12015.html"&gt;计算几何算法概览&lt;/A&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=宋体 size=2&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=宋体&gt;　　矢量的概念&lt;BR&gt;　　矢量加减法&lt;BR&gt;　　矢量叉积&lt;BR&gt;　　折线段的拐向判断&lt;BR&gt;　　判断点是否在线段上&lt;BR&gt;　　判断两线段是否相交&lt;BR&gt;　　判断线段和直线是否相交&lt;BR&gt;　　判断矩形是否包含点&lt;BR&gt;　　判断线段、折线、多边形是否在矩形中&lt;BR&gt;　　判断矩形是否在矩形中&lt;BR&gt;　　判断圆是否在矩形中&lt;BR&gt;　　判断点是否在多边形中&lt;BR&gt;　　判断线段是否在多边形内&lt;BR&gt;　　判断折线是否在多边形内&lt;BR&gt;　　判断多边形是否在多边形内&lt;BR&gt;　　判断矩形是否在多边形内&lt;BR&gt;　　判断圆是否在多边形内&lt;BR&gt;　　判断点是否在圆内&lt;BR&gt;　　判断线段、折线、矩形、多边形是否在圆内&lt;BR&gt;　　判断圆是否在圆内&lt;BR&gt;　　计算点到线段的最近点&lt;BR&gt;　　计算点到折线、矩形、多边形的最近点&lt;BR&gt;　　计算点到圆的最近距离及交点坐标&lt;BR&gt;　　计算两条共线的线段的交点&lt;BR&gt;　　计算线段或直线与线段的交点&lt;BR&gt;　　求线段或直线与折线、矩形、多边形的交点&lt;BR&gt;　　求线段或直线与圆的交点&lt;BR&gt;　　凸包的概念&lt;BR&gt;　　凸包的求法&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;A href="http://blog.vckbase.com/hengai/articles/12241.html"&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face=宋体&gt;如何在程序结束后删除自身&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=宋体&gt;在一个EXE程序结束后删除自身。调用 cmd.exe 来删除&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/hengai/aggbug/12013.html" width = "1" height = "1" /&gt;</description></item></channel></rss>