我有2分。基点和其他点。我需要获得基准应移动的角度以使其他点与之相反。但可能性从0到360度不仅仅是90度。
我现在应该用三角法做,但我不知道怎么做。有人可以解释一下我应该使用哪些算法?还是粘贴溶液?谢谢
答案 0 :(得分:2)
这确实是一个三角测量问题,但听起来你基本上想要红色和黑色点之间的角度,然后只需向该角度添加180°。
然而: Math.atan2(y,x)
可以在这里帮助你,因为你可以给它x坐标的差异和y坐标的差异,以获得一个角度(以弧度表示)。
你真的应该查看trig,因为你可以在10分钟左右的时间里学习基本的东西。 " SOH CAH TOA"对你的一生都有用。
答案 1 :(得分:2)
使用这些点绘制直角三角形并查看角度。如果你知道点的坐标,你就能找到角度,因为知道了tringles的一面。
整体应该是这样的:
double alpha = Math.atan((yb - yp) / (xb - xp));
其中
xb,yb是基点的坐标
xp,yp是红点的坐标
alpha
将以弧度为单位,而不是度数。
并注意atan
会将值从-pi/2
返回到pi/2
答案 2 :(得分:-1)
角度可以通过以下方式获得:angle = Math.acos(unit-vector(a).unit-vector(b))其中a和b是基点和初始方向之间的向量,以及base点和其他点分别('。'代表点积) 如果您想要以度为单位的角度,请执行以下操作:angle =(angle * 180 / Math.PI)。
如果您不了解向量并了解Java,请阅读:
您需要以下信息:
(向量有2个分量,x和y。用双x和y声明一个类,或者使用Point)
newVector(Point p1, Point p2)
{
// returns a new vector from point a
//to point b given two absolute co-ordinates a and b
vector new1 = new vector(0, 0);
new1.x = p2.x - p1.x;
new1.y = p2.y - p1.y;
return new1;
}
在图中,如果你想要vector(a),请执行newVector(basePoint,initialDirection);
同样,vector(b)= newVector(basePoint,otherPoint)
unitVector(vector a)
{
vector new1 = new vector(0,0);
new.x = a.x/(Math.sqrt(a.x*a.x + a.y*a.y));
new.x = a.y/(Math.sqrt(a.x*a.x + a.y*a.y));
return new1;
}
在图中,如果你想要单位矢量(a),可以执行unitVector(vector(a))
dotProduct(vector a, vector b)
{
double val;
val = a.x*b.x + a.y*b.y;
return val;
}
在图中,如果你想要单位向量(a).unit-vector(b),请做dotProduct(unit-vector(a),unit-vector(b))