Вычислить точку центра дуги, зная, что это начальная и конечная градусы

холст

Самое быстрое описание этого ответа заключается в том, что я пытаюсь найти координаты белой точки. Темно-красный – это вытянутая дуга по вытянутому кругу (темно-синий).

Более длинное объяснение: у меня есть класс, который расширяет 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); 

(Исходный ответ обновлен. Возможно, сейчас он немного подробен, но я надеюсь, что это поможет.)

Вы ищете координаты XY (называемые декартовыми координатами), но их трудно вычислить напрямую. Фокус в том, чтобы сначала пройти полярные координаты. Полярный и картезианский – это два способа выражения одной и той же вещи, а именно точки в сетке и могут быть преобразованы в друг друга.

Полярные координаты состоят из угла и расстояния от центральной точки. Вы можете вычислить нужный угол, потому что знаете процент круга, который вам нужно покрыть, и вы можете рассчитать расстояние от центра, потому что знаете радиус круга.

Ваша дуга покрытия составляет 225 градусов, поэтому остаток составляет 135, а половина – 67,5 градуса. Таким образом, угол для точки, которую вы ищете, составляет 225 + 67,5 = 292,5 градуса . Радиус этой точки равен половине радиуса круга, так что canvasWidth/4 .

После определения полярной координаты (292.5, canvasWidth/4) вы преобразуете это значение в координату XY с помощью функции преобразования . Есть одна вещь, которая немного Math.cos(double) : 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);