计算弧的圆心,已知起始和结束角度

6

画布

这个答案的最简单描述是我正在尝试找到白点的坐标。深红色是在绘制的圆(深蓝色)上绘制的弧线。

更详细的解释: 我有一个类,它扩展了View并在画布上绘制一个圆(画布的宽度和高度相等):

canvas.drawArc(rectF, 0, 360, true, paint); // mOvals is a RectF object with 4 coordinates

然后我画一个N%宽度的弧形(假设在这种情况下为225)。该弧从-90度开始(因为在画布中,0度表示3点钟)且“偏离”N度(此示例中为225)。

我试图计算剩余弧形(即未被红色弧形覆盖的区域;即在N到360之间的区域)的中心的X/Y坐标。

如果有帮助,我有圆的半径,其为canvasWidth / 2。

以下是我绘制红色弧线的方法:

long arcEnd = (360 * fractionNumber) / totalNumber;
canvas.drawArc(rectF, -90, arcEnd, true, paint);
1个回答

8

您正在寻找XY坐标(称为笛卡尔坐标),但是这些很难直接计算。诀窍是首先使用极坐标。极坐标和笛卡尔坐标是表示同一点的两种方式,即网格中的一个点,并且可以相互转换。

极坐标由角度和距中心点的距离组成。您可以计算所需的角度,因为您知道需要覆盖的圆的百分比,并且可以计算出距离中心的距离,因为您知道圆的半径。

您要覆盖的部分弧为225度,因此余数为135,其一半为67.5度。因此,您要查找的点的角度为225+67.5 = 292.5度。该点的半径是圆的半径的一半,因此为canvasWidth/4

确定了极坐标(292.5, canvasWidth/4)之后,您可以使用转换函数将其转换为XY坐标。有一件事可能有点棘手:Math.cos(double)Math.sin(double) 期望它们的参数以弧度而不是角度表示。在进行转换之前,您可以将292.5/360表示为x/2π,方法是将该值乘以π/180,得到此处的5.1051。

假设canvasWidth为400:

double tdeg 292.5d; // Calculated from arc percentage 
int r =  100;      // Calculated from canvas width

double trad = tdeg * (Math.PI/180d); // = 5.1051

int x = (int) r * Math.cos(trad);
int y = (int) r * Math.sin(trad);

你能详细说明一下吗?我尝试将原始的X和Y坐标通过Math.atan2(x, y)运行,但它只返回一个像0.8612618928415864这样的数字。你知道如何将其转换为实际坐标吗? - Dzhuneyt
你需要输入极坐标而不是直角坐标(笛卡尔坐标)进行转换。极坐标和直角坐标只是表达同一事物(网格中的一个点)的两种方式。极坐标由角度(通常在0到360或0到2π之间,表示完整圆)和距离中心点的距离组成。你可以计算所需的角度,因为你知道百分比,也可以计算距离,因为你知道圆的半径。确定了极坐标后,你可以使用我提供的函数将其转换为直角坐标。 - Barend
1
有人找到解决方案了吗?非常感谢您的帮助,谢谢。 - ralphgabb
@Barend 为什么我们要做 canvasWidth/4 - Mightian
@Barend,感谢您的回答。笛卡尔坐标是相对于圆的中心吗? - DoruChidean
将画布的一半添加到x和y的结果,应该等同于相对于左上角的坐标。 - DoruChidean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接