Russian Qt Forum
Ноябрь 01, 2024, 06:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Размеры прямоугольника в который вписана дуга.  (Прочитано 22922 раз)
popper
Гость
« Ответ #30 : Декабрь 22, 2015, 13:24 »

перед отрисовкой дуги нужно выполнить
Код
C++ (Qt)
QPainterPath::moveTo(pA)
, где pA - точка начала дуги.
Записан
supertux
Гость
« Ответ #31 : Декабрь 23, 2015, 21:00 »

Я делал moveTo. Но всеравно дуги выходили с линиями. Тем не менее, благодарю за советы. Теперь мне нужно некоторое время, чтобы всё это переварить. Поколдую, может с математиками пересекусь. Потом отпишусь о результатах. Считаем этот вопрос пока открытым.
Записан
supertux
Гость
« Ответ #32 : Декабрь 29, 2015, 09:59 »

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

Немного перефразирую вопрос, для ясности.

Дана дуга с начальной точкой, конечной точкой и центром.



Мои данные:

а - точка начала дуги, b - точка конца дуги, c - центр окружности.

координаты точек:

a = {'x': 6.31, 'y': 5.773}
b = {'x': 20.53, 'y': 19.836}
c = {'x': 13.42, 'y': 12.805}

Радиус вычислил по формуле: sqrt((a['x'] - c['x']) ^ 2 + (a['y'] - c['y']) ^ 2).
Радиус = 10

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

Что нужно найти:

1) Начальный угол дуги (startAngle)
2) Центральный угол (spanAngle)
3) Прямоугольник в который вписана дуга
Координаты (x, y) точки начала прямоугольника (левый нижний угол?), его ширина и высота.




« Последнее редактирование: Декабрь 29, 2015, 10:37 от supertux » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Декабрь 29, 2015, 16:05 »

Отнимаете от a и b координтаты с и подставляете в ур-е эллипса

a.x * a.x / (rx * rx) + a.y * a.y / (ry * ry) = 1;
b.x * b.x / (rx * rx) + b.y * b.y / (ry * ry) = 1;

Отсюда находите rx и ry - полуоси эллипса, макс вмещающий пр-к имеет размеры (rx*2, ry*2) и центр его в точке с. А углы у Вас просто даны по чертежу

angle_a = atan2(a.y, a.x);
angle_b = atan2(b.y, b.x);
Записан
popper
Гость
« Ответ #34 : Декабрь 29, 2015, 18:39 »

Одно из затруднений при расчете - это то, что положительные углы отсчитываются против часовой стрелки, а нулевой угол соответствует горизонтальной оси.

Поэтому для упрощения расчетов предлагаю вариант с использованием функционала QLineF.
Код
C++ (Qt)
QRect rect = (c.x - r, c.y - r, 2*r, 2*r);
QLineF lineAC(a, c);
QLineF lineBC(b, c);
QLineF lineOrdinateX(c, QPoinF(-c.x, c.y));
qreal startAngle = lineAC.angleTo(lineOrdinateX);
qreal spanAngle = lineAC.angleTo(lineBC);
 

Не гарантирую отсутствие ошибок - нужно проверять. Возможно, потребуется настроить знак startAngle и spanAngle.
Записан
supertux
Гость
« Ответ #35 : Декабрь 31, 2015, 14:30 »

Подскажите. Как рисовать в qgraphicsscene используя Qpainter.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #36 : Январь 08, 2016, 12:54 »

Подскажите. Как рисовать в qgraphicsscene используя Qpainter.
Никак. Оно не отнаследовано от QPaintDevice. Но на сцене можно размещать QGraphicsItem'ы, вот на них уже можно рисовать QPainter'ом, смотри в сторону
Код
C++ (Qt)
void QGraphicsItem::paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ) [pure virtual]
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
supertux
Гость
« Ответ #37 : Январь 08, 2016, 18:22 »

С этим разобрался. Создаешь класс qgraphicsitem.
По поводу прямоугольника вроде бы есть решение. Достаточно простое. Как все проверю и налажу -  поделюсь.
Записан
supertux
Гость
« Ответ #38 : Январь 14, 2016, 14:33 »

Выручайте, коллеги!  Непонимающий

Код вычисления углов дуги (startAngle, endAngle, spanAngle):

Код:

        offset = 90*16
        startangle = 16*atan2(a.y() - c.y(), a.x() - c.x())*180 / pi
        endangle = 16*atan2(b.y() - c.y(), b.x() - c.x())*180 / pi

        if startangle < 0:
            startangle -= offset
        else:
            startangle += offset
            
        if endangle < 0:
            endangle -= offset
        else:
            endangle += offset

        spanangle = abs(endangle) - abs(startangle)

        # По часовой
        if self.direction == -1:
            if spanangle > 0:
                spanangle = -spanangle

        angles = {'start': startangle, 'end': endangle, 'span': spanangle}

        print(angles['start'] / 16, angles['end'] / 16, angles['span'] / 16)

Как я уже писал выше, моя программа считывает файл с координатами, который генерируется сторонним ПО из DXF файла. В программе для генерации таких файлов 0 градусов начинается в 12ти часах.
Я пробовал добавить смещение на 90 градусов (оффсет), но что-то не выходит все дуги отрисовать правильно. Если левый нижний и верхний угол отрисовывается корректно, то правый верхний не корректно и наоборот.
Подскажите как сделать так, чтобы все дуги отрисовывало корректно. Нужен код который будет отрисовывать Любые дуги корректно... Уже долго бьюсь с этим, руки опускаются.
Прилагаю картинку.

« Последнее редактирование: Январь 14, 2016, 14:42 от supertux » Записан
popper
Гость
« Ответ #39 : Январь 16, 2016, 20:11 »

приведи входные значения (a,b,c), результаты вывода print и код отрисовки дуг, которые соответствуют результату на рисунке
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.364 секунд. Запросов: 23.