计算弧心点,了解它的起点和终点

时间:2012-10-14 13:57:45

标签: android canvas geometry

Canvas

这个答案的最快描述是我试图找到白点的坐标。深红色是绘制圆圈上的绘制圆弧(深蓝色)。

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

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

然后我绘制一个N%宽的弧(在这种情况下假设为225)。弧从-90度开始(因为画布中的0度意味着3'o时钟)和“偏离”N度(本例中为225度)。

我正在尝试计算X / Y坐标或剩余弧的中心(红弧未覆盖的区域;介于N和360之间)。

我有圆的半径,即canvasWidth / 2,如果有帮助的话。

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

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

1 个答案:

答案 0 :(得分:6)

(原始答案已更新。现在可能有点过于冗长,但我希望它有所帮助。)

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

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

你的覆盖弧度是225度,所以剩下的是135度,一半是67.5度。因此,您要寻找的点的角度为225 + 67.5 = 292.5度。该点的半径是圆的半径的一半,因此canvasWidth/4

确定极坐标(292.5, canvasWidth/4)后,使用conversion function将其转换为XY坐标。有一件事有点棘手:Math.cos(double)Math.sin(double)期望他们的论点在radians,而不是在度数。在进行转换之前将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);
相关问题