0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
1 | |
Размеры прямоугольника в который вписана дуга21.12.2015, 08:57. Показов 4175. Ответов 20
Метки нет (Все метки)
Размеры прямоугольника в который вписана дуга.
Здравствуйте. Имеется система координат в миллиметрах. В ней расположена дуга. Что известно: X,Y точки начала дуги X,Y точки конца дуги X,Y центра дуги (или точка радиуса, как правильно назвать) Нужно узнать размеры прямоугольника (ширина, выоста), в который эта дуга впишется. Не подкинете формулу какую-нибудь?
0
|
21.12.2015, 08:57 | |
Ответы с готовыми решениями:
20
Найти прямоугольник, перпендикулярный осям координат, в который вписана дуга Найти площадь выпуклого четырехугольника, в который вписана окружность Найти площадь правильного n-угольника, в который вписана окружность радиуса r и стороной a Рандомные размеры с прямоугольника |
21.12.2015, 10:58 | 2 |
При горизонтальном расположении хорды координаты второй точки дуги ищутся из координат первой точки и центра. Вы дали избыточные данные.
Если длина хорды l, а радиус окружности R, то ширина прямоугольника l, а высота
1
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
21.12.2015, 11:02 [ТС] | 3 |
Я дугу для примера привел, но хорда не всегда может быть горизонтальной.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
21.12.2015, 14:31 | 4 |
А прямоугольник хотя бы "горизонтальный", или то же для примера?
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
21.12.2015, 15:48 [ТС] | 5 |
Прямоугольник может быть так же не горизонтальным. Но как бы не располагалась дуга, две параллельные грани прямоугольника, всегда параллельны хорде, а две другие перпендикулярные соответственно.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
22.12.2015, 07:38 | 6 |
Сообщение было отмечено kloopa как решение
Решение
В такой постановке задачи Вам для решения предлагаю следующий алгоритм для построения прямоугольника:
1) Определяем радиус дуги R 2) Определяем углы из центра дуги на начало и конец дуги alfn=atan((yn-yc)/(xn-xc)) alfk=atan((yk-yc)/(xk-xc)) 3) Определяем угол "раствора" дуги alf=alfk-alfn 4) Определяем высоту дуги h=2*R*sin(alf/4)^2 или h=R*(1-cos(alf/2)) 5) Если alf<=pi, то одна сторона прямоугольника определена хордой дуги с конечными точками (xn,yn) (xk,yk) от этих точек строим перпендикуляры длиной h в направлении (alfn+alfk)/2 и получаем еще две точки прямоугольника. 6) Если alf>pi, то находим точку середины хорды xsx=(xn+xk)/2 ysx=(yn+yk)/2 Определяем длину хорды Lx=sqrt( (xn-xk)^2 + (yn-yk)^2 ) Определяем первые 2 точки прямоугольника лежащие на продолжении хорды xp1=(xn-xsx)*2*R/Lx+xsx yp1=(yn-ysx)*2*R/Lx+ysx xp2=(xk-xsx)*2*R/Lx+xsx yp2=(yk-ysx)*2*R/Lx+ysx от полученных точек строим перпендикуляры длиной h в направлении (alfn+alfk)/2 и получаем еще две точки прямоугольника. А размеры При alf<=pi Lx на h При alf>pi 2*R на h
1
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
24.12.2015, 15:26 [ТС] | 7 |
SSC,А как определить радиус дуги?
Добавлено через 14 минут Еще не могу разобраться с буквенными обозначениями(yn, yc, xn, xc, yk, yc, xk, xc)
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
24.12.2015, 15:37 | 8 |
x, y - соответствующая координата
модификаторы n - начальная точка дуги k - конечная точка дуги c - центр окружности дуги R=sqrt((xn-xc)^2+(yn-yc)^2) или R=sqrt((xk-xc)^2+(yk-yc)^2) причем результат должен быть одинаков (с определенной точностью). Если R получаются сильно разные, то у Вас неправильные данные, такую дугу не нарисовать
1
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
24.12.2015, 21:46 [ТС] | 9 |
Благодраю за помощь!
У меня возникли непонятки во время рассчета. Мои данные: а - точка начала дуги, b - точка конца дуги, c - центр окружности. a = {'x': 6.31, 'y': 5.773} b = {'x': 20.53, 'y': 19.836} c = {'x': 13.42, 'y': 12.805} По пунктно у меня вот что выходит (не округлял, хотя более чем 3 знака после запятой не нужны): 1) Радиус = 10.00005619984208 2) Угол от c до а = 0.7798827335375087 Угол от c до b = 0.7798116293367922 3) угол "раствора" дуги = 0.0 4) высота дуги = 0.0 Чтобы убедиться, хотел бы уточнить, на данном этапе мои данные верны? Смущает высота дуги 0.0... Кстати pi - это число Пи? (3.14) И стоит ли сразу отсекать лишнее после запятой (0,000), например угол от c до а = 0.779.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
25.12.2015, 08:32 | 10 |
Если нет чувства пространства и навыков определения углов по приращениям координат и не использования функции atan2, необходимо на плоскости построить заданные точки.
Из рисунка мы видим, что угол на b из с лежит в 1 четверти (от 0 до 90 градусов) поэтому угол на b определен вроде (я не пересчитывал) правильно. А угол на а лежит в 3 четверти (от 180 до 270 градусов) и значит больше pi (да это число Пи 3.1415...). Для Ваших расчетов к определенному Вами углу на a надо прибавить или вычесть pi (что в общем одно и тоже). Из рисунка также следует осознать "какая она эта дуга". Есть общее правило - дуга строится от точки начала к конечной точке по направлению отсчета углов, то есть против часовой стрелки. У Вас получается дуга с "раствором" больше pi. Формула для расчета высоты дуги расчитана на положительные углы "раствора" дуги. P.S. В общем процесс решения задачь всегда подразумевает осмысление получаемых результатов, а не просто набирание циферек на калькуляторе. А программист при написании программы должен предусмотреть все возможные варианты данных (в том числе и ошибочные) и обеспечить адекватную реакцию.
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
25.12.2015, 18:55 [ТС] | 11 |
Да, математику я не особо учил. Это мой косяк.
Суть в том, что я пишу программу, мне дается 3 точки A B и C. И я должен отрисовывать эти дуги. Хорда может распологаться под любым углом по отношению к оси Х. Оним словом как угодно. Вот и хотелось бы подобрать рабочий алгоритм.
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
29.12.2015, 10:46 [ТС] | 12 |
В общем, вопрос актуален. Пока мне не удалось найти углы дуги и прямоугольник.
Немного перефразирую вопрос, для ясности. Дана дуга с начальной точкой, конечной точкой и центром. Мои данные: а - точка начала дуги, 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) точки начала прямоугольника (левый нижний угол?), его ширина и высота.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
29.12.2015, 10:49 | 13 |
На чем пишем?
Есть ли функция atan2()?
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
|
29.12.2015, 10:57 [ТС] | 15 |
SSC, пишу на Python 3.4, функция atan2() имеется, требует 2 аргумента.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
||||||
29.12.2015, 11:45 | 16 | |||||
К сожалению на Python не писал.
Вариант проверенный на MATLAB
0
|
373 / 343 / 42
Регистрация: 14.07.2015
Сообщений: 2,890
|
|
29.12.2015, 14:24 | 17 |
kloopa, по-моему алгоритм прост.
1)Ищем длину от начала до конца дуги, сделать это просто, зная координаты начала и конца. Эта длина будет одной стороной прямоугольника. 2)Ищем середину отрезка, соединяющего начало и конец дуги (координаты даны, проблем нет). Ищем длину отрезка соединяющего эту середину и середину дуги (координаты середины того отрезка и середины дуги известны). Задача решена.
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
29.12.2015, 15:34 | 18 |
Может быть вариант с разворотом дуги более 180 градусов. (см. вариант с большей дугой на рис. сообщения#16)
0
|
373 / 343 / 42
Регистрация: 14.07.2015
Сообщений: 2,890
|
|
29.12.2015, 15:42 | 19 |
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
|
||||||
29.12.2015, 21:44 [ТС] | 20 | |||||
Благодарю за код.
Перевел на Python 3:
Radius: 10.00005619984208 startAngle: -2.3617099200522844 endAngle: 0.7798116293367922 spanAngle: 3.1415215493890765 Arc height: 3.1415215493890765 -----------Rectangle points------------- 6.31 5.773 20.53 19.836 27.56149722673964 12.726002786445125 13.34149722673964 -1.3369972135548744 Смущает то что spanAngle и h равны Пи. Для чего мне это нужно. Для построения дуги в Qt, QGraphicsscene. Использую для этого QPainter.drawArc(rectangle, startAngle, spanAngle) http://doc.qt.io/qt-5/qpainter.html#drawArc Draws the arc defined by the given rectangle, startAngle and spanAngle. The startAngle and spanAngle must be specified in 1/16th of a degree, i.e. a full circle equals 5760 (16 * 360). Positive values for the angles mean counter-clockwise while negative values mean the clockwise direction. Zero degrees is at the 3 o'clock position. Где rectangle = X, Y, ширина, высота прямоугольника. Добавлено через 1 час 39 минут И если я правильно понял, в функции drawArc 0 градусов начинается в 3х часах.
0
|
29.12.2015, 21:44 | |
29.12.2015, 21:44 | |
Помогаю со студенческими работами здесь
20
Создать веб-страницу "Расчёт прямоугольника", который задан за шириной и длиной прямоугольника Изменить позицию и размеры прямоугольника Масштабирование прямоугольника, который повернут на некоторый угол Размеры RptLabel больше размера текста, который в них находится Класс для рисования прямоугольника, который движется по нажатию клавиш Найти площадь прямоугольника, который принадлежит обеим осям координат Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |