判断一个点在三角形之内
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;
可见,解决此类问题,引入复数可以让推导过程大大简化。
求解角度,最好的手段莫过于复数,首先回顾一下复数的特性:
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;
可见,解决此类问题,引入复数可以让推导过程大大简化。
相关文章推荐
- Algorithm: 如何判断一个点是否在一个三角形内
- 如何判断一个点是否在三角形内部
- 如何判断一个点在三角形之外
- 如何判断一个点是否在三角形里
- 判断一个点是否在三角形区域内
- 判断一个点是不是在三角形中 用面积算法
- 一个判断射线和三角形相交的函数
- 一个窗口,用户输入三个数,你判断能否构成三角形以及面积
- 算法题目三:判断数组中任意三条边能否组成一个三角形,若能返回1,不能返回0
- C++第六周任务4设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。
- 判断点是否在一个三角形内部
- 如何判断一个点是否在三角形内部
- 如何判断一个点是否在一个多边形内部+三角形有向面积公式
- Algorithm: 如何判断一个点是否在一个三角形内
- 如何判断一个点是否在三角形内部
- 写一个判断是否构成三角形的程序
- 判断三个参数是否能构成一个三角形。如果不能则抛出异常IllegalArgumentException, * 显示异常信息:a,b,c “不能构成三角形”;如果可以构成则显示三角形三个边长。在主方
- lesson 6:写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形。
- 绘制一个三角形和判断一个点是否在这个三角形中