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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Размеры прямоугольника в который вписана дуга.  (Прочитано 22216 раз)
supertux
Гость
« : Декабрь 21, 2015, 11:08 »

Имеется система координат в миллиметрах. В ней расположена дуга.
Что известно:
X,Y точки начала дуги
X,Y точки конца дуги
X,Y центра дуги (или точка радиуса, как  правильно назвать)
Нужно узнать размеры прямоугольника (ширина, выоста), в который эта дуга впишется.



Хорда может быть не горизонтальна.

Не подкинете формулу какую-нибудь? Мне эти данные нужны для того чтобы отрисовывать дуги в QGraphicsScene через drawArc(). Или может найдется более рациональное решение данной задачи? Перерыл кучу ресурсов, англоязычных в том числе, нормального решения не нашел, все советуют использовать drawArc.
Записан
popper
Гость
« Ответ #1 : Декабрь 21, 2015, 12:03 »

Метод drawArc рисует дугу эллипса, вписанного в заданный прямоугольник.
Поэтому задачу можно  переформулировать так: найти уравнение эллипса по трем точкам.
Но здесь нужно уточнить, что собой представляет третья точка (центр дуги).
Вот похожее обсуждение проблемы:
http://www.gamedev.ru/code/forum/?id=33683
Записан
supertux
Гость
« Ответ #2 : Декабрь 21, 2015, 12:17 »

Центр дуги имеется ввиду центр окружности (куда ставится игла циркуля, когда чертим дугу).

Записан
ibnz
Гость
« Ответ #3 : Декабрь 21, 2015, 12:30 »

    1. Смещаем центр кривизны в начало координат.
    2. Проверяем максимумы, минимумы абсцисс точек.
    3. Если ординаты точек имеют разный знак, то в проверке участвует так же радиус с соотв знаком.
    4. Повторяем аналогично для ординат.
    5. Получаем прямоугольник { (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)}
    6. Компенсируем смещение из 1 пункта[/li]
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Декабрь 21, 2015, 12:36 »

Опишите прямоугольником всю окружность - радиус вам известен.
Отрубите всё лишнее ориентируясь на 2 точки.
Только данных всё равно мало. Нужно ещё задать направление построения дуги, я могу 2 точки соединить 2 разными способами.
Записан
supertux
Гость
« Ответ #5 : Декабрь 21, 2015, 12:45 »

Радиус мне не известен. Только координаты 3х точек.
Вот блин, забрёл я в непонятный для себя математический лес (в школе надо было учить).
Записан
popper
Гость
« Ответ #6 : Декабрь 21, 2015, 12:49 »

r = sqrt( (x3-x1)*(x3-x1) + (y3-y1)*(y3-y1) )
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Декабрь 21, 2015, 12:51 »

Радиус мне не известен
Вам даже координаты квадрантов (пиков) дуги известны
Записан
supertux
Гость
« Ответ #8 : Декабрь 21, 2015, 13:09 »

Если я все правильно понял, то радиус дуги в моем случае вычисляется так?

Код:
        x3 = 20
        x1 = 10
        y3 = 15
        y1 = 25
        r = sqrt((x3-x1) * (x3-x1) + (y3-y1) * (y3-y1))
        print(r)

>>> 14.142135623730951


Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Декабрь 21, 2015, 13:18 »

Тут можете проверить
Записан
popper
Гость
« Ответ #10 : Декабрь 21, 2015, 13:19 »

если точки р1 и р2 лежат на окружности с центром в точке р3, то расстояние между р1 и р3 должно быть равно расстоянию между р2 и р3. Что программа должна делать, если это не так?
Записан
supertux
Гость
« Ответ #11 : Декабрь 21, 2015, 13:45 »

Чтобы было понятнее чего я пытаюсь добиться, изложу по подробнее.
В общем есть G-код для ЧПУ Mach3:

Код:
M21
G01X6.31Y5.773
G03 X20.53 Y19.836 I13.42 J12.805  <--- это
G02 I57.041 J55.944
G03 X13.459 Y19.876 I16.975 J16.321
M20

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





Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Декабрь 21, 2015, 14:34 »

всё равно вопрос остаётся актуален
если точки р1 и р2 лежат на окружности с центром в точке р3, то расстояние между р1 и р3 должно быть равно расстоянию между р2 и р3. Что программа должна делать, если это не так?
Записан
supertux
Гость
« Ответ #13 : Декабрь 21, 2015, 15:28 »

если точки р1 и р2 лежат на окружности с центром в точке р3, то расстояние между р1 и р3 должно быть равно расстоянию между р2 и р3. Что программа должна делать, если это не так?

Если это не так, то Exception. Но такого быть по сути не может, т. к. в G коде всегда идет центр дуги (при таком виде интерполяции). И расстояния от p1/p2 до p3 одинаковые.

Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Точка A это текущее положение резца, так понимаю...
Можете продемонстрировать для второго примера что было бы, если я ввёл
G03 X35 Y20 I-15 J20 ?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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