Построение дуги по 2 точкам и радиусу

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 22.09.2014 (Пн) 15:39

Всем дорого дня
Необходимо построить дугу по 2 точкам, которые ее ограничивают, и радиусом.
Пока что получилось следующее: если центр дуги лежит в начале координат и отдаленность точек совпадает с радиусом.
Например: А(2,0), В(0,2), радиус 2.
duga1.jpg
duga1.jpg (4.69 Кб) Просмотров: 11096


Но как быть если точки те же, а вот радиус например 3; или 1?

ps/ вот нарисовал что должно получится если радиус примерно 4 (смотреть только верхний правый квадрат):
duga2.jpg
duga2.jpg (20.36 Кб) Просмотров: 11096


Я так понимаю, что надо смещать центр круга по прямой, которая проходит под 45град вниз (только для данного случая), но вот как определить начальный и конечный угол ума не приложу
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.09.2014 (Пн) 16:18

  • Взяли отрезок, соединяющий 2 точки, определили его длину.
  • Определили высоту равнобедренного треугольника с радиусами по бокам.
  • Отложили эту длину на срединном перпендикуляре.
  • Получилось 2 возможных центра окружности.
  • Нарисовали окружность. Всё.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Построение дуги по 2 точкам и радиусу

Сообщение Debugger » 22.09.2014 (Пн) 20:06

Таких дуги две, кстати.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 22.09.2014 (Пн) 22:12

Debugger писал(а):Таких дуги две, кстати.

Кстати, четыре.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 4:09

Можно построить окружности из заданных точек с заданным радиусом, пересечения этих окружностей и будут центрами дуг
Drawing1.png
Drawing1.png (13.41 Кб) Просмотров: 11076
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение дуги по 2 точкам и радиусу

Сообщение Хакер » 23.09.2014 (Вт) 4:10

prono, какой смысл твоего поста? В аспекте программирования? Никакого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 4:50

Выбор способа тоже является частью решения задачи. Или мне выложить код для нахождения пересечения окружностей?
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение дуги по 2 точкам и радиусу

Сообщение Хакер » 23.09.2014 (Вт) 5:07

То, что ты предложил — это не способ вообще.

«Можно построить» — это то, что актуально для человека и для листа бумаги, который есть у человека. Человек чертит циркулем одну окружность, другую окружность, а потом его зрительный аппарат, анализируя картинку, находит пару заветных точек.

Для компьютера и для выполняющейся программы понятие «построить» становится расплывчатым и теряет смысл. Если программа решает задачу, то что значит «построить»? Вычислить каждый элемент бесконечного множества? Найти пересечение двух бесконечных множеств? Или нарисовать на конечном множестве пикселей — растре экрана эти окружности и найти пиксели, которые пришлось закрасить дважды (подарив поздвателю нафиг ему не нужные лишние вспомогательные окружности)?

Или что? Что означает «построить», когда речь идёт о задаче по вычислению промежуточных координат силами программы?

Программе не надо ничего строить, чтобы искать пересечение. Программа может сразу, сходу, не строя и не «ища» точки пересечения, вычислить их координаты как значение очень простого выражения.

Собственно, как вычислить эти координаты уже написали во втором способе.

Ты можешь настоять на том, что твой способ с непонятным призывом что-то «строить» (вот это слово, конечно же, действует как красня тряпка и является самым провокационным в твоём посте, потому как полностью заточено под бумажный способ решения) нужно свети к призыву составить систему уравнений, решениями которой будут координаты искомых точек, и заставить программу решить её.

Но вообще-то решение такой системы должно быть выполнено программистом ещё в compile-time, вернее даже в coding time. И решения этой системы из пары уравнений второй степени будут представлять собой те же самые выражения, которые получились бы, если действовать способом из второго поста.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 5:21

Ой, сколько шуму! Это всё называется «профессиональная деформация сознания». Потому что для обычного человека в данном контексте «строить» и «вычислять» должно быть эквивалентно друг другу. Хакер, отдыхай почаще!
Кстати, фраза «Отложили эту длину на срединном перпендикуляре» тоже подразумевает потроение с помощью линейки и циркуля...
PS Дабы не углюбляться в полемику, то о полезности моего первого поста пусть решит автор. Если он сочтёт его бесполезным и/или ненужным, то я удалю все свои сообщения.
O, sancta simplicitas!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 8:23

Mikle писал(а):
Debugger писал(а):Таких дуги две, кстати.

Кстати, четыре.


Вообще-то она одна, так как в моем частном случае надо чертить только против часовой стрелке.
Вот еще один пример:
duga3.png
duga3.png (9.66 Кб) Просмотров: 11068


В данном случае надо перейти от красной точке к зеленой с радиусом 60. Но тут все просто: радиус ровняется разности координат этих двоих точек.

Сейчас буду думать об алгоритме со 2 поста.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 23.09.2014 (Вт) 8:31

Sirik писал(а):Вообще-то она одна, так как в моем частном случае надо чертить только против часовой стрелке.

Тогда две - есть ещё большая дуга второй окружности, тоже против ч. с.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 8:33

Это если круг разделить на 2 дуги: от точки 1 к точке 2, и от точки 2 к точке 1. Мне же нужна только первая.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 23.09.2014 (Вт) 8:41

Обе окружности имеют одинаковый радиус. От точки "1" к точке "2" можно пройти по красной либо по синей дугам, обе против ч.с.
Изображение
Вложения
2o.GIF
(3.47 Кб) Скачиваний: 1503

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 8:46

Ну вот на примере что я выше показал, как можно еще по другому прийти от красной точке к зеленой? Если надо "идти" с опр радиусом и против часовой стрелке. Я просто не могу понять откуда появилась еще одна окружность
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 8:47

Кстати в описании G кодов (как раз по них и делаю) если радиус задан отрицательный, то берется именно бОльшая окружность, если положительный, то меньшая
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 23.09.2014 (Вт) 8:55

Sirik писал(а):Ну вот на примере что я выше показал, как можно еще по другому прийти от красной точке к зеленой? Если надо "идти" с опр радиусом и против часовой стрелке. Я просто не могу понять откуда появилась еще одна окружность
Вложения
duga4.PNG
duga4.PNG (8.15 Кб) Просмотров: 11061

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 9:21

Ага, уже понял) Но сейчас меня интересует только та, что на первом примере (так сказать с положительный радиусом). Как реши с ней, перейду к той что Вы описали
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 9:57

Радиус не бывает отрицательным. Кривые бывают выпуклые и вогнутые, а окружность не может быть вогнутой. Простыми словами: интересующая дуга должна находиться сверху вооброжаемой линии между данными точками, а её центр, соответственно, снизу. Можно подумать про направление дуги в частном случае, когда X1 = X2, т.е. линия расположена вертикально.
O, sancta simplicitas!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 10:02

Я знаю что радиус не может быть отрицательным, он таким образом задается в условии. Как-то так: если положительный, то дуга нижняя, если отрицательный, то дуга верхняя.
Сейчас же меня интересует только нижняя, до верхней еще дойти надо)
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 10:24

Тогда не нужно называть это радиусом, пусть это будет разность абсцисс первой и второй точки.
Код: Выделить всё
dX = X1 - X2
dX = 200 - 140 = 60 ( > 0 )
dX = 140 - 200 = -60 ( < 0 )
O, sancta simplicitas!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 10:28

Ну вот статья, раздел "R Method Example 2": http://www.manufacturinget.org/2011/12/ ... 2-and-g03/
Тут упоминается про отрицательный радиус, с другой стороны какая разница как его называть)
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 11:39

R Method Example 2 писал(а):If we want the arc with the longer arc length, we use a -R value (since -R does not already have a valid meaning)

Если мы хотим дугу с большей длиной, то используем -R ( с этого момента -R не имеет верного смысла).

Возникают вопросы. Кто и в какой момент решает, какая окружность нужна? Почему выбор дуги зависит от знака величины R?
-R — это команда интерпретатору, по какой дуге перемещать инструмент, если используется «R-метод».
O, sancta simplicitas!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Построение дуги по 2 точкам и радиусу

Сообщение Sirik » 23.09.2014 (Вт) 12:53

Я так и сказал, что это всего лишь радиус с указанием куда чертить

ps/ хоть убейте, не могу составить правильный алгоритм. единственно что получается - очень частный случай, когда расстояние к началу координат совпадает с радиусом
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Построение дуги по 2 точкам и радиусу

Сообщение Debugger » 23.09.2014 (Вт) 12:58

Пусть
Код: Выделить всё
A [x1, y1]
B [x2, y2]
R

Как уже написали, у тебя равнобедренный треугольник, стороны - два радиуса и вектор AB. Высота выходит из точки, находящейся посередине AB:
Код: Выделить всё
C = {(x1+x2)/2, (y1+y2)/2 }

имеет направление qnorm
Код: Выделить всё
l = sqrt((x2-x1)^2 + (y2-y1)^2) - длина вектора AB
q = [y2 - y1, x1 - x2] - повернутый вектор AB
qnorm = q / l - нормированный повернутый вектор AB

и длину h
Код: Выделить всё
h = sqrt(R^2 - (l/2)^2)

Соответственно, так как высота упирается в центр окружности O, он имеет координаты
Код: Выделить всё
O {C.x + qnorm.x*h, C.y + qnorm.y*h}

или, если раскрыть всё (кроме l, чтобы формула не получилась гигантской):
Код: Выделить всё
O.x = (x1+x2)/2 + (y2 - y1)*sqrt(R^2 - (l/2)^2)/l
O.y = (y1+y2)/2 + (x1 - x2)*sqrt(R^2 - (l/2)^2)/l

(формулы стоит перепроверить, особенно поворот вектора)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.09.2014 (Вт) 13:12

pronto писал(а):Или мне выложить код для нахождения пересечения окружностей?

Ну ты же понимаешь, что найти пересечение окружностей существенно сложнее, чем сложить 2 вектора ;)

pronto писал(а):since -R does not already have a valid meaning
с этого момента -R не имеет верного смысла

поскольку -R само по себе не имеет осмысленного значения

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Построение дуги по 2 точкам и радиусу

Сообщение pronto » 23.09.2014 (Вт) 13:57

Не сильно существенно, если учесть, что вычисляются обе точки и выполняется проверка на взаимное расположение окружностей
Код: Выделить всё
A1 = 2 * cx1: A2 = 2 * cx2
B1 = 2 * cy1: B2 = 2 * cy2
C1 = cx1 ^ 2 + cy1 ^ 2 - r1 ^ 2
C2 = cx2 ^ 2 + cy2 ^ 2 - r2 ^ 2

M = 1 + ((B1 - B2) / (A2 - A1)) ^ 2
N = ((2 * (C2 - C1) * (B1 - B2)) / (A2 - A1) ^ 2) - B1 + A1 * ((B2 - B1) / (A2 - A1))
q = C1 + ((C2 - C1) / (A2 - A1)) ^ 2 + A1 * ((C1 - C2) / (A2 - A1))

D = N * N - 4 * M * q
If D >= 0 Then 'окружности пересекаются в двух, либо одной точке
   y1 = (-N + Sqr(D)) / (2 * M)
   y2 = (-N - Sqr(D)) / (2 * M)
End If

M = 1 + ((A1 - A2) / (B2 - B1)) ^ 2
N = ((2 * (C2 - C1) * (A1 - A2)) / (B2 - B1) ^ 2) - A1 + B1 * ((A2 - A1) / (B2 - B1))
q = C1 + ((C2 - C1) / (B2 - B1)) ^ 2 + B1 * ((C1 - C2) / (B2 - B1))

H = N * N - 4 * M * q
If H >= 0 Then 'окружности пересекаются в двух, либо одной точке
   x1 = (-N + Sqr(H)) / (2 * M)
   x2 = (-N - Sqr(H)) / (2 * M)
End If

If cx2 < cx1 And cy2 > cy1 Then 'для второй окружности, находящейся в третей четверти
   Picture.Circle (x1, y1), 3
   Picture.Circle (x2, y2), 3
ElseIf cx2 > cx1 And cy2 < cy1 Then 'для второй окружности, находящейся в первой четверти
   Picture.Circle (x1, y1), 3
   Picture.Circle (x2, y2), 3
Else
   Picture.Circle (x2, y1), 3
   Picture.Circle (x1, y2), 3
End If
O, sancta simplicitas!

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Построение дуги по 2 точкам и радиусу

Сообщение The trick » 23.09.2014 (Вт) 15:20

Посмотри.
Код: Выделить всё
Option Explicit

Private Type Vec
    X As Single
    Y As Single
End Type

Dim pt(2) As Vec, cur As Long

Private Function GetCircle(p1 As Vec, p2 As Vec, p3 As Vec, r As Single, c As Vec) As Boolean
    Dim m1 As Single, m2 As Single
    If p2.X = p1.X Or p3.X = p2.X Then Exit Function
    m1 = (p2.Y - p1.Y) / (p2.X - p1.X)
    m2 = (p3.Y - p2.Y) / (p3.X - p2.X)
    If m2 = m1 Then Exit Function
    c.X = (m1 * m2 * (p1.Y - p3.Y) + m2 * (p1.X + p2.X) - m1 * (p2.X + p3.X)) / (2 * (m2 - m1))
    c.Y = -(1 / m1) * (c.X - (p1.X + p2.X) / 2) + (p1.Y + p2.Y) / 2
    m1 = p1.X - c.X: m2 = p1.Y - c.Y
    r = Sqr(m1 * m1 + m2 * m2)
    GetCircle = True
End Function

Private Sub Form_Load()
    Me.AutoRedraw = True: Me.ScaleMode = vbPixels
    Me.Move (Screen.Width - 8000) \ 2, (Screen.Height - 8000) \ 2, 8000, 8000
    Me.BackColor = vbWhite: Me.ForeColor = vbBlack
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If cur = 0 Then Me.Cls
    Me.Line (X - 2, Y - 2)-(X + 2, Y + 2), vbRed, B: Print cur + 1
    pt(cur).X = X: pt(cur).Y = Y
    cur = cur + 1
    If cur > 2 Then cur = 0
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If cur = 2 Then pt(2).X = X: pt(2).Y = Y: Draw
End Sub
Private Sub Draw()
    Dim a As Single, b As Single, _
        s As Single, e As Single, _
        q As Single, c As Vec, r As Single
       
    If Not GetCircle(pt(0), pt(1), pt(2), r, c) Then Exit Sub
   
    a = -(pt(0).Y - c.Y) * r: b = (pt(0).X - c.X) * r: s = Atan2(a, b)
    a = -(pt(1).Y - c.Y) * r: b = (pt(1).X - c.X) * r: e = Atan2(a, b)
    a = -(pt(2).Y - c.Y) * r: b = (pt(2).X - c.X) * r: q = Atan2(a, b)
   
    If e < 0 Then e = 6.28318530717959 + e
    If s < 0 Then s = 6.28318530717959 + s
    If q < 0 Then q = 6.28318530717959 + q
   
    If s > e Then a = s: s = e: e = a
    If q < s Or q > e Then a = s: s = e: e = a
   
    Debug.Print s, e, q
    Me.Cls
    Circle (c.X, c.Y), r, , s, e
    Me.Line (pt(0).X - 2, pt(0).Y - 2)-(pt(0).X + 2, pt(0).Y + 2), vbRed, B: Print 1
    Me.Line (pt(1).X - 2, pt(1).Y - 2)-(pt(1).X + 2, pt(1).Y + 2), vbRed, B: Print 2
    Me.Line (pt(2).X - 2, pt(2).Y - 2)-(pt(2).X + 2, pt(2).Y + 2), vbRed, B
    Me.Refresh
End Sub
Private Function Atan2(ByVal Y As Double, ByVal X As Double) As Double 'Возвращает угол, тангенс которого равен отношению двух указанных чисел
    If Y > 0 Then
        If X >= Y Then
            Atan2 = Atn(Y / X)
        ElseIf X <= -Y Then
            Atan2 = Atn(Y / X) + 3.14159265358979
        Else
            Atan2 = 3.14159265358979 / 2 - Atn(X / Y)
        End If
    Else
        If X >= -Y Then
            Atan2 = Atn(Y / X)
        ElseIf X <= Y Then
            Atan2 = Atn(Y / X) - 3.14159265358979
        Else
            Atan2 = -Atn(X / Y) - 3.14159265358979 / 2
        End If
    End If
End Function
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 23.09.2014 (Вт) 20:00

Кривоус Анатолий писал(а):Посмотри.

Респектище ... только задача немного другая. Debugger описал с виду правильно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Построение дуги по 2 точкам и радиусу

Сообщение Хакер » 23.09.2014 (Вт) 21:05

Sirik писал(а):ps/ хоть убейте, не могу составить правильный алгоритм. единственно что получается - очень частный случай, когда расстояние к началу координат совпадает с радиусом

Держи. Можно двигать контрольные точки мышкой, менять радиус, менять координаты вручную, выбирать ориентацию и направление обхода (2 × 2 варианта дают в конечном свёте 4 варианта дуги, как правильно заметил Mikle).
scr_1.png
scr_1.png (26.55 Кб) Просмотров: 11019


Устойчива к некорректным условиям:
scr_2.png
scr_2.png (23.61 Кб) Просмотров: 11019


Щедро снабжён комментариями. Выражения по вычислению координат не преведены (не путать с «не приведены») и не упрощены, а представлены манипуиляциями над векторами силами функций с человеко-читаемыми именами.

ArcBy2pAndRadius.zip
(8.25 Кб) Скачиваний: 225


Mikle, жду «респектище» :lol:

Добавлено позже:
В примере нашёлся баг. В функции V2GetOxAngle исправьте строку:
V2GetOxAngle = IIf(v.X > 0, 0, pi / 2)
на
V2GetOxAngle = IIf(v.X > 0, 0, pi)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Построение дуги по 2 точкам и радиусу

Сообщение Mikle » 24.09.2014 (Ср) 8:17

Хакер писал(а): жду «респектище»

:))
Для обучающей программы - самое то, всё действительно читаемо и логично.
Из замеченных багов - надпись "Нет решения!" сильно уменьшается, если точки близко.
А для полного удобства не хватает регулировки радиуса слайдером.
И на первый взгляд что-то многовато кода, хотя, может это из-за всех этих опций - выбор направления и т. п., сильно не вникал.
Последний раз редактировалось Mikle 24.09.2014 (Ср) 8:18, всего редактировалось 1 раз.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList