您的位置:首页 > 其它

华为oj 之 判断点是否在三角形内

2016-01-11 03:01 405 查看
/*
* 任意顶点为A、B、C的三角形,如果点P在三角形内,那么
* 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧
* 反之亦然(充要条件)
*
* 关键:如何判断某两个点在某条直线的同一侧
*    参考图示发现:
*      对于点P: AB*BC的方向 和 AB*BP的方向相同
*      对于点P1: AB*BC的方向 和 AB*BP1的方向不同
*    故:对于边AB,以及点C、P,如果AB*BC的方向 和 AB*BP的方向相同,
*      那么点P和C在边AB的同一侧。
*/





public class POINT {
int x;
int y;
public POINT(int x,int y)
{
this.x=x;
this.y=y;
}
}


public class Main {

/*
*      求叉积   正:Z轴正向 ;负:Z轴负向;绝对值:叉积的模(以两个向量为边的平行四边形的面积)
*      eg : 求a*b  向量a = (x1, y1, z1) 向量b = (x2, y2, z2)
*           因为a和b在三角形中,所以z1 = 0、z2 = 0,
*           所以 |a*b| = |x1·y2 - x2·y1|
*           详见:https://zh.wikipedia.org/zh/%E5%90%91%E9%87%8F%E7%A7%AF
*/
private static int crossProduct(POINT A, POINT B, POINT C, POINT D) {
int x1 = B.x - A.x;
int y1 = B.y - A.y;

int x2 = D.x - C.x;
int y2 = D.y - C.y;

return (x1*y2 - x2*y1);
}

// 叉积得到的方向是否相同 true:方向相同;false:方向不同
private static boolean isSameDirection(POINT A, POINT B, POINT C, POINT P) {
int Direction1 = crossProduct(A, B, B, C);
int Direction2 = crossProduct(A, B, B, P);
if (Direction1*Direction2 >= 0) { // 等于0:两个向量平行 (说明P点在三角形的AB边上)
return true;
}
return false;
}

// 判断P点是否在顶点为A、B、C的三角形内(在三角形的边上,也视作在三角形中)
public static  boolean isInTriangle(POINT A, POINT B, POINT C, POINT P)
{
if (isSameDirection(A, B, C, P) && isSameDirection(B, C, A, P) && isSameDirection(C, A, B, P)) {
return true;
}
return false;
}

public static void main(String[] args) {

POINT A=new POINT(0,0);
POINT B=new POINT(0,80);
POINT C=new POINT(80,0);
POINT P=new POINT(20,60);
boolean b1 = isInTriangle(A, B, C, P);  // true

POINT A2=new POINT(0,0);
POINT B2=new POINT(0,80);
POINT C2=new POINT(80,0);
POINT P2=new POINT(21,60);
boolean b2 = isInTriangle(A2, B2, C2, P2);  // false

String result = null;
System.out.println(result);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: