Java 计算两条线之间的角度而不必计算斜率?(爪哇)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3365171/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Calculating the angle between two lines without having to calculate the slope? (Java)
提问by jNoob
I have two Lines: L1 and L2. I want to calculate the angle between the two lines. L1 has points: {(x1, y1), (x2, y2)}
and L2 has points: {(x3, y3), (x4, y4)}
.
我有两条线路:L1 和 L2。我想计算两条线之间的角度。L1 有分:{(x1, y1), (x2, y2)}
L2 有分:{(x3, y3), (x4, y4)}
。
How can I calculate the angle formed between these two lines, without having to calculate the slopes? The problem I am currently having is that sometimes I have horizontal lines (lines along the x-axis) and the following formula fails (divide by zero exception):
如何计算这两条线之间形成的角度,而不必计算斜率?我目前遇到的问题是有时我有水平线(沿 x 轴的线)并且以下公式失败(除以零异常):
arctan((m1 - m2) / (1 - (m1 * m2)))
where m1
and m2
are the slopes of line 1 and line 2 respectively. Is there a formula/algorithm that can calculate the angles between the two lines without ever getting divide-by-zero exceptions? Any help would be highly appreciated.
其中m1
和m2
分别是第 1 行和第 2 行的斜率。是否有公式/算法可以计算两条线之间的角度而不会出现除零异常?任何帮助将不胜感激。
This is my code snippet:
这是我的代码片段:
// Calculates the angle formed between two lines
public static double angleBetween2Lines(Line2D line1, Line2D line2)
{
double slope1 = line1.getY1() - line1.getY2() / line1.getX1() - line1.getX2();
double slope2 = line2.getY1() - line2.getY2() / line2.getX1() - line2.getX2();
double angle = Math.atan((slope1 - slope2) / (1 - (slope1 * slope2)));
return angle;
}
Thanks.
谢谢。
回答by FrustratedWithFormsDesigner
First, are you sure the brackets are in the right order? I think (could be wrong) it should be this:
首先,您确定括号的顺序正确吗?我认为(可能是错的)应该是这样的:
double slope1 = (line1.getY1() - line1.getY2()) / (line1.getX1() - line1.getX2());
double slope2 = (line2.getY1() - line2.getY2()) / (line2.getX1() - line2.getX2());
Second, there are two things you could do for the div by zero: you could catch the exception and handle it
其次,您可以为 div 做两件事,为零:您可以捕获异常并处理它
double angle;
try
{
angle = Math.atan((slope1 - slope2) / (1 - (slope1 * slope2)));
catch (DivideByZeroException dbze)
{
//Do something about it!
}
...or you could check that your divisors are never zero beforeyou attempt the operation.
...或者您可以在尝试操作之前检查您的除数从不为零。
if ((1 - (slope1 * slope2))==0)
{
return /*something meaningful to avoid the div by zero*/
}
else
{
double angle = Math.atan((slope1 - slope2) / (1 - (slope1 * slope2)));
return angle;
}
回答by Joseph Weissman
Dot product is probably more useful in this case. Hereyou can find a geometry package for Java which provides some useful helpers. Below is their calculation for determining the angle between two 3-d points. Hopefully it will get you started:
在这种情况下,点积可能更有用。在这里您可以找到 Java 的几何包,它提供了一些有用的帮助程序。下面是他们用于确定两个 3-d 点之间角度的计算。希望它能让你开始:
public static double computeAngle (double[] p0, double[] p1, double[] p2)
{
double[] v0 = Geometry.createVector (p0, p1);
double[] v1 = Geometry.createVector (p0, p2);
double dotProduct = Geometry.computeDotProduct (v0, v1);
double length1 = Geometry.length (v0);
double length2 = Geometry.length (v1);
double denominator = length1 * length2;
double product = denominator != 0.0 ? dotProduct / denominator : 0.0;
double angle = Math.acos (product);
return angle;
}
Good luck!
祝你好运!
回答by brainjam
The atan2
function eases the pain of dealing with atan
.
该atan2
功能减轻了处理atan
.
It is declared as double atan2(double y, double x)
and converts rectangular coordinates (x,y)
to the angle theta
from the polar coordinates (r,theta)
它被声明为double atan2(double y, double x)
并将直角坐标从极坐标转换(x,y)
为角度theta
(r,theta)
So I'd rewrite your code as
所以我将你的代码重写为
public static double angleBetween2Lines(Line2D line1, Line2D line2)
{
double angle1 = Math.atan2(line1.getY1() - line1.getY2(),
line1.getX1() - line1.getX2());
double angle2 = Math.atan2(line2.getY1() - line2.getY2(),
line2.getX1() - line2.getX2());
return angle1-angle2;
}
回答by phkahler
dx1 = x2-x1; dy1 = y2-y1; dx2 = x4-x3; dy2 = y4-y3; d = dx1*dx2 + dy1*dy2; // dot product of the 2 vectors l2 = (dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2) // product of the squared lengths angle = acos(d/sqrt(l2));
The dot product of 2 vectors is equal to the cosine of the angle time the length of both vectors. This computes the dot product, divides by the length of the vectors and uses the inverse cosine function to recover the angle.
两个向量的点积等于角度乘以两个向量长度的余弦。这将计算点积,除以向量的长度并使用反余弦函数来恢复角度。
回答by AliveStar
The formula for getting the angle is tan a = (slope1-slope2)/(1+slope1*slope2)
获得角度的公式是 tan a = (slope1-slope2)/(1+slope1*slope2)
You are using:
您正在使用:
tan a = (slope1 - slope2) / (1 - slope1 * slope2)
So it should be:
所以应该是:
double angle = Math.atan((slope1 - slope2) / (1 + slope1 * slope2));
回答by Dehimb
Maybe my approach for Android coordinates system will be useful for someone (used Android PointF class to store points)
也许我的 Android 坐标系统方法对某人有用(使用 Android PointF 类来存储点)
/**
* Calculate angle between two lines with two given points
*
* @param A1 First point first line
* @param A2 Second point first line
* @param B1 First point second line
* @param B2 Second point second line
* @return Angle between two lines in degrees
*/
public static float angleBetween2Lines(PointF A1, PointF A2, PointF B1, PointF B2) {
float angle1 = (float) Math.atan2(A2.y - A1.y, A1.x - A2.x);
float angle2 = (float) Math.atan2(B2.y - B1.y, B1.x - B2.x);
float calculatedAngle = (float) Math.toDegrees(angle1 - angle2);
if (calculatedAngle < 0) calculatedAngle += 360;
return calculatedAngle;
}
It return positive value in degrees for any quadrant: 0 <= x < 360
它以度为单位返回任何象限的正值:0 <= x < 360
You can checkout my utility class here
回答by Tirtha Chetry
Check this Python code:
检查此 Python 代码:
import math
def angle(x1,y1,x2,y2,x3,y3):
if (x1==x2==x3 or y1==y2==y3):
return 180
else:
dx1 = x2-x1
dy1 = y2-y1
dx2 = x3-x2
dy2 = y3-y2
if x1==x2:
a1=90
else:
m1=dy1/dx1
a1=math.degrees(math.atan(m1))
if x2==x3:
a2=90
else:
m2=dy2/dx2
a2=math.degrees(math.atan(m2))
angle = abs(a2-a1)
return angle
print angle(0,4,0,0,9,-6)
回答by theodore panagos
dx1=x2-x1 ; dy1=y2-y1 ; dx2=x4-x3 ;dy2=y4-y3.
Angle(L1,L2)=pi()/2*((1+sign(dx1))* (1-sign(dy1^2))-(1+sign(dx2))*(1-sign(dy2^2)))
+pi()/4*((2+sign(dx1))*sign(dy1)-(2+sign(dx2))*sign(dy2))
+sign(dx1*dy1)*atan((abs(dx1)-abs(dy1))/(abs(dx1)+abs(dy1)))
-sign(dx2*dy2)*atan((abs(dx2)-abs(dy2))/(abs(dx2)+abs(dy2)))