我试图弄清楚如何计算圆上的坐标。为简单起见,我制作了一些图片。
这是我拥有的信息的开始。现在我需要计算新坐标,例如圆圈向右旋转90度。就像下一张图片一样:
我需要计算新红点的坐标。 (我也需要不同的度数,如20度)。
为此,我的计划是执行以下操作:
我的第一步是:
distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y))
计算新学位的部分是:
double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);
theta += Math.PI/2.0;
计算新位置的最后一部分是:
double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta));
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta));
然而,当我使用例如0度进行这些计算时,它仍会返回另一个值而不是原始坐标。
任何帮助将不胜感激!
为Philipp Jahoda编辑:
我的价值观是:
distance +- 70, currentDegree = 0.
PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY());
PointF point2 = getPosition(point, (float) distance, currentDegree);
我的结果是:
center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0
new point: PointF(568.0, 728.0)
正如你所看到的,度数是0所以这个点不应该转。它应该保持490,728坐标但不保留它们。
答案 0 :(得分:15)
多数民众赞成:
private PointF getPosition(PointF center, float radius, float angle) {
PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))),
(float) (center.y + radius* Math.sin(Math.toRadians(angle))));
return p;
}
此方法根据半径和角度计算圆的中心(视图中心)周围的位置。以度为单位的角度。
返回的PointF
将包含计算位置的x坐标和y坐标。
请注意,0度位于圆圈的最东侧位置,270度位于圆圈的最北侧位置:
因此,如果视图的中心位于x:100,y:100,并且您计算角度为0度且半径为50的位置,则结果为x:150,y:100
如果使用角度90度和半径50,结果将是x:100,y:150
在我的图表库中使用here,它可以正常工作。
答案 1 :(得分:0)
这需要一些数学。你需要知道两条线是否相互垂直,这两条线的渐变应该等于-1
。
然后
m1=(770-500)/(540-400)=27/14
同样的方式
m2=(y-770)/(x-540)
(x,y)
是您要找的点。
现在
m1*m2=-1
现在我们得到了一个等式。你需要另一个,因为有两个变量需要找到
你可以通过考虑圆的半径来得到另一个。
r=sqrt((540-400)^2+(770-500)^2)
同样的方式
r=sqrl((x-540)^2+(y-770)^2)
现在你有两个等式,只需要解决。这将为您提供两组坐标。由于可以有-90
和90
度。
答案 2 :(得分:0)
实现此目标的一种优雅方法是使用复数,例如here。
在伪代码中:
z = (x_old + I*y_old)*exp(I*angle);
x_new = real(z);
y_new = imag(z);
注意:旋转angle
需要以弧度为单位。
注2:这假设一个以(0,0)为中心的圆。如果中心不在那里,只需添加一个班次。