3个点p1,p2,p3,求夹角∠P1P2P3的度数、P3在P1,P2两点所在线的左侧还是右侧
*^y
*|
*| /| p2点
*| / |
*| / |
*|--- p1点--p3点---------->x
求夹角
/**
* 求∠P1P2P3的度数
* P2的度数
*
*^y
*|
*| /| p2点
*| / |
*| / |
*|--- p1点--p3点---------->x
*
* @param p1x 第一点X
* @param p1y 第一点Y
* @param p2x 第二点X
* @param p2y 第二点Y
* @param p3x 第三点X
* @param p3y 第三点Y
* @return 返回第二点夹角
*/
private static int getIn_angle(int p1x, int p1y, int p2x, int p2y, int p3x, int p3y) {
//向量的点乘
int t =(p1x-p2x)*(p3x-p2x)+(p1y-p2y)*(p3y-p2y);
//为了精确直接使用而不使用中间变量
//包含了步骤:A=向量的点乘/向量的模相乘
// B=arccos(A),用反余弦求出弧度
// result=180*B/π 弧度转角度制
int result =(int)(180*Math.acos(
t/Math.sqrt
((Math.abs((p1x-p2x)*(p1x-p2x))+Math.abs((p1y-p2y)*(p1y-p2y)))
*(Math.abs((p3x-p2x)*(p3x-p2x))+Math.abs((p3y-p2y)*(p3y-p2y)))
))
/Math.PI);
// pi = 180
// x = ?
//====> ?=180*x/pi
return result;
}
/**
* 求P3在 P1P的左侧还是右侧
* @param p1x 第一点X
* @param p1y 第一点Y
* @param p2x 第二点X
* @param p2y 第二点Y
* @param p3x 第三点X
* @param p3y 第三点Y
* @return 返回第三点在左在右
*/
public static boolean LeftOfLine(double p1x, double p1y, double p2x, double p2y, double p3x, double p3y)
{
double tmpx = (p1x - p2x) / (p1y - p2y) * (p3y - p2y) + p2x;
//当tmpx>p3x的时候,说明点p3在线的左边,小于在右边,等于则在线上。
if (tmpx > p3x){
System.out.println("左");
return true;
}else if (tmpx == p3x){
System.out.println("在直线上");
}else if (tmpx <p3x){
System.out.println("右");
}
return false;
}