Как мне найти все углы между двумя точками на окружности круга? - PullRequest
0 голосов
/ 28 декабря 2018

В настоящее время я работаю над кульминацией своей информатики, и я застрял и не могу найти ответы на похожие вопросы, задаваемые о переполнении стека.

Проблема, которую я пытаюсь решить, состоит в том, что есть тризаданные точки в форме (x, y) на экране (1280 на 720, где верхний левый угол (0, 0)), и вы должны найти кривую, которая проходит через все три точки.

ИтакЗная, что есть три точки, вы знаете, что они образуют треугольник.После нахождения окружности у вас теперь есть:

  • Радиус,
  • Начало координат,
  • И три угла

Криваядолжен начинаться в первой заданной точке, проходить через вторую заданную точку и заканчиваться в третьей заданной точке.

int pointX = Math.round(circumcentreX + radius * Math.cos(angle));
int pointY = Math.round(circumcentreY + radius * Math.sin(angle));

Выше приведены уравнения, которые я нашел , чтобы найти точки накривая с учетом угла.

Я также знаю, как найти углы трех заданных точек с помощью Math.atan2(y, x);

Основная проблема, которую я имею, - это найти углы, лежащие накривая .Пока у меня есть

float angle = (float)Math.toRadians(beginningAngle - (beginningAngle - endAngle) * t);

, где t - это процент кривой, в которой он находится, но он не работает в половине случаев.

Углы окружности были бы такими, гдеСевер 270, Восток 0, Юг 90, Запад 180.

Вот как должна выглядеть кривая

Angles: 183.57921 : 264.60202 : 358.09354 X coordinates: [473, 597, 747] Y coordinates: [376, 248, 380]

Вот случай, когда он терпит неудачу

Angles: 179.00537 : 270.5897 : 2.6373901 X coordinates: [473, 614, 752] Y coordinates: [376, 234, 380]

Пожалуйста, дайте мне знать, если вы нашли способ найти углы или хотели бы некоторый исходный код.Заранее спасибо!

1 Ответ

0 голосов
/ 29 декабря 2018

Обдумав, что вызывает ошибки и что работает, я получил четыре, если, иначе-если и еще, чтобы решить мою проблему.

float change;
float tba = (ba / 100 < 1) ? ba + 360 : ba;
float tma = (ma / 100 < 1) ? ma + 360 : ma;
float tea = (ea / 100 < 1) ? ea + 360 : ea;
    if(tba > tma && tma > tea && ea > ba)
        change = ea - ba - 360;
    else if(tba < tma && tma < tea && ea < ba)
        change = tea - ba;
    else if(ea < ba && ma < ba)
        change = ea - ba;
    else
        change = (ea - ba < 0f) ? ea - ba + 360 : ea - ba;
    change %= 360;

с плавающей точкой change - это разница междупервый угол и третий угол.Поплавки tba, tma и tea являются только временными версиями ba, ma и ea (которые являются углами заданных точек), которые используются для сравнения углов.Полегче.Например, когда ba равно 350 ° и ma равно 10 °, а ea равно 15 °, вместо этого они могут составлять 350 °, 370 ° и 375 ° соответственно.(change будет 25 ° в этом случае) Я не уверен, нужна ли последняя строка, но я держу ее там на всякий случай.

Кстати, причина, по которой я используючисло с плавающей точкой вместо двойников состоит в том, что slick2D обычно имеет в качестве аргументов значения с плавающей точкой, а не двойные.

...