【发布时间】:2012-08-15 18:45:02
【问题描述】:
我有一个由两个向量组成的线段,比如说v1和v2,一个向量v3和一个角度a。如何在 Java 中编写方法(我也在使用 Apache Commons Math 来表示向量)这给了我一个向量 v4,因此线段 v1-v2 和 v3- v4 在角度 a? 有无限的 v4 元素,如果我可以给该方法一个大小,使线段 v3-v4 具有该大小,那就更好了。 (都是二维空间,角度可以是弧度也可以是度数,没关系)
编辑: 正如我所承诺的,我已经包含了我正在尝试解决的问题的图像。我有一个由 2 个向量定义的线段(线有点长,但没关系)、一个角度和第三个点。我需要绘制第二条线,它与第一条线以 a 角相交。由于 Javafx 中的所有线(我在这里使用)都是通过定义两个点来绘制的,所以我需要找到红点(或任何可能的红点)。
编辑:使用阿里的回答,我得到了以下方法,可以满足我的需要:
public Pair<Vector2D, Vector2D> calculateFourthPoint(Vector2D v1, Vector2D v2, Vector2D v3, double angleInDegrees) {
Vector2D r = v1.subtract(v2);
double rx = r.getX();
double ry = r.getY();
double angle = toRadians(angleInDegrees);
double a = pow(rx, 2) + pow(ry, 2);
double b = 2 * sqrt(pow(rx, 2) + pow(ry, 2)) * cos(angle) * rx;
double c = pow(rx, 2) * pow(cos(angle), 2) + pow(ry, 2) * pow(cos(angle), 2) - pow(ry, 2);
double discriminant = sqrt(pow(b, 2) - (4 * a * c));
double sx1 = (-b + discriminant) / (2 * a);
double sx2 = (-b - discriminant) / (2 * a);
double sy1 = sqrt(1 - pow(sx1, 2));
double sy2 = sqrt(1 - pow(sx2, 2));
Vector2D s1 = new Vector2D(sx1, sy1);
Vector2D s2 = new Vector2D(sx2, sy2);
Vector2D v4_1 = v3.subtract(s1);
Vector2D v4_2 = v3.subtract(s2);
return new Pair<Vector2D, Vector2D>(v4_1, v4_2);
}
【问题讨论】:
-
使用点积和 arccos 看起来很简单。
-
二维还是三个?还是更多?
-
@Beta 必须是 2D 的,否则问题没有明确定义。
-
@Ali:为什么会这样?他意识到可能有多种解决方案,他只想要其中一种。
-
@BlueRaja-DannyPflughoeft 在 3D 中,解向量位于圆锥上。在 2D 中,方向是明确定义的。