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

Dzh*_*eyt 4 geometry android canvas

帆布

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

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

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

然后我绘制一个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);
Run Code Online (Sandbox Code Playgroud)

Bar*_*end 6

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

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

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

你的覆盖弧度是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);
Run Code Online (Sandbox Code Playgroud)