计算两条直线之间的夹角。

4

在查看这个问题提供的答案后,我创建了以下方法:

private int angleOf(float x1, float x2, float y1, float y2) {
    final double deltaY = (y1 - y2);
    final double deltaX = (x2 - x1);
    final double result = Math.toDegrees(Math.atan2(deltaY, deltaX));
    return (int) ((result < 0) ? (360d + result) : result);
}

通过使用上述方法,我将获取每条线的角度,然后将文本绘制到我的画布上,如下所示:

int topLine = angleOf(this.mPoints[5].x, this.mPoints[4].x, this.mPoints[5].y, this.mPoints[4].y);
int bottomLine = angleOf(this.mPoints[5].x, this.mPoints[6].x, this.mPoints[5].y, this.mPoints[6].y);

canvas.drawText(String.valueOf(360 - bottomLine + topLine)+"°", this.mPoints[5].x - 80.0f, this.mPoints[5].y, this.mTextPaint);



上面的代码运行良好,这是我得出的结果示例:

exampleImage1


我的问题是角度是从X轴开始,并且逆时针增加,如下图所示:

image2

当底部线或顶部线“穿过”0°(与X轴平行)时,我会得到一个不正确的角度。

这里有另一张图片来演示这个问题:

image3

蓝色线之间的角度是90°,但我却得到了450°。这是因为我使用的计算公式是360 - bottomLine + topLine

请问有人能提供解决此问题的方案吗?

谢谢。


1
(360 - topLine + bottomLine) % 360 或类似的东西。 - pskink
@pskink,你的评论非常理想。 - karan
@KaranMer 我希望如此,因为我没有测试它;-) - pskink
你正在计算通过点 (x1,y1)(x2,y2) 的直线与 x 轴之间的角度。我猜这不是你想要做的。 - Andy Turner
1
% is a modulo operator, not divide, for example 36 % 10 == 6, and not 3.6 - pskink
显示剩余4条评论
2个回答

1
你可以像这样使用,输出值为弧度坐标点(0,0),其他点(x1,y1),(x2,y2)。 atan()=tan反函数。
private double angleOfRadian(float x1, float x2, float y1, float y2) {
     return java.lang.Math.atan(y2/x2)-java.lang.Math.atan(y1/x1);
}

0
使用此方法正确计算:
private double angleOfDegrees(float x0, float y0, float x1, float y1) {
    double angle2 = Math.atan2(y1,x1);
    double angle1 = Math.atan2(y0,x0);

   return Math.toDegrees(angle2 - angle1) + 360) % 360;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接