这个答案的最快描述是我试图找到白点的坐标。深红色是绘制圆圈上的绘制圆弧(深蓝色)。
更长的解释:
我有一个扩展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);
答案 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);