Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Butt-Head
Заблокирован
#1

Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки - C++

23.07.2015, 13:33. Просмотров 3010. Ответов 30
Метки нет (Все метки)

Привет! Помогите двоишнику, я же тупой батхэд !

Есть отрезок, заданный двумя точками P1 и P2. Есть точка P3. Так вот, нужно найти координаты точки пересечения перпендикуляра, опущенного на заданный отрезок и, собственно этого отрезка, причём, если точка не находится на отрезке - как то просигнализировать ...

Нужен рабочий код. Можно использовать С++ 11/14 и Qt, в котором есть
C++
1
static float dotProduct(const QVector2D& v1, const QVector2D& v2);
...

0
Миниатюры
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 13:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки (C++):

Найти точку пересечения отрезка с прямой
Найти точку пересечения отрезка, заданного точками (х1;y1) и (x2;y2) с прямой,...

Найти точки пересечения отрезка и окружности
Here i go again :) Нужен код готовой функции для поиска точек пересечения...

Вычислительная геометрия (Даны координаты центра, R окружности, координаты точки вне окруж-ти. Найти точку пересечения одной из касательных с окруж-ю)
Даны координаты центра (xc,yc) и радиус R окружности, координаты точки (x,y)...

Найти точки пересечения прямых проходящих через заданные точки
Всем привет! Прошу помощи в решении задачи: Дана система координат X:Y (по 25...

Найти точку пересечения двух отрезков
как найти точку пересечения двух отрезков, если даны координаты начала и конца...

Найти точку пересечения прямой с плоскостью
Зарание спасибо.)

30
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 13:53 #2
Лучший ответ Сообщение было отмечено Butt-Head как решение

Решение

Хлебнете вы от аналитической геометрии…
Может тут?
http://www.cyberforum.ru/cpp-beginners/thread1490155.html#post7822038
Где-то на форуме была точно помню…
Гуглить вроде “ перпендикуляр на прямую, Координаты перпендикуляра на прямую”?.

Добавлено через 6 минут
Вот ответ.
http://www.cyberforum.ru/cpp-beginners/thread125838.html#post707538
1
Butt-Head
Заблокирован
23.07.2015, 14:05  [ТС] #3
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Подобие math.h для геометрии
Не... буст в топку
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Гуглить вроде “ перпендикуляр на прямую, Координаты перпендикуляра на прямую”?.
Да гуглил... Найти расстояние (длину этого перпендикуляра) от этой точки до отрезка - нет проблем, а вот координаты - хз как находить.

Мне собственно нужны даже не совсем координаты, а просто смещение от точки P1 до точки P4, то есть расстояние от начальной точки отрезка, до точки пересечения. Конечно же, зная координаты, я это расстояние найду. Но вроде бы как то можно скалярным произведением всё решить .... Помогите, dotProduct использовать можно !

Добавлено через 6 минут
То есть фактический ответом на мой вопрос будет это: (верно? Excalibur921 ? )
C++
1
2
3
4
5
6
//Прямая задана двумя точками (x1,y1) (x2,y2). Есть третья точка (x3,y3). Из точки нужно опустить перпендикуляр и найти координаты его основания на прямой (x4,y4)
float x1, x2, x3, x4;
float y1, y2, y3, y4;
//...
x4=((x2-x1)*(y2-y1)*(y3-y1)+x1*pow(y2-y1, 2)+x3*pow(x2-x1, 2))/(pow(y2-y1, 2)+pow(x2-x1, 2));
y4=(y2-y1)*(x4-x1)/(x2-x1)+y1;
Добавлено через 1 минуту
Ну ок, а как проверить, есть ли вообще решение? Ну то есть если перпендикуляр опускается на отрезок, но не попадает в его границы (попадает по лучу, а не по отрезку) ?
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 14:10 #4
Цитата Сообщение от Butt-Head Посмотреть сообщение
попадает по лучу, а не по отрезку)
То найдет координаты точки на луче вроде.
1
Butt-Head
Заблокирован
23.07.2015, 14:17  [ТС] #5
Цитата Сообщение от Excalibur921 Посмотреть сообщение
То найдет координаты точки на луче вроде.
чта?
Я нахожу координаты точки пересечения перпендикуляра и отрезка. Как теперь мне определить, принадлежать ли эти координаты этому отрезку?
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 14:27 #6
Цитата Сообщение от Butt-Head Посмотреть сообщение
чта?
Найдет координаты точки перпендикуляра на луч за границами отрезка.

Может можно и проще если важна скорость, но нужно очень шарить в геометрии. Надобыло в геометрии создавать…и просить решение в символьной форме.
Цитата Сообщение от Butt-Head Посмотреть сообщение
Как теперь мне определить,
Ну наверно проверить принадлежность точки отрезку… вход точки в интервал между X и Y точек P1 и P2. А как еще?

Добавлено через 1 минуту
Может есть еще решение в что то типа высота треугольника…
1
Butt-Head
Заблокирован
23.07.2015, 14:34  [ТС] #7
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Ну наверно проверить принадлежность точки отрезку… вход точки в интервал между X и Y точек P1 и P2. А как еще?
ну это - то понятно:

C++
1
if((x3 > x1 && x3 < x2) && ... и тд
но дело в том, что у тебя отрезок может быть направлен в отрицательную сторону, тогда у тебя x2 будет меньше x1 и по этому тут нужно сперва всё это перегонять в 1-ю четверть (всего 3 координатные четверти), делать операцию и обратно. Понимаешь? По этому я и спрашиваю готовую формулу, т.к. лень всё делать самому.

В Qt наверняка что - то есть, неужели нет?
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 14:41 #8
А можно узнать угол отрезка P1 P3 даст Альфа 1 и угол отрезка P1 P2 даст Альфа 2. Повернуть отрезок P1 P3 на Альфа 2 будет как треугольник с горизонтальным основанием(без поворота). Тогда P4=(x1,y3).

Добавлено через 3 минуты
Цитата Сообщение от Butt-Head Посмотреть сообщение
В Qt наверняка что - то есть,
Скорей всего…
Тогда надобыло в теме Qt создавать .Или поискать либы по геометрии в Qt…А чем плоха что я кидал либу? Там и 3д есть.
1
Butt-Head
Заблокирован
23.07.2015, 14:49  [ТС] #9
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Тогда надобыло в теме Qt создавать
Да толку то ..., всё равно все сидят только здесь
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А чем плоха что я кидал либу?
Тем что её надо изучать.

Ладно, через жопу на Qt реализовал, скоростью и не пахнет, да мне она и не нужна.
Вообще странно, что нет ничего готового для таких стандартных вещей ...
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 14:57 #10
Цитата Сообщение от Butt-Head Посмотреть сообщение
Вообще странно, что нет ничего готового для таких стандартных вещей
Я в Qt сначала неделю его ставил… http://www.cyberforum.ru/qt/thread1280642.html
потом не мог вывести синусоиду никто не подсказал 600 чел смотрели тему…
http://www.cyberforum.ru/qt/thread1280645.html
Потом ели стер этот Qt еще и с ошибками даже на удалении =).А примеры там это вообще жесть… куча мусора. Как не программист делал примеры туда.
1
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
23.07.2015, 15:01 #11
Берете три вектора http://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{r}}_{31}, {\vec{r}}_{32} и http://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{r}}_{21}
Что бы перпендикуляр лежал на отрезке достаточно, что бы скалярные произведения http://www.cyberforum.ru/cgi-bin/latex.cgi?({\vec{r}}_{31}, {\vec{r}}_{21}) и http://www.cyberforum.ru/cgi-bin/latex.cgi?({\vec{r}}_{32}, {\vec{r}}_{21}) были разных знаков.
Точка пересечения перпендикуляра находится как http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{r} = {\vec{r}}_{1} + ({\vec{r}}_{31}, {\vec{e}}_{21}){\vec{e}}_{21}, где http://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{e}}_{21} = \frac{{\vec{r}}_{21}}{\left|{\vec{r}}_{21} \right|}
1
Butt-Head
Заблокирован
23.07.2015, 15:18  [ТС] #12
Цитата Сообщение от Excalibur921 Посмотреть сообщение
потом не мог вывести синусоиду никто не подсказал 600 чел смотрели тему…
Синусоида OpenGL и слайдер
Так там есть же ответ в последнем посте На самом деле сейчас большинство современного софта пишется на Qt, т.к. код на Qt собирается на любой современной ОС. Зря ты от него отказался

Цитата Сообщение от Ilot Посмотреть сообщение
Берете три вектора и
Спасибо. Но я не очень понимаю, что значит берёте три вектора.
У меня есть три пары координат (см рисунок в первом посте), вот как из них получить векторы?
Цитата Сообщение от Ilot Посмотреть сообщение
Точка пересечения перпендикуляра находится как
А это что, сложение вектора с о скобками, в которых чего? скалярное произведение или что ?

Не могли бы вы в координаты ваши формулы перевести?
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
23.07.2015, 15:30 #13
Условие того, что точка лежит внутри отрезка:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\left( ({x}_{3} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{3} - {y}_{1}) * ({y}_{2} - {y}_{1})\right) * \left( ({x}_{3} - {x}_{2}) * ({x}_{2} - {x}_{1}) + ({y}_{3} - {y}_{2}) * ({y}_{2} - {y}_{1})\right) < 0
Точка пересечения перепендикулляра и отрезка:
http://www.cyberforum.ru/cgi-bin/latex.cgi?x = {x}_{1} +  \frac{ ({x}_{3} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{3} - {y}_{1}) * ({y}_{2} - {y}_{1})}{\sqrt{({x}_{2} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{2} - {y}_{1}) * ({y}_{2} - {y}_{1})}} * \frac{ ({x}_{2} - {x}_{1})}{\sqrt{({x}_{2} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{2} - {y}_{1}) * ({y}_{2} - {y}_{1})}}
http://www.cyberforum.ru/cgi-bin/latex.cgi?y = {y}_{1} +  \frac{ ({x}_{3} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{3} - {y}_{1}) * ({y}_{2} - {y}_{1})}{\sqrt{({x}_{2} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{2} - {y}_{1}) * ({y}_{2} - {y}_{1})}} * \frac{ ({y}_{2} - {y}_{1})}{\sqrt{({x}_{2} - {x}_{1}) * ({x}_{2} - {x}_{1}) + ({y}_{2} - {y}_{1}) * ({y}_{2} - {y}_{1})}}
Надеюсь нигде не соврал...
p.s. В последних выражениях корни одинаковые поэтому их можно схлопнуть. Расписал для лучшего понимания.
1
Butt-Head
Заблокирован
23.07.2015, 15:48  [ТС] #14
Цитата Сообщение от Ilot Посмотреть сообщение
Условие
Хмм... а что это за условие?

Результирующие координаты это x и у ?

Добавлено через 2 минуты
Ааа понял, это что б как бы точка принадлежала именно отрезку, а не лучу...
Ну что ж, спасибо, но в итоге это получается намноОого громоздче, нежели
C++
1
2
x4=((x2-x1)*(y2-y1)*(y3-y1)+x1*pow(y2-y1, 2)+x3*pow(x2-x1, 2))/(pow(y2-y1, 2)+pow(x2-x1, 2));
y4=(y2-y1)*(x4-x1)/(x2-x1)+y1;
из 3-го поста ...
Всё таки векторная математика - чисто понт, в действительности - то всё идёт через обычные умножения, сложения и тд, но если решать всё с понтом, то решение получится намного сложнее
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
23.07.2015, 16:03 #15
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от Butt-Head Посмотреть сообщение
Ну что ж, спасибо, но в итоге это получается намноОого громоздче, нежели...
Это еще как посмотреть:
C++
1
2
3
k = ((x3-x1) * (x2-x1) + (y3-y1)*(y2-y1))/ (pow(x2-x1, 2) + pow(y2-y1, 2));
x = x1 + k * (x2-x1);
y = y1 + k * (y2-y1);
1
Butt-Head
Заблокирован
23.07.2015, 16:10  [ТС] #16
Цитата Сообщение от Ilot Посмотреть сообщение
Это еще как посмотреть:
Ну в принципе да...
Ладно, спасибо тебе о великий Ilot
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 16:53 #17
ТС у вас работает?
Решил попробовать и не работает ваш код.
http://www.cyberforum.ru/cgi-bin/latex.cgi?A(x1,y1) вершина
http://www.cyberforum.ru/cgi-bin/latex.cgi?B(x2,y2),C(x3,y3) отрезок
http://www.cyberforum.ru/cgi-bin/latex.cgi?x,y искомая

http://www.cyberforum.ru/cgi-bin/latex.cgi?(x2-x1)=a0  <br />
(y2-y1)=a1   <br />
k=((x3-x1)*a0+(y3-y1)*a1)/(a0^2+a1^2)<br />
x=x1+k*a0<br />
y=y1+k*a1<br />
1
Butt-Head
Заблокирован
23.07.2015, 16:56  [ТС] #18
Цитата Сообщение от Excalibur921 Посмотреть сообщение
ТС у вас работает?
Работает что?
Я оставил всё по старому, координаты считаю методом из моего поста номер 3
http://www.cyberforum.ru/cpp-beginners/thread1503781.html#post7902977
Если делать так, как в посте номер 3 - то всё работает.

А ты что за формулы привёл?
0
Excalibur921
750 / 425 / 68
Регистрация: 12.10.2013
Сообщений: 2,837
23.07.2015, 17:30 #19
Цитата Сообщение от Butt-Head Посмотреть сообщение
Работает что?
Второй метод который вы просили расписать через вектора… и который быстрей должен быть.
Цитата Сообщение от Butt-Head Посмотреть сообщение
А ты что за формулы привёл?
Второй метод Ilot.

Добавлено через 24 минуты
Получается Butt-Head, использует метод который я предложил, а модератор отметил неработающую формулу как лучший ответ… забавно… =).
1
Butt-Head
Заблокирован
23.07.2015, 17:46  [ТС] #20
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Получается Butt-Head, использует метод который я предложил, а модератор отметил неработающую формулу как лучший ответ… забавно… =).
Это не модератор отметил, а я Раз так, снимаю с ИЛОТА лучший ответ. Садись - два Илот .
Ставлю лучший ответ чудо мечу. (и не один, я не жадный ехехе)
0
23.07.2015, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 17:46
Привет! Вот еще темы с решениями:

Равнобедренная трапеция - найти точку пересечения боковых сторон
Равнобедренная трапеция задана координатами вершин. Найти точку пересечения...

Найти координаты точки, делящей отрезок в заданном отношении
3)Найти координаты точки, делящей отрезок с координатами (X1, Y1, Z1) и (X2,...

найти точки пересечения y = ax^3 + bx^2 + cx + d и y = kx + m
Задача: Определить, пересекаются ли линии y = ax^3 + bx^2 + cx + d и y = kx +...

Найти точки пересечения касательных с окружностью
Даны координаты центра и радиус R окружности, координаты точки. Найти точки...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru