java 点是否在三角形_Java 判断一个点是否在一个三角形内

题目描述:??如何判断一个点是否在一个三角形内 。
测试样例:

java 点是否在三角形_Java 判断一个点是否在一个三角形内

文章插图
自定义的POINT类:
class POINT{
int x;
int y;
POINT(int x,int y){
this.x = x;
this.y = y;
思路一:面积法:
如果一个点在三角形内,其与三角形的三个点构成的三个子三角形的面积等于大三角形的面积 。否则,大于大三角形的面积 。
所以,这个问题就转化成如何在知道三角形的三个点的情况下,求这个三角形的面积的问题了 。
因为所有点的坐标已知 , 我们有几种方式计算面积:
1)首先可以计算出每条边的长度及周长,我们就可以利用海伦公式计算面积,然后进行比较 。
S=p(p?a)(p?b)(p?c)?????????????????√
p=(a+b+c)2
2)向量法:先求出这个三角形的对应的平行四边形的面积 。然后这个面积的1/2就是三角形的面积了 。
先随意选择两个点,如B、C通过其坐标相减得向量(B,C) 。记得谁减另一个就是指向谁 。然后求出其中一个点和剩下一个点的向量 。这两个向量的叉乘的便是平行四边形的面积 。除以2就是三角形的面积 。(注意这里是叉乘 (cross ),而非点乘(dot )) 。
(补充)向量之间的积分为两种:叉乘和点乘 。叉乘求面积 , 点乘求投影 。这是两者的意义 。而且,叉乘理论得到的是一个向量,而点乘得到的是一个标量 。
代码:final= 0.0001;
(POINT A, POINT B, POINT C, POINT P) {
ABC = (A, B, C);
ABp = (A, B, P);
ACp = (A, C, P);
BCp = (B, C, P);
= ABp + ACp + BCp;
【java 点是否在三角形_Java 判断一个点是否在一个三角形内】if (- < (ABC - ) && (ABC - ) < ) {// 若面积之和等于原三角形面积,证明点在三角形内
true;
} else {
false;
(POINT A, POINT B, POINT C) {// 由三个点计算这三个点组成三角形面积
POINT ab,bc;
ab = new POINT(B.x - A.x,B.y - A.y);//
bc = new POINT(C.x - B.x,C.y - B.y);
Math.abs((ab.x * bc.y - ab.y * bc.x) / 2.0);
思路二:同向法:
假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时 , 你会发现点P始终位于边AB , BC和CA的右侧 。我们就利用这一点,但是如何判断一个点在线段的左侧还是右侧呢?我们可以从另一个角度来思考,当选定线段AB时,点C位于AB的右侧,同理选定BC时,点A位于BC的右侧,最后选定CA时 , 点B位于CA的右侧,所以当选择某一条边时 , 我们只需验证点P与该边所对的点在同一侧即可 。问题又来了,如何判断两个点在某条线段的同一侧呢?可以通过叉积来实现,连接PA,将PA和AB做叉积 , 再将CA和AB做叉积,如果两个叉积的结果方向一致,那么两个点在同一测 。
java 点是否在三角形_Java 判断一个点是否在一个三角形内

文章插图
代码:(POINT A, POINT B, POINT C, POINT P) {
/*利用叉乘法进行判断,假设P点就是M点*/
int a = 0, b = 0, c = 0;
java 点是否在三角形_Java 判断一个点是否在一个三角形内

文章插图
POINT MA = new POINT(P.x - A.x,P.y - A.y);
POINT MB = new POINT(P.x - B.x,P.y - B.y);
POINT MC = new POINT(P.x - C.x,P.y - C.y);
/*向量叉乘*/
a = MA.x * MB.y - MA.y * MB.x;
b = MB.x * MC.y - MB.y * MC.x;
c = MC.x * MA.y - MC.y * MA.x;
if((a0))
true;
false;
思路三:重心法:
我们都知道 , 三角形的三个点在同一个平面上 , 如果选中其中一个点,其他两个点不过是相对该点的位移而已,比如选择点A作为起点 , 那么点B相当于在AB方向移动一段距离得到,而点C相当于在AC方向移动一段距离得到 。
java 点是否在三角形_Java 判断一个点是否在一个三角形内

文章插图
所以对于平面内任意一点,都可以由如下方程来表示 。
P=A+u?(C?A)+v?(B?A)
如果系数u或v为负值,那么相当于朝相反的方向移动,即BA或CA方向 。那么如果想让P位于三角形ABC内部,u和v必须满足什么条件呢?有如下三个条件:
u >= 0
v >= 0
u + v = 0) && (v >= 0) && (u + v < 1);
float (POINT p1, POINT p2) {
p1.x * p2.x + p1.y * p2.y;