Форум программистов, компьютерный форум, киберфорум
Геометрия
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
1

Размеры прямоугольника в который вписана дуга

21.12.2015, 08:57. Показов 4175. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Размеры прямоугольника в который вписана дуга.

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

Не подкинете формулу какую-нибудь?
Миниатюры
Размеры прямоугольника в который вписана дуга  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2015, 08:57
Ответы с готовыми решениями:

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

Найти площадь выпуклого четырехугольника, в который вписана окружность
Всем привет. Девушке нужно решить несколько задач в делфи, сама не может - обратилась ко мне. Сам с...

Найти площадь правильного n-угольника, в который вписана окружность радиуса r и стороной a
Помогите решить процедурой: Найти площадь правильного n-угольника, в который вписана окружность...

Рандомные размеры с прямоугольника
Здравствуйте! Я хочу сделать рандомные размеры с прямоугольника при каждом обновление страницы....

20
Эксперт по математике/физике
6358 / 4065 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
21.12.2015, 10:58 2
При горизонтальном расположении хорды координаты второй точки дуги ищутся из координат первой точки и центра. Вы дали избыточные данные.
Если длина хорды l, а радиус окружности R, то ширина прямоугольника l, а высота https://www.cyberforum.ru/cgi-bin/latex.cgi?R-\sqrt{R^2-\frac{l^2}{4}}
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
Цитата Сообщение от kloopa Посмотреть сообщение
Еще не могу разобраться с буквенными обозначениями(yn, yc, xn, xc, yk, yc, xk, xc)
x, y - соответствующая координата
модификаторы
n - начальная точка дуги
k - конечная точка дуги
c - центр окружности дуги

Цитата Сообщение от kloopa Посмотреть сообщение
А как определить радиус дуги?
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
1806 / 1001 / 187
Регистрация: 24.02.2013
Сообщений: 2,922
Записей в блоге: 12
29.12.2015, 10:52 14
......
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
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
clc
clear all
ax=6.31; ay=5.773;
bx=20.53; by=19.836;
%cx=13.42; cy=12.805;
cx=13.42+5; cy=12.805-5;
 
R=sqrt((ax-cx)^2+(ay-cy)^2);
 
startAngle=atan2((ay-cy),(ax-cx));
endAngle=atan2((by-cy),(bx-cx));
 
spanAngle=endAngle-startAngle;
 
if spanAngle<0
  spanAngle=spanAngle+2*pi;
end
 
if spanAngle>=2*pi
  spanAngle=spanAngle-2*pi;
end
 
h=2*R*sin(spanAngle/4)^2;
 
fi=(endAngle+startAngle)/2;
dx=h*cos(fi);
dy=h*sin(fi);
 
% p1-p4 точки прямоугольника
if spanAngle<pi
  p1x=ax;  
  p1y=ay;
  p2x=bx;  
  p2y=by; 
  p3x=p2x+dx; 
  p3y=p2y+dy;
  p4x=p1x+dx; 
  p4y=p1y+dy;
else
  xsx=(ax+bx)/2;
  ysx=(ay+by)/2;
 
  Lx=sqrt( (ax-bx)^2 + (ay-by)^2 );
 
  p1x=(ax-xsx)*2*R/Lx+xsx;
  p1y=(ay-ysx)*2*R/Lx+ysx;
  p2x=(bx-xsx)*2*R/Lx+xsx; 
  p2y=(by-ysx)*2*R/Lx+ysx;
  p3x=p2x+dx; 
  p3y=p2y+dy;
  p4x=p1x+dx; 
  p4y=p1y+dy;
end
%отображение графики 
linePx=[p1x p2x p3x p4x p1x]; 
linePy=[p1y p2y p3y p4y p1y];
plot(ax,ay,'x',bx,by,'x',cx,cy,'o',linePx,linePy);
hold on
al=startAngle:(endAngle-startAngle)/360:endAngle;
Dugax=R*cos(al)+cx;
Dugay=R*sin(al)+cy;
plot(Dugax,Dugay,'r');
Графики для двух положение центра
Миниатюры
Размеры прямоугольника в который вписана дуга  
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
Цитата Сообщение от bobah16 Посмотреть сообщение
Задача решена
Может быть вариант с разворотом дуги более 180 градусов. (см. вариант с большей дугой на рис. сообщения#16)
0
373 / 343 / 42
Регистрация: 14.07.2015
Сообщений: 2,890
29.12.2015, 15:42 19
Цитата Сообщение от SSC Посмотреть сообщение
Может быть вариант с разворотом дуги более 180 градусов. (см. вариант с большей дугой на рис. сообщения#16)
Точно. Его я не рассматривал.
0
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 42
29.12.2015, 21:44  [ТС] 20
Благодарю за код.

Перевел на Python 3:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from math import *
 
#Точка начала дуги
a = {'x': 6.31, 'y': 5.773}
#Точка конца дуги
b = {'x': 20.53, 'y': 19.836}
#Центр окружности (дуги)
c = {'x': 13.42, 'y': 12.805}
 
    
def arcRadius(a, b, c):
    radius = sqrt((a['x'] - c['x'])**2 + (a['y'] - c['y'])**2)
    return radius
        
def arcAngles(a, b, c):
    startAngle = atan2((a['y'] - c['y']), (a['x'] - c['x']))
    endAngle = atan2((b['y'] - c['y']), (b['x'] - c['x']))
    spanAngle = endAngle - startAngle
    if spanAngle < 0:
        spanAngle = endAngle + (2 * pi)
    if spanAngle >= (2 * pi):
        spanAngle = spanAngle - (2 * pi)
    return (startAngle, endAngle, spanAngle)
   
def arcHeight(radius, spanAngle):
    height = 2 * radius * sin(spanAngle / 4)**2
    return height
    
R = arcRadius(a, b, c)
print("Radius: " + str(R))
startAngle, endAngle, spanAngle = arcAngles(a, b, c)
print("startAngle: " + str(startAngle) + "\nendAngle: " + str(endAngle) + "\nspanAngle: " + str(spanAngle))
h = arcHeight(R, spanAngle)
print("Arc height: " + str(spanAngle))
fi = (endAngle + startAngle) / 2
dx = h * cos(fi)
dy = h * sin(fi)
 
#p1 - p4 точки прямоугольника
if spanAngle <= pi:
    p1x = a['x']
    p1y = a['y']
    p2x = b['x']
    p2y = b['y']
    p3x = p2x + dx
    p3y = p2y + dy
    p4x = p1x + dx
    p4y = p1y + dy
else:
    xsx = (a['x'] + b['x']) / 2
    ysx=(a['y'] + b['y']) / 2
 
    Lx = sqrt((a['x'] - b['x'])**2 + (a['y'] - b['y'])**2)
 
    p1x = (a['x'] - xsx) * 2 * R / Lx + xsx
    p1y = (a['y'] - ysx) * 2 * R / Lx + ysx
    p2x = (b['x'] - xsx) * 2 * R / Lx + xsx 
    p2y = (b['y'] - ysx) * 2 * R / Lx + ysx
    p3x = p2x + dx 
    p3y = p2y + dy
    p4x = p1x + dx 
    p4y = p1y + dy
  
print("-----------Rectangle points-------------")
print(p1x, p1y)
print(p2x, p2y)
print(p3x, p3y)
print(p4x, p4y)
Результат:

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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2015, 21:44
Помогаю со студенческими работами здесь

Создать веб-страницу "Расчёт прямоугольника", который задан за шириной и длиной прямоугольника
Создать веб-страницу &quot;Расчёт прямоугольника&quot;, который задан за шириной и длиной прямоугольника,...

Изменить позицию и размеры прямоугольника
Изменить координаты точки можно следующим образом e.TextRectangle.Location + New Point(-1, -1) ...

Масштабирование прямоугольника, который повернут на некоторый угол
Доброго времени суток! Я столкнулась с проблемой масштабирования прямоугольника, когда он повернут...

Размеры RptLabel больше размера текста, который в них находится
Привет. Ситуация: на форме отчета DataReport1 размещены RptLabel, причем их размеры намного...

Класс для рисования прямоугольника, который движется по нажатию клавиш
собственно у меня есть класс, который описывает объект &quot;ракетку&quot; игры пинг понг. это просто...

Найти площадь прямоугольника, который принадлежит обеим осям координат
Подскажите алгоритм! Есть два прямоугольника в декартовой системе исчисления. Их стороны...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru