Эллипс вращается не по центру - PullRequest
0 голосов
/ 28 мая 2018

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

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

        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). В этом примере точка на E2 находится под углом ~ 220-230 градусов.Я могу поймать этот угол, угол кажется нормальным.

case 1

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

case 2

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

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

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

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

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

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

Flo

0 голосов
/ 28 мая 2018

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

...