Эллипс повернут не по центру

Я пытаюсь нарисовать повернутый эллипс, не центрированный в начале координат (в С ++).

пока мой код "работает":

        for (double i = 0; i <= 360; i = i + 1) {

            theta = i*pi / 180;

            x = (polygonList[compt]->a_coeff / 2)  * sin(theta) + polygonList[compt]->centroid->datapointx;
            y = (polygonList[compt]->b_coeff / 2)  * cos(theta) + polygonList[compt]->centroid->datapointy;

            xTmp = (x - polygonList[compt]->centroid->datapointx)* cos(angle1) - (y - polygonList[compt]->centroid->datapointy)*sin(angle1) + polygonList[compt]->centroid->datapointx;
            yTmp = (x - polygonList[compt]->centroid->datapointx)* sin(angle1) + (y - polygonList[compt]->centroid->datapointy)*cos(angle1) + polygonList[compt]->centroid->datapointy;
      }

PolygonList - это список «блоков», который будет заменен эллипсом той же площади.

Моя проблема в том, что углы не совсем точны, как если бы мне пришлось поставить транспортир, который подходил бы по форме моего эллипса, транспортир, очевидно, сжался бы, как и углы (это ясно?)

Вот пример: я пытаюсь установить точку на верхнем эллипсе (E1), которая будет лежать на линии, проведенной между центроидом E1 и любой точкой на втором эллипсе (E2). В этом примере точка на Е2 лежит под углом ~ 220-230 градусов. Я могу поймать этот ракурс, он кажется нормальным.

case 1

Проблема в том, что если я попытаюсь спроецировать эту точку на E1, используя этот угол ~ 225 градусов, я окажусь на втором красном кружке сверху. похоже, что мой угол теперь составляет ~ 265 градусов, но на самом деле, если я формирую транспортир так, чтобы он соответствовал моему эллипсу, я получаю прямой угол (~ 225), см. img 2)

case 2

На этом преобразованном транспортире немного сложно увидеть угол, но он показывает ~ 225 градусов.

Я пришел к выводу, что эллипс нарисован так, как если бы мне нужно было нарисовать круг, а затем сжать его, что изменит расстояние между углами.

Может кто-нибудь сказать мне, как я могу это исправить?

PS: чтобы нарисовать эти эллипсы, я просто использую цикл for, который рисует точку под каждым углом (от 0 до 360). мы ясно видим на первом изображении, что расстояние между точками разное, находимся мы на 0 или на 90 градусах.


person TheEpok    schedule 28.05.2018    source источник
comment
Что именно вы здесь пытаетесь спросить? Что вы имеете в виду, у вас неправильные углы - углы правильные, вы просто смотрите на 2 разных определения. В одном случае вы смотрите на полярный угол, а в другом вы думаете об угле, который используется для параметризации эллипса. Но вы, кажется, прекрасно рисуете повернутый эллипс.   -  person Qubit    schedule 28.05.2018
comment
Извините, мой вопрос, вероятно, был неясным. Я также сбит с толку, потому что не совсем уверен в разговоре о геометрии. Я предполагаю, что я пытаюсь спросить, как мне определить X и Y для каждой точки 360 точек, представляющих мой эллипс.   -  person TheEpok    schedule 28.05.2018
comment
Кажется, у вас есть 360 точек, просто они неравномерно расположены на эллипсе. Что именно не так с теми, которые у вас есть?   -  person Qubit    schedule 28.05.2018
comment
В идеале я бы хотел 360 точек; каждый из них расположен под углом в 1 градус. в моем примере они не разнесены на 1 градус дуги   -  person TheEpok    schedule 28.05.2018
comment
Ясно, так что в основном вам нужны точки на пересечении линий с эллипсом на вашем первом изображении (возможно, более плотное, но это основная идея)? В таком случае, может быть, это именно то, что вы должны попытаться решить?   -  person Qubit    schedule 28.05.2018
comment
Это то, что я пытаюсь сделать, но сейчас полностью потерял :)   -  person TheEpok    schedule 28.05.2018
comment
Просто решите (x, y) из уравнений для эллипса и уравнения для прямой y = kx, где k = tan (угол), легко получить выражение в замкнутой форме. Будьте осторожны с касательной - она ​​может быть бесконечной. Затем вы вращаете и перемещаете эти точки, как хотите. Обратите внимание, что это по-прежнему не будет равномерно распределено по расстоянию.   -  person Qubit    schedule 28.05.2018
comment
Это уже то, что я делаю, и (x, y) будет хорошо сидеть на эллипсе, но поскольку это параметрическое представление, углы смещены (см. Изображение 2)   -  person TheEpok    schedule 28.05.2018
comment
Давно прошло, но чтобы повернуть графику нужно 3 шага. a) переместите эллипс из его местоположения в исходную точку (0,0,0), b) выполните вращение, затем c) переместите эллипс обратно в исходное положение. Я думаю, что три шага можно объединить в одну матрицу для применения.   -  person 2785528    schedule 28.05.2018
comment
вращение не является проблемой, получение точного определения угла между каждым градусом.   -  person TheEpok    schedule 28.05.2018
comment
Я вижу, что с тех пор вы решили проблему, но позвольте мне все равно поставить это здесь. Решение для пересечения дает вам другую параметризацию, которая делает то, что вы хотите.   -  person Qubit    schedule 29.05.2018


Ответы (2)


ваша параметризация такова, что окружность представляет собой эллипс, обе оси которого равны. Похоже, вам нужно использовать рациональное представление эллипса вместо стандартного: https://en.m.wikipedia.org/wiki/Ellipse

person Swift - Friday Pie    schedule 28.05.2018
comment
Хорошо, если я очень быстро реализую рациональное представление, у меня возникнет та же проблема. - person TheEpok; 28.05.2018

Итак, я задал вопрос выше, чтобы найти возможное перекрытие между двумя эллипсами, проверив расстояние между любой точкой на E2 и ее проекцией на E1: если расстояние между центроидом E1 и проецируемой точкой на E1 равно больше, чем расстояние между центроидом E1 и точкой на E2, я предполагаю перекрытие. Я считаю, что это решение никогда не пробовали (или я недостаточно искал) и должно работать нормально. Но перед работой мне нужно было подобрать правильные углы.

Я нашел способ избежать использования углов и проецируемых точек, проверив фокусы:

  • сумма расстояний между фокусами A и B до любой точки вокруг оси постоянна (назовем ее DE1 вместо E1).
  • Затем я проверяю расстояние между моими фокусами и любой точкой на E2. Если это расстояние станет меньше DE1, я предполагаю подключение.

Пока вроде работает нормально :)

Я положу это здесь для всех, кто в этом нуждается.

Фло

person TheEpok    schedule 28.05.2018