<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wut I am &#187; 数学</title>
	<atom:link href="http://wutiam.net/tag/math/feed/" rel="self" type="application/rss+xml" />
	<link>http://wutiam.net</link>
	<description>I'm islet8, I'm what I am</description>
	<lastBuildDate>Wed, 28 Jul 2010 02:50:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>判断一个点是否在 2D 三角形内</title>
		<link>http://wutiam.net/2009/02/how-to-decide-whether-a-point-is-inside-a-triangle/</link>
		<comments>http://wutiam.net/2009/02/how-to-decide-whether-a-point-is-inside-a-triangle/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 03:29:03 +0000</pubDate>
		<dc:creator>islet8</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[图形图像]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://wutiam.net/?p=91</guid>
		<description><![CDATA[这是我拿到公司 offer 时美国老大给我的面试题，对于当时我这种文盲来说，还是杀死了不少脑细胞。最近闲来无事（嗯。。。被危机了），又拿出来琢磨了一下各算法。
设一在在 2D 空间中的三角形 △ABC ，三个顶点向量 A(ax, ay)、B(bx, by)、C(cx, cy)，三条有向边 AB、BC、CA，有一点 P(px, py)。

叉乘法
原理：
沿 △ABC 各有向边按一定方向走（顺时针或逆时针），判断点 P 是否在该边的某侧（右侧或左侧），若点 P 在三条边的同侧，则点 P 在 △ABC 内。
实现：
分别计算向量 AB、BC、CA 与向量 AP、BP、CP 的向量积（叉乘），若三个结果均同号（正或负，为零表示 P 在边上），则可得点 P 在 △ABC 内。其中AB = B - A，AB×AP = AB.x*AP.y - AB.y*AP.x。
该算法只需要做 3 次叉乘（6 次普通数值乘法），效率高，且没有浮点误差。
这是我当时面试想的算法，Azure 等人也用的类似算法。
面积法
原理：
若点 P 在 △ABC 内，则 △ABP、△BCP、△CAP 的面积之和应等于 △ABC 的面积。
实现：
利用两个向量叉积的几何意义为该两个向量所围三角形面积的 2 倍，分别计算 AB×BP、BC×CP、CA×AP、AB×BC，若 [...]


Related posts:<ul><li><a href='http://wutiam.net/2009/09/pbrt-study-install-and-build/' rel='bookmark' title='Permanent Link: PBRT 学习：安装编译'>PBRT 学习：安装编译</a></li>
<li><a href='http://wutiam.net/2009/04/problem-of-compiling-wowmodelviewer/' rel='bookmark' title='Permanent Link: WoW Model Viewer 的编译问题'>WoW Model Viewer 的编译问题</a></li>
<li><a href='http://wutiam.net/2009/04/3d-coordinates/' rel='bookmark' title='Permanent Link: 3D Coordinates'>3D Coordinates</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>这是我拿到<a title="上班，过年" href="/2008/02/working-and-chinese-new-year/">公司</a> offer 时美国老大给我的面试题，对于当时我这种文盲来说，还是杀死了不少脑细胞。最近闲来无事（嗯。。。被危机了），又拿出来琢磨了一下各算法。</p>
<p>设一在在 2D 空间中的三角形 △ABC ，三个顶点向量 A(ax, ay)、B(bx, by)、C(cx, cy)，三条有向边 AB、BC、CA，有一点 P(px, py)。</p>
<ol>
<li>叉乘法</li>
<p>原理：</p>
<p>沿 △ABC 各<strong>有向边</strong>按一定方向走（顺时针或逆时针），判断点 P 是否在该边的某侧（右侧或左侧），若点 P 在三条边的同侧，则点 P 在 △ABC 内。</p>
<p>实现：</p>
<p>分别计算向量 AB、BC、CA 与向量 AP、BP、CP 的向量积（叉乘），若三个结果均同号（正或负，为零表示 P 在边上），则可得点 P 在 △ABC 内。其中AB = B - A，AB×AP = AB.x*AP.y - AB.y*AP.x。</p>
<p>该算法只需要做 3 次叉乘（6 次普通数值乘法），效率高，且没有浮点误差。<br />
这是我当时面试想的算法，<a title="快速判断点在2D三角形内" href="http://www.azure.com.cn/article.asp?id=235">Azure</a> <a title="叉乘法判断点是否在三角形内" href="http://blog.csdn.net/dracularking/archive/2008/03/25/2217180.aspx">等人</a>也用的类似算法。</p>
<li>面积法</li>
<p>原理：</p>
<p>若点 P 在 △ABC 内，则 △ABP、△BCP、△CAP 的面积之和应等于 △ABC 的面积。</p>
<p>实现：</p>
<p>利用两个向量叉积的几何意义为该两个向量所围三角形面积的 2 倍，分别计算 AB×BP、BC×CP、CA×AP、AB×BC，若 |AB×BP| + |BC×CP| + |CA×AP| = |AB×BC|，则得点 P 在 △ABC 内。</p>
<p>这个算法用得比较普遍，需要做 4 次叉乘（8 次普通数值乘法），效率和叉乘法差不多，同时避免了用海伦公式计算面积的低效和精度问题（数值除法和开方运算）。</ol>
<p>我昨天想的一个算法有点类似<a title="如何判断一点在三角形内" href="http://www.cnblogs.com/cgwolver/archive/2008/07/31/1257611.html">这篇文章</a>中的方法 3，比它简单一点，但同样需要对向量做归一化处理，效率不高，故放弃了。另外的算法还包括划线交点法、解方程组法、<a title="判断一个点在三角形之内" href="http://blog.csdn.net/Akron/archive/2008/07/07/2619496.aspx">复数法</a>等，但计算量都较大，不再赘述。</p>


<p>Related posts:<ul><li><a href='http://wutiam.net/2009/09/pbrt-study-install-and-build/' rel='bookmark' title='Permanent Link: PBRT 学习：安装编译'>PBRT 学习：安装编译</a></li>
<li><a href='http://wutiam.net/2009/04/problem-of-compiling-wowmodelviewer/' rel='bookmark' title='Permanent Link: WoW Model Viewer 的编译问题'>WoW Model Viewer 的编译问题</a></li>
<li><a href='http://wutiam.net/2009/04/3d-coordinates/' rel='bookmark' title='Permanent Link: 3D Coordinates'>3D Coordinates</a></li>
</ul></p>]]></content:encoded>
			<wfw:commentRss>http://wutiam.net/2009/02/how-to-decide-whether-a-point-is-inside-a-triangle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
