5

帆布

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

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

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

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

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

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

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

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

1 回答 1

7

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

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

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

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

一旦确定了极坐标,就可以使用转换函数(292.5, canvasWidth/4)将其转换为 XY 坐标。有一件事有点棘手:并期望他们的论点是弧度,而不是度数。在进行转换之前,您将 292.5/360 表示为 x/2π,通过将值乘以 π/180 来实现,在这种情况下得到 5.1051。Math.cos(double)Math.sin(double)

假设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);
于 2012-10-14T14:38:54.687 回答