十多年前写过c#版本,可能写的不清楚 根据余弦定理求两个线段夹角_王月的专栏-CSDN博客
/**
* 根据余弦定理计算线段1到线段2的夹角,线段1:起始点到原点,线段2:原点到结束点)
* @param o 原点
* @param s 起始点
* @param e 结束点
* @return
*/
public double calAngle(BlockPoint o, BlockPoint s, BlockPoint e) {
double cosfi = 0;
double fi = 0;
double norm = 0;
double dsx = s.getPosX() - o.getPosX();
double dsy = s.getPosY() - o.getPosY();
double dex = e.getPosX() - o.getPosX();
double dey = e.getPosY() - o.getPosY();
cosfi = dsx * dex + dsy * dey;
norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey);
cosfi /= Math.sqrt(norm);
if (cosfi >= 1.0) return 0;
if (cosfi <= -1.0) return Math.PI;
fi = Math.acos(cosfi);
if (180 * fi / Math.PI < 180) {
return 180 * fi / Math.PI;
} else {
return 360 - 180 * fi / Math.PI;
}
}