﻿<?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>博客园-3DGIS(3D GIS)</title><link>http://www.cnblogs.com/wuhanhoutao/</link><description>研究OpenGL,DirectX 3D,GPU和GIS</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 03:09:30 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 03:09:30 GMT</pubDate><ttl>60</ttl><item><title>sourceforge不能访问了，但有另外的途径.</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/07/28/1255023.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Mon, 28 Jul 2008 10:53:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/07/28/1255023.html</guid><description><![CDATA[<p>阅读: 125 评论: 0 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-07-28 18:53 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/07/28/1255023.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sourceforge 在最近一个月无法访问了，但要下载工作中需要的一些源代码,进行研究和借鉴.</p>
<p>上网一查,还真有好心人给出了途径,<font face="Verdana">http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/%5Bpeek%5D</font>,就是这个网址,大家可以先用搜索引擎找到需要的软件,再到这个网址,按照英文字母的顺序查找.虽然没有以前方便，但总比没有东西借鉴要强啊.</p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1255023.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/07/28/1255023.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/07/28/1255023.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>在DirectX环境下读入3DS模型并显示</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/05/24/1206503.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Sat, 24 May 2008 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/05/24/1206503.html</guid><description><![CDATA[<p>阅读: 636 评论: 0 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-05-24 17:50 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/05/24/1206503.html" target="_blank">原文链接</a></p>&nbsp;
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;由于工作上的要求，需将</span>3DS<span style="font-family: 宋体">模型在</span>DirectX<span style="font-family: 宋体">环境下读入并显示，以前在</span>OpenGL<span style="font-family: 宋体">环境下做过读入</span>3DS<span style="font-family: 宋体">文件并渲染的事情，对</span>3DS<span style="font-family: 宋体">文件的格式已经熟悉，现在，相当于文件读取没有问题，只是要转换到</span>DirectX<span style="font-family: 宋体">环境需要的类型数据。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 正好，</span>DirectX<span style="font-family: 宋体">的</span>SDK<span style="font-family: 宋体">有读取</span>OBJ<span style="font-family: 宋体">格式的程序，大致知道了</span>DirectX<span style="font-family: 宋体">环境需要</span>Material<span style="font-family: 宋体">配合</span>Mesh<span style="font-family: 宋体">数据的模式，因此，将两者综合考虑，可完成任务。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;提供参考代码：<br />
<font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/Files/wuhanhoutao/MeshFromOBJ.rar">http://www.cnblogs.com/Files/wuhanhoutao/MeshFromOBJ.rar</a></font><br />
<br />
&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/137124/r_car3DSToDirectX.jpg" border="0"  alt="" /></span></p>
 <img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1206503.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/05/24/1206503.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/05/24/1206503.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>圣火传递中CCTV标示飞行路线错误</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/04/20/1162113.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Sun, 20 Apr 2008 00:29:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/04/20/1162113.html</guid><description><![CDATA[<p>阅读: 1281 评论: 8 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-04-20 08:29 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/04/20/1162113.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span id="Results_dgrSelectionList_ctl19_Label3" name="Label1">2008北京奥运圣火传递中, 当专机出现跨洲飞行时候,CCTV在报道过程中,,有两次标示飞行路线时出现技术错误.第一次是从欧洲到美国旧金山的时候, 中间暂停过冰岛,可见是从大西洋上空跨越,但CCTV却标示为从欧亚大陆跨越。第二次是圣火从阿根廷传递到非洲的坦桑尼亚，CCTV标示为从太平洋和印度洋来了个长距离的大跨越，但实际上地球是圆的，只用飞行大西洋的南端这个比较短的距离即可。图示表明.</span> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/132388/r_CCTV_MAP.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CCTV标示的飞行图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/132388/r_world_modify.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实际短距离图<br />
</p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1162113.html?type=1" width="1" height="1" alt=""/><p>评论: 8　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/04/20/1162113.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/04/20/1162113.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(完) </title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/25/1120760.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Tue, 25 Mar 2008 01:52:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/25/1120760.html</guid><description><![CDATA[<p>阅读: 569 评论: 0 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-25 09:52 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/25/1120760.html" target="_blank">原文链接</a></p>&nbsp;
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当折线的端点过于密集，以至于显示时堆积在一起时，有必要简化折线，以提高后续凸包或相交运算的处理效率与显示清晰度。关键问题是如何简化复杂折线，能够保持其特征，不至于失真。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 第一步通过设置顶点之间的距离阈值来减少冗余顶点。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_PolyLineSimplify.jpg" border="0"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 第二步，采用</span>Douglas-Peucker (DP)<span style="font-family: 宋体">算法简化折线，其在计算机图形学与地理信息系统领域被广泛应用。</span></p>
<p><span style="font-family: 宋体">其思想是顶点到某条边的距离过于接近的话，将被舍弃，保留距离大于阈值的顶点。初始化时，首先连接第一个和最后一个顶点构建第一条边，找到剩余顶点中距离这条线段最远的顶点，然后分别连接第一和最后一个顶点到此最远的顶点，构成两条线段，继续寻找剩余顶点中分别到这两条线段距离最远的顶点，依此类推，直到顶点到边的距离小于设置的阈值停止处理，那么找到的这些顶点构成了简化折线。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体"><img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_DPAlgorithm.jpg" border="0"  alt="" /><br />
// </span><span style="font-size: 10pt; color: green; font-family: 新宋体">折线的简化程序，包含上述两步骤</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入：&nbsp;阈值 tol，折线的顶点数组 V[]，顶点的个数 n；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出: &nbsp;&nbsp;经过简化后的顶点数组 sV[]；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回: &nbsp;&nbsp;简化后的顶点数组中的顶点数量 m；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">poly_simplify</span>( <span style="color: blue">double</span> <span style="color: #020002">tol</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">V</span>, <span style="color: blue">int</span> <span style="color: #020002">n</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">sV</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span>, <span style="color: #020002">k</span>, <span style="color: #020002">m</span>, <span style="color: #020002">pv</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备用做计数器</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;<span style="color: #020002">tol2</span> = <span style="color: #020002">tol</span> * <span style="color: #020002">tol</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">阈值的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span>* <span style="color: #020002">vt</span> = <span style="color: blue">new</span> <span style="color: #020002">Point</span>[<span style="color: #020002">n</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入的顶点数组</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>*&nbsp;&nbsp; <span style="color: #020002">mk</span> = <span style="color: blue">new</span> <span style="color: blue">int</span>[<span style="color: #020002">n</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">给标记数组初始化</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span>(<span style="color: #020002">i</span>=0;<span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>;<span style="color: #020002">i</span>++)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">mk</span>[<span style="color: #020002">i</span>] = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">初始化</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">第一步：通过顶点之间的距离判断，是否保留某些顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">vt</span>[0] = <span style="color: #020002">V</span>[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">for</span><span style="font-size: 10pt; font-family: 新宋体"> (<span style="color: #020002">i</span>=<span style="color: #020002">k</span>=1, <span style="color: #020002">pv</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对输入的每个顶点循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">d2</span>(<span style="color: #020002">V</span>[<span style="color: #020002">i</span>], <span style="color: #020002">V</span>[<span style="color: #020002">pv</span>]) &lt; <span style="color: #020002">tol2</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点之间的距离小于阈值，直接跳到下个顶点进行处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vt</span>[<span style="color: #020002">k</span>++] = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点之间的距离大于阈值，记录此顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">pv</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录此顶点的索引号</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">pv</span> &lt; <span style="color: #020002">n</span>-1)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vt</span>[<span style="color: #020002">k</span>++] = <span style="color: #020002">V</span>[<span style="color: #020002">n</span>-1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将最后一个顶点记录下来</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">第二步：采用 Douglas-Peucker算法进行简化</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">mk</span>[0] = <span style="color: #020002">mk</span>[<span style="color: #020002">k</span>-1] = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">给第一个和最后一个顶点标记为1</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">simplifyDP</span>( <span style="color: #020002">tol</span>, <span style="color: #020002">vt</span>, 0, <span style="color: #020002">k</span>-1, <span style="color: #020002">mk</span> );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// copy marked vertices to the output simplified polyline</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: #020002">i</span>=<span style="color: #020002">m</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">k</span>; <span style="color: #020002">i</span>++) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">mk</span>[<span style="color: #020002">i</span>])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果标记为1的话</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">sV</span>[<span style="color: #020002">m</span>++] = <span style="color: #020002">vt</span>[<span style="color: #020002">i</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将顶点赋值给最后输出的结果数组</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">delete</span> <span style="color: #020002">vt</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">删除临时顶点数组</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">delete</span> <span style="color: #020002">mk</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">删除标记数组</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">m</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// m vertices in simplified polyline</span></span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp; &nbsp;Douglas-Peucker (DP)</span><span style="font-size: 10pt; color: green; font-family: 新宋体">算法</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入:&nbsp;阈值tol，顶点数组v[]，j,k分别指示顶点数组中的第一和尾部顶点，在第一次运行此程序片段时，表示连接最初和最后的顶点构成线段，在后面的递归调用中，表示连接到最远顶点的子线段；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出: 简化后的顶点数组 mk[]；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">void</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">simplifyDP</span>( <span style="color: blue">double</span> <span style="color: #020002">tol</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">v</span>, <span style="color: blue">int</span> <span style="color: #020002">j</span>, <span style="color: blue">int</span> <span style="color: #020002">k</span>, <span style="color: blue">int</span>* <span style="color: #020002">mk</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">k</span> &lt;= <span style="color: #020002">j</span>+1) <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">两顶点挨在一起，没必要简化</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxi</span> = <span style="color: #020002">j</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备记录距离线段的最远顶点的索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;&nbsp; <span style="color: #020002">maxd2</span> = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备记录最远距离的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;&nbsp; <span style="color: #020002">tol2</span> = <span style="color: #020002">tol</span> * <span style="color: #020002">tol</span>;&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">设置的阈值的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Segment</span> <span style="color: #020002">S</span> = {<span style="color: #020002">v</span>[<span style="color: #020002">j</span>], <span style="color: #020002">v</span>[<span style="color: #020002">k</span>]};&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构建 顶点v[j] 和 v[k]之间的线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Vector</span>&nbsp;<span style="color: #020002">u</span> = <span style="color: #020002">S</span>.<span style="color: #020002">P1</span> - <span style="color: #020002">S</span>.<span style="color: #020002">P0</span>;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">矢量</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;<span style="color: #020002">cu</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">u</span>,<span style="color: #020002">u</span>);&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">线段长度的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">采用前面讲解的顶点到线段的距离求法，计算每个顶点到线段S的距离</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Vector</span>&nbsp;<span style="color: #020002">w</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span>&nbsp;&nbsp; <span style="color: #020002">Pb</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">double</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;<span style="color: #020002">b</span>, <span style="color: #020002">cw</span>, <span style="color: #020002">dv2</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=<span style="color: #020002">j</span>+1; <span style="color: #020002">i</span>&lt;<span style="color: #020002">k</span>; <span style="color: #020002">i</span>++)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">w</span> = <span style="color: #020002">v</span>[<span style="color: #020002">i</span>] - <span style="color: #020002">S</span>.<span style="color: #020002">P0</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">cw</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">w</span>,<span style="color: #020002">u</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( <span style="color: #020002">cw</span> &lt;= 0 )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dv2</span> = <span style="color: #020002">d2</span>(<span style="color: #020002">v</span>[<span style="color: #020002">i</span>], <span style="color: #020002">S</span>.<span style="color: #020002">P0</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> ( <span style="color: #020002">cu</span> &lt;= <span style="color: #020002">cw</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dv2</span> = <span style="color: #020002">d2</span>(<span style="color: #020002">v</span>[<span style="color: #020002">i</span>], <span style="color: #020002">S</span>.<span style="color: #020002">P1</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">b</span> = <span style="color: #020002">cw</span> / <span style="color: #020002">cu</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pb</span> = <span style="color: #020002">S</span>.<span style="color: #020002">P0</span> + <span style="color: #020002">b</span> * <span style="color: #020002">u</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dv2</span> = <span style="color: #020002">d2</span>(<span style="color: #020002">v</span>[<span style="color: #020002">i</span>], <span style="color: #020002">Pb</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">dv2</span> &lt;= <span style="color: #020002">maxd2</span>) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// v[i]</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">是符合要求的最远顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxi</span> = <span style="color: #020002">i</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxd2</span> = <span style="color: #020002">dv2</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; } </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">maxd2</span> &gt; <span style="color: #020002">tol2</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果最远顶点到线段S的距离大于阈值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">mk</span>[<span style="color: #020002">maxi</span>] = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录maxi这个索引， 此顶点将被最后输出</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">递归调用此程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">simplifyDP</span>( <span style="color: #020002">tol</span>, <span style="color: #020002">v</span>, <span style="color: #020002">j</span>, <span style="color: #020002">maxi</span>, <span style="color: #020002">mk</span> );&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">第一条子线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">simplifyDP</span>( <span style="color: #020002">tol</span>, <span style="color: #020002">v</span>, <span style="color: #020002">maxi</span>, <span style="color: #020002">k</span>, <span style="color: #020002">mk</span> );&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">第二条子线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span>;</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1120760.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/25/1120760.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/25/1120760.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续9)</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/24/1119238.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Mon, 24 Mar 2008 02:01:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/24/1119238.html</guid><description><![CDATA[<p>阅读: 444 评论: 0 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-24 10:01 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/24/1119238.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; font-family: 新宋体">介绍完平面上凸包各种求取方法后，讲解三维顶点集合凸包的方法。</span></p>
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; font-family: 新宋体">过程：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #020002; font-family: 新宋体">3DConvexHull</span><span style="font-size: 10pt; font-family: 新宋体">( <span style="color: blue">int</span> <span style="color: #020002">argc</span>, <span style="color: blue">char</span> *<span style="color: #020002">argv</span>[] )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{&nbsp;&nbsp; <br />
<span style="color: #020002">&nbsp;&nbsp;&nbsp; ReadVertices</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">读取所有顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">DoubleTriangle</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构造初始三角形</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">ConstructHull</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构建三维顶点集合的凸包</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_3DConvexHull.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: green; font-family: 新宋体">//</span><span style="font-size: 10pt; color: green; font-family: 新宋体">首先找到3个不共线的顶点，以相反的顺序建成三角形的两个面。接着找到不在三角面上的第四个顶点。在三角面上以逆时针顺序存储顶点，建立到新顶点的3个面。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">void</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">DoubleTriangle</span>( <span style="color: blue">void</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tVertex</span>&nbsp;<span style="color: #020002">v0</span>, <span style="color: #020002">v1</span>, <span style="color: #020002">v2</span>, <span style="color: #020002">v3</span>, <span style="color: #020002">t</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tFace</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">f0</span>, <span style="color: #020002">f1</span> = <span style="color: #020002">NULL</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tEdge</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">e0</span>, <span style="color: #020002">e1</span>, <span style="color: #020002">e2</span>, <span style="color: #020002">s</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vol</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v0</span> = <span style="color: #020002">vertices</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> ( <span style="color: #020002">Collinear</span>( <span style="color: #020002">v0</span>, <span style="color: #020002">v0</span>-&gt;<span style="color: #020002">next</span>, <span style="color: #020002">v0</span>-&gt;<span style="color: #020002">next</span>-&gt;<span style="color: #020002">next</span> ) )<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">比较连续存储的3个顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( ( <span style="color: #020002">v0</span> = <span style="color: #020002">v0</span>-&gt;<span style="color: #020002">next</span> ) == <span style="color: #020002">vertices</span> )&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">提取下一个顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">printf</span>(<span style="color: #a31515">"</span></span><span style="font-size: 10pt; color: #a31515; font-family: 新宋体">所有顶点共线"</span><span style="font-size: 10pt; font-family: 新宋体">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v1</span> = <span style="color: #020002">v0</span>-&gt;<span style="color: #020002">next</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">找到不共线的顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v2</span> = <span style="color: #020002">v1</span>-&gt;<span style="color: #020002">next</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">找到不共线的顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v0</span>-&gt;<span style="color: #020002">mark</span> = <span style="color: #020002">PROCESSED</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">标记顶点处理过</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v1</span>-&gt;<span style="color: #020002">mark</span> = <span style="color: #020002">PROCESSED</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">标记顶点处理过</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v2</span>-&gt;<span style="color: #020002">mark</span> = <span style="color: #020002">PROCESSED</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">标记顶点处理过</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f0</span> = <span style="color: #020002">MakeFace</span>( <span style="color: #020002">v0</span>, <span style="color: #020002">v1</span>, <span style="color: #020002">v2</span>, <span style="color: #020002">f1</span> );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f1</span> = <span style="color: #020002">MakeFace</span>( <span style="color: #020002">v2</span>, <span style="color: #020002">v1</span>, <span style="color: #020002">v0</span>, <span style="color: #020002">f0</span> );<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">以相反的顶点顺序构建第二个面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f0</span>-&gt;<span style="color: #020002">edge</span>[0]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f1</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f0</span>-&gt;<span style="color: #020002">edge</span>[1]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f1</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f0</span>-&gt;<span style="color: #020002">edge</span>[2]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f1</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">指出面的邻接面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f1</span>-&gt;<span style="color: #020002">edge</span>[0]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f0</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f1</span>-&gt;<span style="color: #020002">edge</span>[1]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f0</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f1</span>-&gt;<span style="color: #020002">edge</span>[2]-&gt;<span style="color: #020002">adjface</span>[1] = <span style="color: #020002">f0</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">指出面的邻接面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备找到不在面上的第四个顶点来构建体</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v3</span> = <span style="color: #020002">v2</span>-&gt;<span style="color: #020002">next</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">vol</span> = <span style="color: #020002">VolumeSign</span>( <span style="color: #020002">f0</span>, <span style="color: #020002">v3</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">通过计算体积来判断是否第四个顶点不在面上</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> ( !<span style="color: #020002">vol</span> )&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当体积为0的话，继续循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( ( <span style="color: #020002">v3</span> = <span style="color: #020002">v3</span>-&gt;<span style="color: #020002">next</span> ) == <span style="color: #020002">v0</span> ) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">printf</span>(<span style="color: #a31515">"</span></span><span style="font-size: 10pt; color: #a31515; font-family: 新宋体">所有顶点是共面的"</span><span style="font-size: 10pt; font-family: 新宋体">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vol</span> = <span style="color: #020002">VolumeSign</span>( <span style="color: #020002">f0</span>, <span style="color: #020002">v3</span> );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">vertices</span> = <span style="color: #020002">v3</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录V3为现在被增加的顶点</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//</span><span style="font-size: 10pt; color: green; font-family: 新宋体">每次考察一个顶点，如果构成凸包中新顶点，则新建面和边，如处在现阶段的凸包之内，则不作其他处理；</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">void</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">ConstructHull</span>( <span style="color: blue">void</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tVertex</span>&nbsp;<span style="color: #020002">v</span>, <span style="color: #020002">vnext</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #020002">vol</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">bool</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #020002">changed</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">v</span> = <span style="color: #020002">vertices</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">do</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vnext</span> = <span style="color: #020002">v</span>-&gt;<span style="color: #020002">next</span>;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取下一个顶点来处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( !<span style="color: #020002">v</span>-&gt;<span style="color: #020002">mark</span> ) {&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果此顶点的标记为&#8220;还从未处理过&#8221;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">v</span>-&gt;<span style="color: #020002">mark</span> = <span style="color: #020002">PROCESSED</span>;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将此顶点标记为&#8220;已经被处理过&#8221;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">changed</span> = <span style="color: #020002">AddOne</span>( <span style="color: #020002">v</span> );<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将新顶点加入，处在现凸包内，或构成新凸包的一个顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">CleanUp</span>( &amp;<span style="color: #020002">vnext</span> ); </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">v</span> = <span style="color: #020002">vnext</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; } <span style="color: blue">while</span> ( <span style="color: #020002">v</span> != <span style="color: #020002">vertices</span> );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">通过体积来计算此顶点与其他面的关系，若构成的体都为凹，则不予考虑。否则，可说此顶点位于某些面之外。若从此顶点能观察到某边的两个邻接面，则此边将被删除。若从此顶点只能观察到一个面，则将创建新面。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">bool</span><span style="font-size: 10pt; font-family: 新宋体"> &nbsp;&nbsp; <span style="color: #020002">AddOne</span>( <span style="color: #020002">tVertex</span> <span style="color: #020002">p</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tFace</span>&nbsp;<span style="color: #020002">f</span>; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tEdge</span>&nbsp;<span style="color: #020002">e</span>, <span style="color: #020002">temp</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #020002">vol</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">bool</span>&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #020002">vis</span> = <span style="color: #020002">FALSE</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">f</span> = <span style="color: #020002">faces</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">do</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vol</span> = <span style="color: #020002">VolumeSign</span>( <span style="color: #020002">f</span>, <span style="color: #020002">p</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">计算每个面和新增加的顶点构成的锥体的体积</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( <span style="color: #020002">vol</span> &lt; 0 ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">f</span>-&gt;<span style="color: #020002">visible</span> = <span style="color: #020002">VISIBLE</span>;&nbsp;&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">此面被标记为可见</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">vis</span> = <span style="color: #020002">TRUE</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">&nbsp;//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">标识顶点已处于面之外</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">f</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">next</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取得下一个面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; } <span style="color: blue">while</span> ( <span style="color: #020002">f</span> != <span style="color: #020002">faces</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对所有面循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( !<span style="color: #020002">vis</span> ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">没有一个面可见，则顶点位于体内，不将作为凸包顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">p</span>-&gt;<span style="color: #020002">onhull</span> = !<span style="color: #020002">ONHULL</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点作标记</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">FALSE</span>; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span> = <span style="color: #020002">edges</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">do</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">temp</span> = <span style="color: #020002">e</span>-&gt;<span style="color: #020002">next</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取下一条边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( <span style="color: #020002">e</span>-&gt;<span style="color: #020002">adjface</span>[0]-&gt;<span style="color: #020002">visible</span> &amp;&amp; <span style="color: #020002">e</span>-&gt;<span style="color: #020002">adjface</span>[1]-&gt;<span style="color: #020002">visible</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span>-&gt;<span style="color: blue">delete</span> = <span style="color: #020002">REMOVED</span>;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果这条边的两个邻接面都可见，则标记为删除此条边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> ( <span style="color: #020002">e</span>-&gt;<span style="color: #020002">adjface</span>[0]-&gt;<span style="color: #020002">visible</span> || <span style="color: #020002">e</span>-&gt;<span style="color: #020002">adjface</span>[1]-&gt;<span style="color: #020002">visible</span> ) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span>-&gt;<span style="color: #020002">newface</span> = <span style="color: #020002">MakeConeFace</span>( <span style="color: #020002">e</span>, <span style="color: #020002">p</span> );<span style="color: green"> //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构建新面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span> = <span style="color: #020002">temp</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; } <span style="color: blue">while</span> ( <span style="color: #020002">e</span> != <span style="color: #020002">edges</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">所有边循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">TRUE</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//</span><span style="font-size: 10pt; color: green; font-family: 新宋体">计算体积，此结果的正负可判断顶点与面的&#8220;可见&#8221;关系。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;<span style="color: #020002">VolumeSign</span>( <span style="color: #020002">tFace</span> <span style="color: #020002">f</span>, <span style="color: #020002">tVertex</span> <span style="color: #020002">p</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;<span style="color: #020002">vol</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #020002">voli</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;<span style="color: #020002">ax</span>, <span style="color: #020002">ay</span>, <span style="color: #020002">az</span>, <span style="color: #020002">bx</span>, <span style="color: #020002">by</span>, <span style="color: #020002">bz</span>, <span style="color: #020002">cx</span>, <span style="color: #020002">cy</span>, <span style="color: #020002">cz</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">ax</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[0]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">ay</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[0]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">az</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[0]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点坐标相减构成向量</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">bx</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[1]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">by</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[1]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">bz</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[1]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">cx</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[2]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">X</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">cy</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[2]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">cz</span> = <span style="color: #020002">f</span>-&gt;<span style="color: #020002">vertex</span>[2]-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>] - <span style="color: #020002">p</span>-&gt;<span style="color: #020002">v</span>[<span style="color: #020002">Z</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">vol</span> =&nbsp;&nbsp; <span style="color: #020002">ax</span> * (<span style="color: #020002">by</span>*<span style="color: #020002">cz</span> - <span style="color: #020002">bz</span>*<span style="color: #020002">cy</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + <span style="color: #020002">ay</span> * (<span style="color: #020002">bz</span>*<span style="color: #020002">cx</span> - <span style="color: #020002">bx</span>*<span style="color: #020002">cz</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + <span style="color: #020002">az</span> * (<span style="color: #020002">bx</span>*<span style="color: #020002">cy</span> - <span style="color: #020002">by</span>*<span style="color: #020002">cx</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">体积计算是通过法向量与一条边向量的点乘，因为点乘结果表示两个模与向量夹角的余弦，其中法向量的模是三角面上两条边的模乘上夹角的正弦，即为面积。而剩下的那个模乘上夹角的余弦，即为高。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">vol</span>;</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_3DConvexHullVolume.jpg" border="0"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="font-size: 10pt; color: green; font-family: 新宋体">&nbsp;&nbsp;&nbsp; 当一条边的一个邻接面对新加入的顶点是&#8220;可见&#8221;的时候，构建一个新面和两条新边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #020002; font-family: 新宋体">tFace</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp; <span style="color: #020002">MakeConeFace</span>( <span style="color: #020002">tEdge</span> <span style="color: #020002">e</span>, <span style="color: #020002">tVertex</span> <span style="color: #020002">p</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tEdge</span>&nbsp;<span style="color: #020002">new_edge</span>[2];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">tFace</span>&nbsp;<span style="color: #020002">new_face</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="color: #020002">i</span>, <span style="color: #020002">j</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备构建两条新边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> ( <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span> &lt; 2; ++<span style="color: #020002">i</span> ) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果新边已经被创建过，直接拷贝过来即可</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( !( <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>] = <span style="color: #020002">e</span>-&gt;<span style="color: #020002">endpts</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">duplicate</span>) ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果新边没有被创建过，则构建</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>] = <span style="color: #020002">MakeNullEdge</span>();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">endpts</span>[0] = <span style="color: #020002">e</span>-&gt;<span style="color: #020002">endpts</span>[<span style="color: #020002">i</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">endpts</span>[1] = <span style="color: #020002">p</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span>-&gt;<span style="color: #020002">endpts</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">duplicate</span> = <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>];<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点标记这条新边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">创建新的面</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_face</span> = <span style="color: #020002">MakeNullFace</span>();&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_face</span>-&gt;<span style="color: #020002">edge</span>[0] = <span style="color: #020002">e</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构成面的原来那条边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_face</span>-&gt;<span style="color: #020002">edge</span>[1] = <span style="color: #020002">new_edge</span>[0];<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构成面的第一条新边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_face</span>-&gt;<span style="color: #020002">edge</span>[2] = <span style="color: #020002">new_edge</span>[1]; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">构成面的第二条新边</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">MakeCcw</span>( <span style="color: #020002">new_face</span>, <span style="color: #020002">e</span>, <span style="color: #020002">p</span> ); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">以逆时针方向建立面上的顶点顺序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将新建立的边和面联系起来</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> ( <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span> &lt; 2; ++<span style="color: #020002">i</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> ( <span style="color: #020002">j</span>=0; <span style="color: #020002">j</span> &lt; 2; ++<span style="color: #020002">j</span> )&nbsp;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( !<span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">adjface</span>[<span style="color: #020002">j</span>] ) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">new_edge</span>[<span style="color: #020002">i</span>]-&gt;<span style="color: #020002">adjface</span>[<span style="color: #020002">j</span>] = <span style="color: #020002">new_face</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新边和新面一旦联系,就跳出循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">new_face</span>;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">处理结束,返回新建立的面</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
 <img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1119238.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/24/1119238.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/24/1119238.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续8) </title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/20/1114887.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Thu, 20 Mar 2008 07:15:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/20/1114887.html</guid><description><![CDATA[<p>阅读: 452 评论: 0 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-20 15:15 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/20/1114887.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">现在介绍平面上顶点集合凸包的</span>Bentley-Faust-Preparata (BFP)<span style="font-family: 宋体">方法，与前面讲解的</span>Graham Scan<span style="font-family: 宋体">和</span>Andrew's Monotone Chain<span style="font-family: 宋体">方法不同之处是，预先并不需要将整个顶点集合一起按照</span>X<span style="font-family: 宋体">、</span>Y<span style="font-family: 宋体">轴数值排序。这种方法虽然是种近似方法，但时间复杂度降低，对于大数据量顶点的处理要求比较适合。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">基本方法是，取代整个顶点集合的依次</span>X<span style="font-family: 宋体">、</span>Y<span style="font-family: 宋体">轴排序，而首先依</span>X<span style="font-family: 宋体">轴数值大小划分几个区间，在每个区间中找到</span>Ymin<span style="font-family: 宋体">，</span>Ymax<span style="font-family: 宋体">顶点，以所有区间的这些顶点为预选，采用</span>Andrew's Monotone Chain<span style="font-family: 宋体">算法中使用过的&#8220;左转&#8221;方式来判断凸包条件是否成立，最后构成上下两个凸包子集，将其合并得到结果。其近似的原因是，每个区间可能不只有</span>Ymin<span style="font-family: 宋体">，</span>Ymax<span style="font-family: 宋体">等顶点作为预选。倘若将区间数量增大，则算法的准确性上升。</span></p>
<p style="text-indent: 27pt">&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_NearConvexHull.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">参考代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入:&nbsp;没有排序的顶点数组P[]，数组中的顶点个数n，准备将X轴分开成 k个区间</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出: &nbsp;生成的凸包顶点集合H[]</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回的数值: 凸包H[]中的顶点个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">nearHull_2D</span>( <span style="color: #020002">Point</span>* <span style="color: #020002">P</span>, <span style="color: blue">int</span> <span style="color: #020002">n</span>, <span style="color: blue">int</span> <span style="color: #020002">k</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">H</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;<span style="color: #020002">minmin</span>=0,&nbsp;<span style="color: #020002">minmax</span>=0; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备记录X轴数值最小情况下Y轴数值最小和最大顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;<span style="color: #020002">maxmin</span>=0,&nbsp;<span style="color: #020002">maxmax</span>=0;<span style="color: green"> //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备记录X轴数值最大情况下Y轴数值最小和最大顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span>&nbsp;<span style="color: #020002">xmin</span> = <span style="color: #020002">P</span>[0].<span style="color: #020002">x</span>,&nbsp;<span style="color: #020002">xmax</span> = <span style="color: #020002">P</span>[0].<span style="color: #020002">x</span>;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">初始化X轴最小和最大数值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span>* <span style="color: #020002">cP</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">被处理的顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">bot</span>=0, <span style="color: #020002">top</span>=(-1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">指示栈底和栈顶</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=1; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对所有顶点循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">cP</span> = &amp;<span style="color: #020002">P</span>[<span style="color: #020002">i</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> &lt;= <span style="color: #020002">xmin</span>) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> &lt; <span style="color: #020002">xmin</span>) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">有更小的X轴数值出现</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">xmin</span> = <span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">minmin</span> = <span style="color: #020002">minmax</span> = <span style="color: #020002">i</span>;&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">若相同的X轴最小数值出现</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &lt; <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>].<span style="color: #020002">y</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">minmin</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下顶点索引，此时Y轴更小</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>].<span style="color: #020002">y</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">minmax</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下顶点索引，此时Y轴更大</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> &gt;= <span style="color: #020002">xmax</span>) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">有更大或相同的X轴数值出现</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> &gt; <span style="color: #020002">xmax</span>) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">有比xmax还大的顶点出现</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">xmax</span> = <span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxmin</span> = <span style="color: #020002">maxmax</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">若相同的X轴最大数值出现</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &lt; <span style="color: #020002">P</span>[<span style="color: #020002">maxmin</span>].<span style="color: #020002">y</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxmin</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下顶点索引，此时Y轴更小</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>[<span style="color: #020002">maxmax</span>].<span style="color: #020002">y</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxmax</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下顶点索引，此时Y轴更大</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">xmin</span> == <span style="color: #020002">xmax</span>) {&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">一种极端情况出现：X轴最小与最大数值相同，即所有数值等同</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下此顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">minmax</span> != <span style="color: #020002">minmin</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果Y轴的数值不同</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录下此顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">top</span>+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回顶点个数，这种特殊情况下是1或2个</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-indent: 20pt; text-align: left" align="left"><span style="font-size: 10pt; color: #020002; font-family: 新宋体">Bin</span><span style="font-size: 10pt; font-family: 新宋体">*&nbsp;&nbsp; <span style="color: #020002">B</span> = <span style="color: blue">new</span> <span style="color: #020002">Bin</span>[<span style="color: #020002">k</span>+2];&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">初始化区间数据结构</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[0].<span style="color: #020002">min</span> = <span style="color: #020002">minmin</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[0].<span style="color: #020002">max</span> = <span style="color: #020002">minmax</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">设置第一个区间</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">k</span>+1].<span style="color: #020002">min</span> = <span style="color: #020002">maxmin</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">k</span>+1].<span style="color: #020002">max</span> = <span style="color: #020002">maxmax</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">设置最后一个区间</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">b</span>=1; <span style="color: #020002">b</span>&lt;=<span style="color: #020002">k</span>; <span style="color: #020002">b</span>++) { </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">min</span> = <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">max</span> = -99;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">初始赋值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">b</span>, <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">循环处理每个顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">cP</span> = &amp;<span style="color: #020002">P</span>[<span style="color: #020002">i</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> == <span style="color: #020002">xmin</span> || <span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> == <span style="color: #020002">xmax</span>) <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果是整个集合中的X轴最小或最大数值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">继续下次循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>], <span style="color: #020002">P</span>[<span style="color: #020002">maxmin</span>], *<span style="color: #020002">cP</span>) &lt; 0) {&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当前顶点处于低线之下</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">b</span> = (<span style="color: blue">int</span>)( <span style="color: #020002">k</span> * (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> - <span style="color: #020002">xmin</span>) / (<span style="color: #020002">xmax</span> - <span style="color: #020002">xmin</span>) ) + 1;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得Bin结构的序号</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">min</span> == -99)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">这个Bin结构中还没有赋Y轴上的最低顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">min</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &lt; <span style="color: #020002">P</span>[<span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">min</span>].<span style="color: #020002">y</span>)&nbsp;<span style="color: green">&nbsp;//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">若比已经记录的最低数值还低</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">min</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新的最低顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>], <span style="color: #020002">P</span>[<span style="color: #020002">maxmax</span>], *<span style="color: #020002">cP</span>) &gt; 0) {&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当前顶点处于高线之上</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">b</span> = (<span style="color: blue">int</span>)( <span style="color: #020002">k</span> * (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">x</span> - <span style="color: #020002">xmin</span>) / (<span style="color: #020002">xmax</span> - <span style="color: #020002">xmin</span>) ) + 1;<span style="color: green"> //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得Bin结构的序号</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">max</span> == -99)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">这个Bin结构中还没有赋Y轴上的最高顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">max</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">cP</span>-&gt;<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>[<span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">max</span>].<span style="color: #020002">y</span>)<span style="color: green"> //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">若比已经记录的最高数值还高</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>[<span style="color: #020002">b</span>].<span style="color: #020002">max</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新的最高顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">和前面讲解的Andrew's Monotone Chain算法中一样，使用 &#8220;左转&#8221;方式来判断凸包条件是否成立，分别构成上下两个子集</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span> &lt;= <span style="color: #020002">k</span>+1; ++<span style="color: #020002">i</span>)<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对每个区间循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">B</span>[<span style="color: #020002">i</span>].<span style="color: #020002">min</span> == -99)&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果区间中没有最低顶点记录的话，继续下次循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">cP</span> = &amp;<span style="color: #020002">P</span>[ <span style="color: #020002">B</span>[<span style="color: #020002">i</span>].<span style="color: #020002">min</span> ];&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取出当前区间中的最低顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (<span style="color: #020002">top</span> &gt; 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当栈中至少有2个元素的时候，top &gt; 0</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">看是否满足&#8220;左转&#8221;条件</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">H</span>[<span style="color: #020002">top</span>-1], <span style="color: #020002">H</span>[<span style="color: #020002">top</span>], *<span style="color: #020002">cP</span>) &gt; 0)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">此顶点是满足条件的新凸包顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span>--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">由于顶点破坏凸包条件，需要弹出栈顶元素，直到满足</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = *<span style="color: #020002">cP</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将这个顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">下面，计算上半部分的凸包顶点集合</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">maxmax</span> != <span style="color: #020002">maxmin</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果X轴数值最大情况下Y轴有不同顶点存在</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">maxmax</span>];&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将X轴数值与Y轴数值最大的顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">bot</span> = <span style="color: #020002">top</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记住准备增加元素到栈前已经存在的元素个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=<span style="color: #020002">k</span>; <span style="color: #020002">i</span> &gt;= 0; --<span style="color: #020002">i</span>)&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对每个区间循环处理</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">B</span>[<span style="color: #020002">i</span>].<span style="color: #020002">max</span> == -99)&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果区间中没有最高顶点记录的话，继续下次循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">cP</span> = &amp;<span style="color: #020002">P</span>[ <span style="color: #020002">B</span>[<span style="color: #020002">i</span>].<span style="color: #020002">max</span> ];&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取出当前区间中的最高顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (<span style="color: #020002">top</span> &gt; <span style="color: #020002">bot</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// top</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">还是比开始记住的bot大，表明栈中至少有2个元素</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">看是否满足&#8220;左转&#8221;条件</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">H</span>[<span style="color: #020002">top</span>-1], <span style="color: #020002">H</span>[<span style="color: #020002">top</span>], *<span style="color: #020002">cP</span>) &gt; 0)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">此顶点是满足条件的新凸包顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span>--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">由于顶点破坏凸包条件，需要弹出栈顶元素，直到满足</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = *<span style="color: #020002">cP</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将这个顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">minmax</span> != <span style="color: #020002">minmin</span>)<span style="color: green"> &nbsp;&nbsp; //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果X轴数值最小情况下Y轴有不同顶点存在</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>];&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">把这最后一个顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">delete</span> <span style="color: #020002">B</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">释放</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">top</span>+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回输出的凸包数组中的顶点个数<br />
</span><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1114887.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/20/1114887.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/20/1114887.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续7) </title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/19/1112650.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Wed, 19 Mar 2008 01:41:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/19/1112650.html</guid><description><![CDATA[<p>阅读: 466 评论: 2 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-19 09:41 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/19/1112650.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">介绍求取平面上顶点集合凸包的</span>Graham Scan<span style="font-family: 宋体">和</span>Andrew's Monotone Chain<span style="font-family: 宋体">方法。基本原理是在顶点排序好后，初始化一栈，循环取出顶点集合中每个顶点元素，将其与栈顶两元素进行判别，看是否符合凸包条件，循环结束后，栈中剩余元素即为所求。具体过程如下。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">求凸包</span>Graham Scan<span style="font-family: 宋体">方法。它的大致过程是：</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">找到最右下顶点</span>P<sub>0</sub><span style="font-family: 宋体">后，以各顶点与</span>P<sub>0</sub>X<span style="font-family: 宋体">的夹角来排序所有的集合中顶点。实际工作中，可简化角度计算工作，而通过前面章节介绍的</span><span style="font-size: 10pt; color: #020002; font-family: 新宋体">isLeft()</span><span style="font-family: 宋体">函数，来判断顶点</span>P<sub>2</sub><span style="font-family: 宋体">是否处于线段</span>P<sub>0</sub>P<sub>1</sub><span style="font-family: 宋体">左边，从而判断夹角的大小。设这些经过排序的顶点为</span>P<sub>0</sub><span style="font-family: 宋体">，</span>P<sub>1</sub><span style="font-family: 宋体">，</span><span style="font-family: 宋体">&#8230;</span>P<sub>n-1</sub><span style="font-family: 宋体">；<br />
&nbsp;&nbsp;&nbsp;&nbsp;邻接关系判断图&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_isLeft.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_sortedPoints.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将顶点排好序<br />
&nbsp;&nbsp;&nbsp; 然后，建立一个栈，最开始时</span>P<sub>0</sub><span style="font-family: 宋体">，</span>P<sub>1</sub><span style="font-family: 宋体">进栈，对于剩下的顶点</span>P<sub>2</sub><span style="font-family: 宋体">，</span>P<sub>3</sub><span style="font-family: 宋体">，</span><span style="font-family: 宋体">&#8230;</span>P<sub>n-1</sub><span style="font-family: 宋体">等依次取出，若栈顶的开头两个顶点与新取出的顶点不满足&#8220;左转&#8221;（即</span><span style="font-size: 10pt; color: #020002; font-family: 新宋体">isLeft()</span><span style="font-family: 宋体">函数返回数值大于</span>0<span style="font-family: 宋体">）条件，则将栈顶的第一个顶点出栈，继续测试，直到满足&#8220;左转&#8221;条件后将新取出的顶点进栈；所有剩下的顶点</span>P<sub>2</sub><span style="font-family: 宋体">，</span>P<sub>3</sub><span style="font-family: 宋体">，</span><span style="font-family: 宋体">&#8230;</span>P<sub>n-1</sub><span style="font-family: 宋体">处理完之后栈中剩下的顶点构成凸包。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">需说明的是，此方法很难推进到三维空间。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">参考代码：</span></p>
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; color: green; font-family: 新宋体">//</span><span style="font-size: 10pt; color: green; font-family: 新宋体">主程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #020002; font-family: 新宋体">Stack</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp; <span style="color: #020002">Graham</span></span>Scan<span style="font-size: 10pt; font-family: 新宋体">( )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Stack</span>&nbsp;&nbsp; <span style="color: #020002">top</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> <span style="color: #020002">i</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span> <span style="color: #020002">p1</span>, <span style="color: #020002">p2</span>;&nbsp;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span> = <span style="color: #020002">NULL</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span> = <span style="color: #020002">Push</span> ( &amp;<span style="color: #020002">P</span>[0], <span style="color: #020002">top</span> );</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span> = <span style="color: #020002">Push</span> ( &amp;<span style="color: #020002">P</span>[1], <span style="color: #020002">top</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">初始化栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span> = 2;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> ( <span style="color: #020002">i</span> &lt; <span style="color: #020002">n</span> )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对所有的排序后顶点循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>( !<span style="color: #020002">top</span>-&gt;<span style="color: #020002">next</span>) <span style="color: #020002">printf</span>(<span style="color: #a31515">"Error"n"</span>);&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">栈中没有第二个元素，报出错信息</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">p1</span> = <span style="color: #020002">top</span>-&gt;<span style="color: #020002">next</span>-&gt;<span style="color: #020002">p</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">p2</span> = <span style="color: #020002">top</span>-&gt;<span style="color: #020002">p</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">取出栈顶的两个元素</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( <span style="color: #020002">isLeft</span>( <span style="color: #020002">p1</span>-&gt;<span style="color: #020002">v</span> , <span style="color: #020002">p2</span>-&gt;<span style="color: #020002">v</span>, <span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">v</span> ) )<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断是否左转</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span> = <span style="color: #020002">Push</span> ( &amp;<span style="color: #020002">P</span>[<span style="color: #020002">i</span>], <span style="color: #020002">top</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">压栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span>++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点计数器增加</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span>&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span> = <span style="color: #020002">Pop</span>( <span style="color: #020002">top</span> );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">退栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">top</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">栈中剩下的元素即为构成凸包的顶点</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; color: green; font-family: 新宋体">//</span><span style="font-size: 10pt; color: green; font-family: 新宋体">开始准备工作中寻找所有顶点中右下角顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp; <span style="color: #020002">FindLowest</span>( <span style="color: blue">void</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> <span style="color: #020002">i</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> <span style="color: #020002">m</span> = 0;&nbsp;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> ( <span style="color: #020002">i</span> = 1; <span style="color: #020002">i</span> &lt; <span style="color: #020002">n</span>; <span style="color: #020002">i</span>++ )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对所有顶点循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> ( (<span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>] &lt;&nbsp;<span style="color: #020002">P</span>[<span style="color: #020002">m</span>].<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>]) ||</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((<span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>] == <span style="color: #020002">P</span>[<span style="color: #020002">m</span>].<span style="color: #020002">v</span>[<span style="color: #020002">Y</span>]) &amp;&amp; (<span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">v</span>[<span style="color: #020002">X</span>] &gt; <span style="color: #020002">P</span>[<span style="color: #020002">m</span>].<span style="color: #020002">v</span>[<span style="color: #020002">X</span>])) ) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">m</span> = <span style="color: #020002">i</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">m</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回右下角最低点索引</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">求凸包</span>Andrew's Monotone Chain<span style="font-family: 宋体">方法。</span></p>
<p style="text-indent: 27pt"><span style="font-size: 10pt; font-family: 新宋体">首先，依X轴和Y轴数值顺序排列所有顶点。</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_LowUpPoints.jpg" border="0"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">以最左</span>(<span style="font-family: 宋体">当</span>X<span style="font-family: 宋体">轴数值相同的时候，以</span>Y<span style="font-family: 宋体">轴数值最下和最上取顶点</span>)<span style="font-family: 宋体">至最右边的顶点</span>(<span style="font-family: 宋体">当</span>X<span style="font-family: 宋体">轴数值相同的时候，以</span>Y<span style="font-family: 宋体">轴数值最下和最上取顶点</span>)<span style="font-family: 宋体">连线，构成</span>L<sub>up</sub><span style="font-family: 宋体">，</span>L<sub>low</sub><span style="font-family: 宋体">等线段，将顶点集合分成上下两部分，分别使用类似于上面介绍的</span>Graham Scan<span style="font-family: 宋体">方法寻求子凸包，最后合并形成一个凸包（注意连接处顶点的重复存储）。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">参考代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入经过排序的顶点数组 P[]，n为数组中顶点个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出: 凸包的顶点集合 H[]</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回: H[]中的顶点个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">chainHull_2D</span>( <span style="color: #020002">Point</span>* <span style="color: #020002">P</span>, <span style="color: blue">int</span> <span style="color: #020002">n</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">H</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出的数组H[]被用作一个栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">bot</span>=0, <span style="color: #020002">top</span>=(-1);&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">指示栈底和栈顶</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> <span style="color: #020002">minmin</span> = 0, <span style="color: #020002">minmax</span>;<span style="color: green"> // </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得到X轴最小情况下Y轴分别最小和最大顶点的索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">xmin</span> = <span style="color: #020002">P</span>[0].<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: #020002">i</span>=1; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span> != <span style="color: #020002">xmin</span>) <span style="color: blue">break</span>;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点已经排好序，搜索开始阶段的X轴最小值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">minmax</span> = <span style="color: #020002">i</span>-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录X轴最小情况下Y轴最大顶点的索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">minmax</span> == <span style="color: #020002">n</span>-1) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果出现极端情况，即所有顶点X轴数值都最小</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>].<span style="color: #020002">y</span> != <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>].<span style="color: #020002">y</span>) <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果两顶点的Y轴数值不等，则可构成线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将这两个顶点增加到输出的数组中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">top</span>+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回输出的数组中的顶点个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span> <span style="color: #020002">maxmin</span>, <span style="color: #020002">maxmax</span> = <span style="color: #020002">n</span>-1;<span style="color: green"> // </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得到X轴数值最大情况下&nbsp;&nbsp;&nbsp; Y轴数值分别最小和最大的顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">xmax</span> = <span style="color: #020002">P</span>[<span style="color: #020002">n</span>-1].<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: #020002">i</span>=<span style="color: #020002">n</span>-2; <span style="color: #020002">i</span>&gt;=0; <span style="color: #020002">i</span>--)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">&nbsp;&nbsp;&nbsp; //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">从顶点的原始数组中反向循环，因为顶点已排好序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">P</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span> != <span style="color: #020002">xmax</span>) <span style="color: blue">break</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">maxmin</span> = <span style="color: #020002">i</span>+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录X轴数值最大情况下Y轴数值最小的顶点索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>]; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">开始计算下半部分凸包，首先将X轴和Y轴数值都最小的顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span> = <span style="color: #020002">minmax</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">从X轴数值最小情况下Y轴数值最大的顶点开始计数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (++<span style="color: #020002">i</span> &lt;= <span style="color: #020002">maxmin</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">以X轴和Y轴数值最小顶点连接X轴最大和Y轴数值最小顶点建立低线</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>], <span style="color: #020002">P</span>[<span style="color: #020002">maxmin</span>], <span style="color: #020002">P</span>[<span style="color: #020002">i</span>]) &gt;= 0 &amp;&amp; <span style="color: #020002">i</span> &lt; <span style="color: #020002">maxmin</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">由于此顶点位于这根低线之上，所以忽略，继续下次循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (<span style="color: #020002">top</span> &gt; 0)&nbsp;<span style="color: green">// top</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">是从最开始的-1计数，所以大于0的话，表明栈中至少有2个元素</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">H</span>[<span style="color: #020002">top</span>-1], <span style="color: #020002">H</span>[<span style="color: #020002">top</span>], <span style="color: #020002">P</span>[<span style="color: #020002">i</span>]) &gt; 0)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">表明P[i]顶点是需要的凸包中新顶点，结束循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span>--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将栈顶元素出栈，继续循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">i</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将顶点P[i]压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">下面，计算上半部分的凸包顶点集合</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">maxmax</span> != <span style="color: #020002">maxmin</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果X轴数值最大情况下Y轴有不同顶点存在</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">maxmax</span>];&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将X轴数值与Y轴数值最大的顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">bot</span> = <span style="color: #020002">top</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记住准备增加元素到栈前已经存在的元素个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">i</span> = <span style="color: #020002">maxmin</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">从X轴数值最大情况下Y轴数值最小的顶点开始计数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (--<span style="color: #020002">i</span> &gt;= <span style="color: #020002">minmax</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">以X轴和Y轴数值最大顶点连接X轴最小和Y轴数值最大顶点建立高线</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">P</span>[<span style="color: #020002">maxmax</span>], <span style="color: #020002">P</span>[<span style="color: #020002">minmax</span>], <span style="color: #020002">P</span>[<span style="color: #020002">i</span>]) &gt;= 0 &amp;&amp; <span style="color: #020002">i</span> &gt; <span style="color: #020002">minmax</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">由于此顶点位于这根高线之下，所以忽略，继续下次循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (<span style="color: #020002">top</span> &gt; <span style="color: #020002">bot</span>)&nbsp;&nbsp; <span style="color: green">// top</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">还是比开始记住的bot大，表明栈中至少有2个元素</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">H</span>[<span style="color: #020002">top</span>-1], <span style="color: #020002">H</span>[<span style="color: #020002">top</span>], <span style="color: #020002">P</span>[<span style="color: #020002">i</span>]) &gt; 0)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">break</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">表明P[i]顶点是需要的凸包中新顶点，结束循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">top</span>--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将栈顶元素出栈，继续循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">i</span>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">将顶点P[i]压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">minmax</span> != <span style="color: #020002">minmin</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果X轴数值最小情况下Y轴有不同顶点存在</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">H</span>[++<span style="color: #020002">top</span>] = <span style="color: #020002">P</span>[<span style="color: #020002">minmin</span>];&nbsp;<span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">把这最后一个顶点压入栈</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">top</span>+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回输出的凸包数组中的顶点个数</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1112650.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/19/1112650.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/19/1112650.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续6)</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/18/1111225.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Tue, 18 Mar 2008 03:35:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/18/1111225.html</guid><description><![CDATA[<p>阅读: 465 评论: 3 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-18 11:35 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/18/1111225.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">平面上顶点集合的包围容器</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">寻找几何物体（点、线段、面与体等）的包围容器（</span>Bounding Container<span style="font-family: 宋体">）能加速三维仿真程序中的光线跟踪、碰撞检测和消隐处理等过程，因为在使用这些复杂的处理方法前，采用一个包围容器的预处理能先剔除一些不需参加后续计算的几何物体。包围容器的形状分为矩形、多边形和椭圆等，需注意计算这个容器所消耗的时间应小于希望节省的时间。</span></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_boundingContainer.jpg" border="0"  alt="" /><br clear="all" />
<p style="text-indent: 27pt"><span style="font-family: 宋体">以多边形包围容器为例，寻找每条边，划分空间为两部分，最后各个部分的交集为所求容器。</span></p>
<p style="text-indent: 27pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fi(X, Y) = aiX + biY +ci &lt;=0 (i = 1,2 <span style="font-family: 宋体">&#8230;</span>k) &nbsp;(<span style="font-family: 宋体">二维</span>)</p>
<p style="text-indent: 27pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fi(X, Y, Z) = aiX + biY +ciZ + di &lt;=0 (i = 1,2 <span style="font-family: 宋体">&#8230;</span>k)&nbsp;(<span style="font-family: 宋体">三维</span>)</p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">若容器为一正规的矩形或长方体，即各条边平行于轴，可通过比较顶点的各轴数值大小，求得最小值</span>(Xmin, Ymin, Zmin)<span style="font-family: 宋体">和最大值</span>(Xmax, Ymax, Zmax)<span style="font-family: 宋体">，以</span>X=Xmin<span style="font-family: 宋体">，</span>X= Xmax<span style="font-family: 宋体">，</span>Y=Ymin<span style="font-family: 宋体">，</span>Y=Ymax<span style="font-family: 宋体">，</span>Z=Zmin, Z=Zmax<span style="font-family: 宋体">等平面划分空间，最后构成的交集为所求包围容器。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">若希望矩形或长方体容器各条边不用平行于轴，可构建</span>X&#177;Y<span style="font-family: 宋体">或</span>X&#177;Y&#177;Z<span style="font-family: 宋体">表达式来划分空间。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体"><img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_boundingBox.jpg" border="0"  alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将各顶点数据代入表达式，经比较求得</span>Cmin<span style="font-family: 宋体">、</span>Cmax<span style="font-family: 宋体">、</span>dmin<span style="font-family: 宋体">和</span>dmax<span style="font-family: 宋体">等系数。对三维空间数据同样处理，求四个表达式</span>X&#177;Y&#177;Z<span style="font-family: 宋体">的</span>8<span style="font-family: 宋体">个系数。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">顶点集合</span>Q<span style="font-family: 宋体">的凸包</span>(Convex Hull)<span style="font-family: 宋体">是指存在一个最小凸多边形，使得</span>Q<span style="font-family: 宋体">中的点在这个多边形的边上或者在其范围内。</span></p>
<p style="text-indent: 27pt">&nbsp;<img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_ConvexHull.jpg" border="0"  alt="" /></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">求凸包有很多方法，将在随后章节讲解。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">若包围容器的形状为球体（在二维平面上是圆）的话，第一步可通过顶点初始化一个球体，在考虑新顶点加入的时候，如果将新顶点包含在范围内，则球体保持不变。如果新顶点位于范围之外，则考虑如何改变球心和增大半径。许多算法考虑是如何使得这种改变最小化。以下介绍的是一种快速、简单和近似的改变方法，即连接新顶点和原球心，以这两顶点距离加上原半径构成新直径，直径上中点为新圆心。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">参考代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入:&nbsp;n个顶点的数组V[]</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输出: 包围圆的圆心和半径</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">void</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">fastBall</span>( <span style="color: #020002">Point</span> <span style="color: #020002">V</span>[], <span style="color: blue">int</span> <span style="color: #020002">n</span>, <span style="color: #020002">Ball</span>* <span style="color: #020002">B</span>)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span> <span style="color: #020002">C</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">圆心</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">rad</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">半径</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">radTwo</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">半径的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">xmin</span>, <span style="color: #020002">xmax</span>,<span style="color: #020002">ymin</span>,<span style="color: #020002">ymax</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">包围盒的顶点坐标</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp; <span style="color: #020002">Pxmin</span>,<span style="color: #020002">Pxmax</span>,<span style="color: #020002">Pymin</span>,<span style="color: #020002">Pymax</span>;&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">包围盒的顶点的索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">寻找最小和最大数值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">xmin</span> = <span style="color: #020002">xmax</span> = <span style="color: #020002">V</span>[0].<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">ymin</span> = <span style="color: #020002">ymax</span> = <span style="color: #020002">V</span>[0].<span style="color: #020002">y</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">赋第一个顶点的数值</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pxmin</span> = <span style="color: #020002">Pxmax</span> = <span style="color: #020002">Pymin</span> = <span style="color: #020002">Pymax</span> = 0;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=1; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span> &lt; <span style="color: #020002">xmin</span>) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">xmin</span> = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pxmin</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span> &gt; <span style="color: #020002">xmax</span>) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">xmax</span> = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pxmax</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span> &lt; <span style="color: #020002">ymin</span>) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">ymin</span> = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pymin</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span> &gt; <span style="color: #020002">ymax</span>) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">ymax</span> = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Pymax</span> = <span style="color: #020002">i</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录索引</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">以最大数值初始化圆</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Vector</span> <span style="color: #020002">dVx</span> = <span style="color: #020002">V</span>[<span style="color: #020002">Pxmax</span>] - <span style="color: #020002">V</span>[<span style="color: #020002">Pxmin</span>]; <span style="color: green">// X</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Vector</span> <span style="color: #020002">dVy</span> = <span style="color: #020002">V</span>[<span style="color: #020002">Pymax</span>] - <span style="color: #020002">V</span>[<span style="color: #020002">Pymin</span>]; <span style="color: green">// Y</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">dx2</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">dVx</span>,<span style="color: #020002">dVx</span>); <span style="color: green">// X</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">dy2</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">dVy</span>,<span style="color: #020002">dVy</span>); <span style="color: green">// Y</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">dx2</span> &gt;= <span style="color: #020002">dy2</span>) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// X</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度的平方大于Y轴的最大跨度的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">C</span> = <span style="color: #020002">V</span>[<span style="color: #020002">Pxmin</span>] + (<span style="color: #020002">dVx</span> / 2.0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">设置圆心的位置</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">radTwo</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">V</span>[<span style="color: #020002">Pxmax</span>] - <span style="color: #020002">C</span>,<span style="color: #020002">V</span>[<span style="color: #020002">Pxmax</span>] - <span style="color: #020002">C</span>);&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">半径的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span style="color: green">// Y</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">轴的最大跨度的平方大于X轴的最大跨度的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">C</span> = <span style="color: #020002">V</span>[<span style="color: #020002">Pymin</span>] + (<span style="color: #020002">dVy</span> / 2.0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">设置圆心的位置</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">radTwo</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">V</span>[<span style="color: #020002">Pymax</span>] - <span style="color: #020002">C</span>,<span style="color: #020002">V</span>[<span style="color: #020002">Pymax</span>] - <span style="color: #020002">C</span>);&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">半径的平方</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">rad</span> = <span style="color: #020002">sqrt</span>(<span style="color: #020002">radTwo</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">半径</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对初始圆扩展</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Vector</span> <span style="color: #020002">dV</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">double</span> <span style="color: #020002">dist</span>, <span style="color: #020002">dist2</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dV</span> = <span style="color: #020002">V</span>[<span style="color: #020002">i</span>] - <span style="color: #020002">C</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新顶点与圆心的矢量差</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dist2</span> = <span style="color: #020002">Dot</span>(<span style="color: #020002">dV</span>,<span style="color: #020002">dV</span>);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">dist2</span> &lt;= <span style="color: #020002">radTwo</span>)&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新顶点位于圆内</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">continue</span>;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新顶点不在圆内，需扩展圆</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">dist</span> = <span style="color: #020002">sqrt</span>(<span style="color: #020002">dist2</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新顶点和圆心之间的距离</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">rad</span> = (<span style="color: #020002">rad</span> + <span style="color: #020002">dist</span>) / 2.0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">改变半径</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">radTwo</span> = <span style="color: #020002">rad</span> * <span style="color: #020002">rad</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">C</span> = <span style="color: #020002">C</span> + ((<span style="color: #020002">dist</span>-<span style="color: #020002">rad</span>)/<span style="color: #020002">dist</span>) * <span style="color: #020002">dV</span>;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">新圆心的位置，从原圆心沿矢量差移动</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>-&gt;<span style="color: #020002">center</span> = <span style="color: #020002">C</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">赋圆心</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">B</span>-&gt;<span style="color: #020002">radius</span> = <span style="color: #020002">rad</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">赋半径</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span>;<br />
</span><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1111225.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/18/1111225.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/18/1111225.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续5)</title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/17/1109980.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Mon, 17 Mar 2008 07:43:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/17/1109980.html</guid><description><![CDATA[<p>阅读: 616 评论: 1 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-17 15:43 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/17/1109980.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">单调链的说明: 对于折线</span>L = {p<sub>1</sub><span style="font-family: 宋体">，</span>p<sub>2</sub><span style="font-family: 宋体">，</span>p<sub>3</sub><span style="font-family: 宋体">，</span><span style="font-family: 宋体">&#8230;</span><span style="font-family: 宋体">，</span>p<sub>n</sub>}<span style="font-family: 宋体">，</span>x<sub>i</sub><span style="font-family: 宋体">是</span>p<sub>i</sub><span style="font-family: 宋体">的横坐标，若</span>x<sub>i</sub>&lt;=x<sub>i+1</sub><span style="font-family: 宋体">，或</span>x<sub>i</sub>&gt;=x<sub>i+1</sub><span style="font-family: 宋体">，则称折线为关于</span>x<span style="font-family: 宋体">轴的单调增</span>(<span style="font-family: 宋体">或减</span>)<span style="font-family: 宋体">链。同样，对于</span>y<span style="font-family: 宋体">轴也适用。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_monochain.jpg" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">平面上多条线段求交问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 对于平面上的</span>N<span style="font-family: 宋体">条线段，若使用最直接的方法，即两两求其交点，则</span>(N-1) + (N-2)+<span style="font-family: 宋体">&#8230;</span>1 = N(N-1)/2<span style="font-family: 宋体">次运算，时间复杂度是</span>O(n<sup>2</sup>)<span style="font-family: 宋体">。这种方法对交点个数接近</span>N(N-1)/2<span style="font-family: 宋体">的情况可行，但大多数情况下，</span>N<span style="font-family: 宋体">条线段形成的交点个数是较少的，此时算法可调整成与输入线段个数和输出的交点个数相关的效率更高的方法，如</span>Bentley-Ottmann <span style="font-family: 宋体">算法。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_intersectofsegments.jpg" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 算法的思路是，以</span>X<span style="font-family: 宋体">轴升序构造顶点队列和初始化扫描线链表后,</span><span style="font-family: 宋体">对顶点队列中所有元素开始循环:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当取出的元素为线段的左端点时，首先将此条线段插入到扫描线段链表中，同时以</span>Y<span style="font-family: 宋体">轴的升序重排链表中所有元素，然后分别计算此条线段与扫描线段链表中上下相邻线段的相交情况，若有交点，则将交点插入到顶点队列中。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">当取出的元素为线段的右端点时，首先将此条线段从扫描线段链表中删除，然后计算此时与此条线段上下相邻的那两条线段之间的相交情况，如果有交点，但在顶点队列中还不存在，则将其插入顶点队列。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">当取出的元素为交点时，首先将这个交点增加到最后要输出的结果集合中。然后得到这个交点从属的两条线段，交换它们在扫描线链表中的位置后，分别与新邻接的线段求交点，如果有交点，但在顶点队列中还不存在，则将其插入顶点队列。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">以上</span>3<span style="font-family: 宋体">种情况分别处理后，从顶点队列中移走这个取出的元素。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">当循环处理完毕，结果集合中的元素即为所有的交点。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">这种方法最后以一次循环取代了最直接的两两线段求交点的两次循环。不过，需要注意的是，当交点个数接近</span>n<sup>2</sup><span style="font-family: 宋体">级别时，</span>Bentley-Ottmann<span style="font-family: 宋体">算法的效率比直接两两求其交点的方法低下。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">参考代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">intersect_Polygon</span>( <span style="color: #020002">Polygon</span> <span style="color: #020002">Pn</span> )</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">EventQueue</span>&nbsp;<span style="color: #020002">Eq</span>(<span style="color: #020002">Pn</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">顶点队列</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">SweepLine</span>&nbsp;&nbsp; <span style="color: #020002">SL</span>(<span style="color: #020002">Pn</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">扫描线链表</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当前的顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">SLseg</span>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">s</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当前的线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">Point</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #020002">singlepoint</span>;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">准备求得的交点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: #020002">PointList</span>&nbsp;&nbsp; <span style="color: #020002">PL</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">所有求得的交点保存在其中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">while</span> (<span style="color: #020002">Eq</span> != <span style="color: #020002">EMPTY</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">循环开始，直到队列为空</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">e</span> = <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">next</span>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得到开头顶点元素</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">e</span>-&gt;<span style="color: #020002">type</span> == <span style="color: #020002">LEFT</span>) {&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当为线段的开始顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">s</span> = <span style="color: #020002">SL</span>.<span style="color: #020002">add</span>(<span style="color: #020002">e</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">增加此顶点所属的线段到扫描线链表中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">SL</span>.<span style="color: #020002">intersect</span>( <span style="color: #020002">s</span>, <span style="color: #020002">s</span>-&gt;<span style="color: #020002">above</span>, <span style="color: #020002">singlepoint</span>))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断此顶点所属的线段与处于其上的线段是否相交</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">insert</span>(<span style="color: #020002">singlepoint</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">插入交点到顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">SL</span>.<span style="color: #020002">record</span>(<span style="color: #020002">s</span>, <span style="color: #020002">s</span>-&gt;<span style="color: #020002">above</span>, <span style="color: #020002">singlepoint</span>);<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">在扫描线链表中记录此交点的上下线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">SL</span>.<span style="color: #020002">intersect</span>( <span style="color: #020002">s</span>, <span style="color: #020002">s</span>-&gt;<span style="color: #020002">below</span>, <span style="color: #020002">singlepoint</span>)) </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">insert</span>(<span style="color: #020002">singlepoint</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">插入交点到顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span>(<span style="color: #020002">e</span>-&gt;<span style="color: #020002">type</span> == <span style="color: #020002">RIGHT</span>)&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当为线段的结束顶点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">s</span> = <span style="color: #020002">SL</span>.<span style="color: #020002">find</span>(<span style="color: #020002">e</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">从扫描线链表中找到此顶点所属的线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">SL</span>.<span style="color: #020002">intersect</span>( <span style="color: #020002">s</span>-&gt;<span style="color: #020002">above</span>, <span style="color: #020002">s</span>-&gt;<span style="color: #020002">below</span>,<span style="color: #020002">singlepoint</span>))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断此线段的上下两相邻线段是否相交</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(<span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">find</span>(<span style="color: #020002">singlepoint</span>) == <span style="color: blue">false</span>)&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果求得的交点还不存在于顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">insert</span>(<span style="color: #020002">singlepoint</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">插入这个新求的交点到顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">SL</span>.<span style="color: #020002">remove</span>(<span style="color: #020002">s</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">从扫描线链表中移走此顶点所属的线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">当为交点</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">PL</span>.<span style="color: #020002">add</span>(<span style="color: #020002">e</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">保存结果到最后的输出集合中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">SLseg</span>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">sE1</span> = <span style="color: #020002">SL</span>.<span style="color: #020002">findrecord</span>(<span style="color: #020002">e</span>,<span style="color: #020002">ABOVE</span>);<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得到此交点在扫描线链表中的第一条线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">SLseg</span>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">sE2</span> = <span style="color: #020002">SL</span>.<span style="color: #020002">findrecord</span>(<span style="color: #020002">e</span>,<span style="color: #020002">BELOW</span>);<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">得到此交点在扫描线链表中的第二条线段</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">SL</span>.<span style="color: #020002">swap</span>(<span style="color: #020002">sE1</span>,<span style="color: #020002">sE2</span>);&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">交换两条线段在链表中的位置，从几何上可看作：通过顶点后，两条线段的上下位置关系交换</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">SL</span>.<span style="color: #020002">intersect</span>( <span style="color: #020002">sE2</span>, <span style="color: #020002">sE2</span>-&gt;<span style="color: #020002">above</span>,<span style="color: #020002">singlepoint</span>))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断新的上下两相邻线段是否相交</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(<span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">find</span>(<span style="color: #020002">singlepoint</span>) == <span style="color: blue">false</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果求得的交点还不存在于顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">insert</span>(<span style="color: #020002">singlepoint</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">插入这个新求的交点到顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">SL</span>.<span style="color: #020002">intersect</span>( <span style="color: #020002">sE1</span>, <span style="color: #020002">sE1</span>-&gt;<span style="color: #020002">below</span>,<span style="color: #020002">singlepoint</span>))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断新的上下两相邻线段是否相交</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(<span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">find</span>(<span style="color: #020002">singlepoint</span>) == <span style="color: blue">false</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如果求得的交点还不存在于顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">insert</span>(<span style="color: #020002">singlepoint</span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">插入这个新求的交点到顶点队列中</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #020002">Eq</span>-&gt;<span style="color: #020002">remove</span>(<span style="color: #020002">e</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">此元素处理完毕，将其弹出</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">1</span>;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
</span>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1109980.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/17/1109980.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/17/1109980.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续4) </title><link>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/14/1105256.html</link><dc:creator>武汉侯涛</dc:creator><author>武汉侯涛</author><pubDate>Fri, 14 Mar 2008 03:14:00 GMT</pubDate><guid>http://www.cnblogs.com/wuhanhoutao/archive/2008/03/14/1105256.html</guid><description><![CDATA[<p>阅读: 519 评论: 2 作者: <a href="http://www.cnblogs.com/wuhanhoutao/" target="_blank">武汉侯涛</a> 发表于 2008-03-14 11:14 <a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/14/1105256.html" target="_blank">原文链接</a></p>&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">平面上点与多边形包含关系的查询。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">查询平面上一点是否在某多边形（可以为凸或凹多边形）范围内，或在其边上，或在范围之外，此方法作为</span>GIS<span style="font-family: 宋体">空间分析中的一种有广泛的应用。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">具体方法之一是从此点开始沿任意方向作射线，计算此射线与多边形的边的相交个数，由于相交能说明点进出多边形的次数，若为偶数，则在多边形范围之外，为奇数则点被包含在多边形之内。为计算方便，常将射线方向定为与</span>X<span style="font-family: 宋体">或</span>Y<span style="font-family: 宋体">轴平行。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_%e7%82%b9%e4%b8%8e%e5%a4%9a%e8%be%b9%e5%bd%a2%e5%8c%85%e5%90%ab%e5%85%b3%e7%b3%bb%e5%88%a4%e6%96%ad1.jpg" border="0"  alt="" /><br />
参考代码:<br />
<br />
</span><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">输入:&nbsp;&nbsp; 顶点 P </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">多边形的顶点数组 V[ ]， 顶点个数为n+1 ，其中 V[n]=V[0]</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: 新宋体">返回的数值:&nbsp;0表示在多边形之外, 1 表示在多边形之内</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">cn_PnPoly</span>(<span style="color: #020002">Point</span> <span style="color: #020002">P</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">V</span>,<span style="color: blue">int</span> <span style="color: #020002">n</span> )<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断一个点和多边形的包含关系</span><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">cn</span> = 0;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">记录相交个数</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对每条边进行循环</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">由V[i] 和 V[i+1]顶点构成的边</span></p>
<p style="margin-left: 15.1pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">if</span><span style="font-size: 10pt; font-family: 新宋体"> (((<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span> &lt;= <span style="color: #020002">P</span>.<span style="color: #020002">y</span>) &amp;&amp; (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>.<span style="color: #020002">y</span>))||((<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>.<span style="color: #020002">y</span>) &amp;&amp; (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">y</span> &lt;= <span style="color: #020002">P</span>.<span style="color: #020002">y</span>))) {&nbsp;&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">说明要判断的这个顶点Y数值在多边形这条边的两个端点Y轴数值之间</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: blue">double</span> <span style="color: #020002">vt</span> = (<span style="color: #020002">P</span>.<span style="color: #020002">y</span> - <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span>) / (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">y</span> - <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span>);&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">计算系数，数值在0到1之间</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: blue">if</span> (<span style="color: #020002">P</span>.<span style="color: #020002">x</span> &lt; <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span> + <span style="color: #020002">vt</span> * (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">x</span> - <span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">x</span>)) <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">说明此顶点在平行于X轴的平行线：y=P.y和与此条边的交点的右侧</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++<span style="color: #020002">cn</span>;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">说明要判断的这个顶点与多边形这条边是相交的，计数器加1</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 10pt; font-family: 新宋体">循环结束</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (cn % 2 == 0) return 0;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; else return 1;<span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">若为偶数则说明在多边形的范围外，若为奇数说明在范围内</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">方法之二是判断此点与多边形边的左右邻接关系。这需要使用前面讲解的矢量</span>XY<span style="font-family: 宋体">数值交叉相乘从而判断夹角正弦的方法。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体"><img src="http://www.cnblogs.com/images/cnblogs_com/wuhanhoutao/125287/r_%e7%82%b9%e4%b8%8e%e5%a4%9a%e8%be%b9%e5%bd%a2%e5%8c%85%e5%90%ab%e5%85%b3%e7%b3%bb%e5%88%a4%e6%96%ad2.jpg" border="0"  alt="" /><br />
<font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>此图说明顶点一进一出多边形的情况。</span></p>
<p style="text-indent: 25.7pt"><span style="font-size: 10pt; font-family: 新宋体">由于多边形范围外的顶点将一进一出，有抵消，最后的计算结果为0就说明顶点在范围之外，其他返回的计算结果都表明在范围之内。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">参考代码：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">int</span><span style="font-size: 10pt; font-family: 新宋体"> <span style="color: #020002">CDEMAlgorithm</span>::<span style="color: #020002">wn_PnPoly</span>( <span style="color: #020002">Point</span> <span style="color: #020002">P</span>, <span style="color: #020002">Point</span>* <span style="color: #020002">V</span>, <span style="color: blue">int</span> <span style="color: #020002">n</span> )<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">判断点和多边形范围的关系</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">int</span>&nbsp;&nbsp;&nbsp; <span style="color: #020002">wn</span> = 0;&nbsp;&nbsp;&nbsp; <span style="color: green">// </span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">计数器</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">for</span> (<span style="color: blue">int</span> <span style="color: #020002">i</span>=0; <span style="color: #020002">i</span>&lt;<span style="color: #020002">n</span>; <span style="color: #020002">i</span>++) {&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">对每条边进行循环，其顶点为 V[i] 和 V[i+1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">&nbsp;&nbsp;&nbsp; if</span><span style="font-size: 10pt; font-family: 新宋体"> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>].<span style="color: #020002">y</span> &lt;= <span style="color: #020002">P</span>.<span style="color: #020002">y</span>) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">y</span> &gt; <span style="color: #020002">P</span>.<span style="color: #020002">y</span>)&nbsp;&nbsp; <span style="color: green">//P</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">点的Y轴数值在一条上升边（Y轴数值增大）的范围内</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">V</span>[<span style="color: #020002">i</span>], <span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1], <span style="color: #020002">P</span>) &gt; 0)&nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">调用前面章节讲解的</span><span style="font-size: 10pt; color: #020002; font-family: 新宋体">isLeft()</span><span style="font-size: 10pt; color: #020002; font-family: 新宋体">函数，来</span><span style="font-size: 10pt; color: green; font-family: 新宋体">通过sina 的正负判断点P在此条边的左端</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++<span style="color: #020002">wn</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如上图中靠右边的那种情况</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> {&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 10pt; color: green; font-family: 新宋体">点的Y轴数值在一条下降边（Y轴数值减小）的范围内</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1].<span style="color: #020002">y</span> &lt;= <span style="color: #020002">P</span>.<span style="color: #020002">y</span>)&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (<span style="color: #020002">isLeft</span>( <span style="color: #020002">V</span>[<span style="color: #020002">i</span>], <span style="color: #020002">V</span>[<span style="color: #020002">i</span>+1], <span style="color: #020002">P</span>) &lt; 0) <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">通过sina 的正负可以判断点P在边的右端</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --<span style="color: #020002">wn</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//</span></span><span style="font-size: 10pt; color: green; font-family: 新宋体">如上图中靠左边的那种情况</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//循环结束</span></p>
<p style="margin-left: 25.7pt; text-indent: -25.7pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: #020002">wn</span>;&nbsp;//</span><span style="font-size: 10pt; font-family: 新宋体">由于多边形范围外的顶点将一进一出，有抵消，最后的计算结果为0就说明顶点在范围之外，其他返回的计算结果都表明在范围之内。</span></p>
<p><span style="font-size: 10pt; font-family: 新宋体">}</span></p>
<img src="http://www.cnblogs.com/wuhanhoutao/aggbug/1105256.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/14/1105256.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wuhanhoutao/archive/2008/03/14/1105256.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56811/" target="_blank">纽约时报：Google凭借Buzz进军社交网络</a><span style="color:gray">(2010-02-10 10:59)</span><br/>· <a href="http://news.cnblogs.com/n/56810/" target="_blank">百度视频公司龚宇：图文时代互联网竞争已定</a><span style="color:gray">(2010-02-10 10:56)</span><br/>· <a href="http://news.cnblogs.com/n/56809/" target="_blank">《魔兽世界》有望春节后合法运营</a><span style="color:gray">(2010-02-10 10:47)</span><br/>· <a href="http://news.cnblogs.com/n/56808/" target="_blank">1月必应搜索市场份额破10% 一年内可赶上雅虎</a><span style="color:gray">(2010-02-10 10:42)</span><br/>· <a href="http://news.cnblogs.com/n/56806/" target="_blank">充分保护用户隐私：Adobe Flash Player 10.1beta版本中已加入私密浏览模式</a><span style="color:gray">(2010-02-10 10:34)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>