您的位置:首页 > 其它

判断一个点在三角形之内

2008-07-07 00:42 471 查看
这个问题曾在 csdn 以及 21icbbs 提出过,我已找不到过去的连接。这个问题首先是判据,有网友提出判断点在三角形线段左右,这个问题已被我证明与我提出的判据最终的结果一致,尽管我是用矢量来推导,因为矢量有方向性,故而存在左右之分。我的判据是:如果 X 一个点在 A, B, C 三点形成的三角形内,则 X 与 ABC 之间的夹角XA, XB, XC 都小于 180 度;如果有一个角为180,则在三角形上。这样这个问题变成了求解角度。

求解角度,最好的手段莫过于复数,首先回顾一下复数的特性:

1)两点A, B 坐标为 (xa, ya), (xb, yb), 则矢量

AB = (xa + jyb) - (xb + jyb) = (xa-xb) + j(ya-yb) = R + jI

2) 极坐标变换:

R + jI = sqrt(R^2 + I^2)*(cos(A) + jsin(A)) = M*exp(jA), (1)

where M = sqrt(R^2 + I^2), A is the angle.

3) 将矢量 R+jI=M*exp(jA) 旋转 T度:

M*exp(jA + T) = M*exp(jA) * exp(jT) = (R+jI)*(cos(T) + jsin(T))

= (R*cos(T) - I*sin(T)) + j(R*sin(T) + I*cos(T)) (2)

4) 矢量 x1+jy1=M1*exp(jA1) 与 x2+jy2=M2*exp(jA2) 之间的夹角 A1 - A2:

exp(j(A1-A2)) = exp(jA1)*exp(-jA2)

= (x1+jy1)/M1 *(x2-jy2)/M2

= ((x1*x2+y1*y2) + j(y1*x2 - y2*x1))/M1/M2 (3)

s o,

A1-A2 = arctan2(x1*x2 + y1*y2, y1*x2 - y2*x1) (4)

现在来看看三个矢量 XA, XB, XC :

XA = (x+jy) - (xa + jya) = (x-xa) + j(y-ya) = Ra + jIa

XB = (x+jy) - (xb + jyb) = (x-xb) + j(y-yb) = Rb + jIb

XC = (x+jy) - (xc + jyc) = (x-xc) + j(y-yc) = Rc + jIc

XA, XB之间的夹角为:

Aa-Ab = arctan2(Ra*Rb + Ia*Ib, Ia*Rb - Ib*Ra)

若要 XA, XB之间的夹角小于180 度,则要求 Aa-Ab 在第一和第二象限,即:

(Ia*Rb - Ib*Ra) > 0.

因而,一个点在三角形之内,必须同时满足下列三个条件

(Ia*Rb - Ib*Ra) > 0;

(Ib*Rc - Ic*Rb) > 0;

(Ic*Ra - Ia*Rc) > 0;

可见,解决此类问题,引入复数可以让推导过程大大简化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: