判断一个点在三角形之内

这个问题曾在 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;                         

可见,解决此类问题,引入复数可以让推导过程大大简化。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值