Найти точки между двумя точками на окружности под меньшим углом - PullRequest
0 голосов
/ 29 марта 2020

Таким образом, идея в том, что я хочу получить 20 точек в координатах X, Y между двумя щелчками по кругу. Единственный критерий заключается в том, что точки всегда должны находиться между меньшим углом между двумя щелчками.

Допустим, средняя точка окружности равна c .x, c .y * 1004. * радиус равен c .r и два щелчка: p1.x, p1.y и p2.x, p2.y

То, что я пытался сделать до сих пор, это получить угол обоих щелчков от оси X относительно центра круга.

float from = std::fmod(atan2(p1.y - c.y, p1.x - c.x), 2 * M_PI); //Update range to 0-2pi
float to = std::fmod(atan2(p2.y - c.y, p2.x - c.x), 2 * M_PI);

И затем получить расстояние между двумя щелчками. И вычислите координаты точек в al oop.

float fi =  from + ((to - from)* i / 20); // 20 points needed
vertices[i] = vec2(c.x + c.r * cosf(fi), c.y + c.r * sinf(fi)); // x = cx+r*cos(fi), y=cy+r*sin(fi)

. Проблема с этим подходом состоит в том, что в некоторых случаях он возвращает внешнюю кривую вихря. На рисунке показано 3 таких кривых за 3 клика. Рассчитанные кривые показаны белым, синий - желаемым выходом. 1020 * рендеринга *

1 Ответ

0 голосов
/ 29 марта 2020

Вам нужно рассчитать разницу, чтобы она находилась в диапазоне [-PI; PI].

Вы можете сделать это следующим образом:

float from = atan2(p1.y - pos.y, p1.x - pos.x);
float to = atan2(p2.y - pos.y, p2.x - pos.x);
float diff = to - from;

if (diff<-PI) {
    diff += 2*PI;
} else if (diff>PI) {
    diff -= 2*PI;
}

Затем вы можете вычислить «интерполированный» угол, подобный следующему:

float fi = from + diff*t;  // t is a number between 0 and 1

Это работает, потому что atan2 возвращает угол между -PI и PI, поэтому простая разница будет между -2 * PI и 2 * PI. И if будет ограничивать этот диапазон между -PI и PI (сложение / вычитание 2 * PI не меняет фактический "видимый" угол).

...