当前位置: 首页 > 知识库问答 >
问题:

如何计算具有一定角度的圆上的位置?

经俊茂
2023-03-14

我想知道如何计算圆上的坐标。为了简单起见,我做了一些图像。

这是从我掌握的信息开始的。现在我需要计算新的坐标,例如,当圆向右旋转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,因此该点不应转动。它应该保持490728的坐标,但不保持这些坐标。

共有3个答案

冷正信
2023-03-14

实现这一点的一个优雅方法是使用复数,例如这里提供的复数。

在伪代码中:

z = (x_old + I*y_old)*exp(I*angle);
x_new = real(z);
y_new = imag(z);

注意:旋转角度需要以弧度为单位。注2:这假设一个以(0,0)为中心的圆。如果中心不在那里,只需添加一个移位。

暨高洁
2023-03-14

这里需要一些数学。你需要知道如果两行相互垂直,这两行梯度的乘法应该等于-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)

现在你得到了两个方程,只需要解。这将为您提供两组坐标。因为可以有-9090度。

米楚青
2023-03-14

就是这样:

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

它在我的图表库中使用,而且很有效。

 类似资料:
  • 我有一个2F长度的柱面,和RotX和RotZ的数据,由用户给出。我也知道我的圆柱体的“底”在(0,0,0)(形成“底”的圆心) 我需要的是计算“顶”点(另一端的圆心),在上面的线条中暴露数据。 在我的第二幅图像中,A点计算如下(sin(zAngle),cos(zAngle),sin(xAngle),zAngle=pi/4(alpha角)和xAngle=0。 点B计算为(sin(xAngle),co

  • 问题内容: 如何在Java中计算两个角度量度(以度为单位)的差,使结果在[0°,180°]范围内? 例如: 问题答案: /* * Shortest distance (angular) between two angles. * It will be in range [0, 180]. / public static int distance(int alpha, int beta) { int

  • 在将此标记为副本之前,我想说,我已经浏览了这么多类似于此、此和此的帖子。但我还没有找到适合我的解决方案。 我正在尝试使用创建一个弹出窗口。我想使用圆角和下拉阴影(如

  • 问题内容: 我已经按照docker安装文档将其安装在运行Ubuntu 12.04的32位计算机上的机器上 步骤 没说 应该已经安装好了吧? 我也知道,Docker当前仅支持64位平台。 有什么方法可以安装它并使它在32位计算机上工作? 问题答案: 根据先决条件: 不管您的Ubuntu版本如何,Docker都需要64位安装。此外,您的内核必须至少为3.10。也可以接受最新的3.10次要版本或更新的维

  • 问题内容: 我需要为自己的Point类计算两个点之间的角度,以度为单位,Point a为中心点。 方法: 测试1://返回45 测试2://返回-90,预期值:270 如何将返回的结果转换为0到359之间的数字? 问题答案: 您可以添加以下内容: 顺便说一句,为什么您不想在这里使用双精度?

  • 问题: 给定n个半径为r1的圆...rn和位置p1...pn。该算法必须找到包含所有n个圆的最小半径的圆的半径和圆心。圆的位置和半径是固定的,所以不能移动。 圆圈的结构可以看起来像这样: 输入值:[c1...cn] (c圈) 输出值:c 图像示例: 我的想法: 如果我找到最远的两点之间的距离并将圆心放在这条直线的一半上,我就可以画出包含n个圆的最小圆,但是有可能其他圆与主圆的圆心之间的距离比最远的

  • 我正在学习浮点格式(IEEE)。在单精度浮点格式中,提到尾数有24位,因此它具有6 1/2十进制数字的精度(根据书中“理解机器”),以及7.22十进制数字的精度。 我不明白精度的小数位数是怎么算出来的。有人能告诉我吗?

  • 给定圆心、半径和3个点,我想通过指定开始绘制的角度和旋转的角度,绘制一条从第一个点开始、穿过第二个点并在第三个点结束的圆弧。为此,我需要计算圆弧上的点。我希望计算的点数是可变的,这样我就可以调整计算圆弧的精度,这意味着我可能需要一个循环,在计算完一个点后,通过旋转一点来计算每个点。我已经阅读了这个问题的答案,用2个点和圆心画圆弧,但它只解决了角度计算的问题,因为我不知道如何画画布。实现了“draw