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

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

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

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

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

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

Миниатюры
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2015, 13:33
Ответы с готовыми решениями:

Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки
Привет! Помогите двоишнику, я бивис! :D Есть отрезок, заданный двумя точками P1 и P2. Есть точка...

Найти основание перпендикуляра, опущенного из точки на прямую
Необходимо решить 2 задачи,но я не понимаю каким образом это можно сделать. 1.Дан метрический...

Написать уравнение перпендикуляра, опущенного из точки на прямую
Доброго времени суток Прорешиваю практику по экзамена по алгему,попался вопрос,который звучит так...

Написать уравнение перпендикуляра, опущенного из точки на прямую
написать уравнение перпендикуляра, опущенного из точки А(-1;0;3) на прямую (х+1)/3 = (у-1)/2=z/1

30
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 13:53 2
Лучший ответ Сообщение было отмечено Butt-Head как решение

Решение

Хлебнете вы от аналитической геометрии…
Может тут?
Подобие math.h для геометрии
Где-то на форуме была точно помню…
Гуглить вроде “ перпендикуляр на прямую, Координаты перпендикуляра на прямую”?.

Добавлено через 6 минут
Вот ответ.
Перпендикуляр из точки на прямую
1
Заблокирован
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
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 14:10 4
Цитата Сообщение от Butt-Head Посмотреть сообщение
попадает по лучу, а не по отрезку)
То найдет координаты точки на луче вроде.
1
Заблокирован
23.07.2015, 14:17  [ТС] 5
Цитата Сообщение от Excalibur921 Посмотреть сообщение
То найдет координаты точки на луче вроде.
чта?
Я нахожу координаты точки пересечения перпендикуляра и отрезка. Как теперь мне определить, принадлежать ли эти координаты этому отрезку?
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 14:27 6
Цитата Сообщение от Butt-Head Посмотреть сообщение
чта?
Найдет координаты точки перпендикуляра на луч за границами отрезка.

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

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

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

В Qt наверняка что - то есть, неужели нет?
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
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
Заблокирован
23.07.2015, 14:49  [ТС] 9
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Тогда надобыло в теме Qt создавать
Да толку то ..., всё равно все сидят только здесь
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А чем плоха что я кидал либу?
Тем что её надо изучать.

Ладно, через жопу на Qt реализовал, скоростью и не пахнет, да мне она и не нужна.
Вообще странно, что нет ничего готового для таких стандартных вещей ...
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 14:57 10
Цитата Сообщение от Butt-Head Посмотреть сообщение
Вообще странно, что нет ничего готового для таких стандартных вещей
Я в Qt сначала неделю его ставил… Неверные переменные среды QT 4.8.0 Creator 2.4.1
потом не мог вывести синусоиду никто не подсказал 600 чел смотрели тему…
Синусоида OpenGL и слайдер
Потом ели стер этот Qt еще и с ошибками даже на удалении =).А примеры там это вообще жесть… куча мусора. Как не программист делал примеры туда.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
23.07.2015, 15:01 11
Берете три вектора https://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{r}}_{31}, {\vec{r}}_{32} и https://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{r}}_{21}
Что бы перпендикуляр лежал на отрезке достаточно, что бы скалярные произведения https://www.cyberforum.ru/cgi-bin/latex.cgi?({\vec{r}}_{31}, {\vec{r}}_{21}) и https://www.cyberforum.ru/cgi-bin/latex.cgi?({\vec{r}}_{32}, {\vec{r}}_{21}) были разных знаков.
Точка пересечения перпендикуляра находится как https://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{r} = {\vec{r}}_{1} + ({\vec{r}}_{31}, {\vec{e}}_{21}){\vec{e}}_{21}, где https://www.cyberforum.ru/cgi-bin/latex.cgi?{\vec{e}}_{21} = \frac{{\vec{r}}_{21}}{\left|{\vec{r}}_{21} \right|}
1
Заблокирован
23.07.2015, 15:18  [ТС] 12
Цитата Сообщение от Excalibur921 Посмотреть сообщение
потом не мог вывести синусоиду никто не подсказал 600 чел смотрели тему…
Синусоида OpenGL и слайдер
Так там есть же ответ в последнем посте На самом деле сейчас большинство современного софта пишется на Qt, т.к. код на Qt собирается на любой современной ОС. Зря ты от него отказался

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

Не могли бы вы в координаты ваши формулы перевести?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
23.07.2015, 15:30 13
Условие того, что точка лежит внутри отрезка:
https://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
Точка пересечения перепендикулляра и отрезка:
https://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})}}
https://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
Заблокирован
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
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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
Заблокирован
23.07.2015, 16:10  [ТС] 16
Цитата Сообщение от Ilot Посмотреть сообщение
Это еще как посмотреть:
Ну в принципе да...
Ладно, спасибо тебе о великий Ilot
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 16:53 17
ТС у вас работает?
Решил попробовать и не работает ваш код.
https://www.cyberforum.ru/cgi-bin/latex.cgi?A(x1,y1) вершина
https://www.cyberforum.ru/cgi-bin/latex.cgi?B(x2,y2),C(x3,y3) отрезок
https://www.cyberforum.ru/cgi-bin/latex.cgi?x,y искомая

https://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
Заблокирован
23.07.2015, 16:56  [ТС] 18
Цитата Сообщение от Excalibur921 Посмотреть сообщение
ТС у вас работает?
Работает что?
Я оставил всё по старому, координаты считаю методом из моего поста номер 3
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки
Если делать так, как в посте номер 3 - то всё работает.

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

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

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

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

Найти точку\точки пересечения гипербол
Добрый день. На плоскости есть две гиперболы. Каждая описана 3-мя точками. Известны x и y всех...

Программа на определение перпендикуляра и нахождения точки пересечения
Даны две прямые,заданные уравнениями y=k1x+b1(1-маленькое), y=k2x+b2(аналогично),вводятся...

Найти проекцию точки на прямую и точку пересечения прямой и плоскости
Прямая l задана в пространстве общими уравнениями. Написать её каноническое и параметрическое...

Найти точку пересечения высот и точку пересечения биссектрис треугольника
Привет всем!!! Помогите срочно пожалуйста! Не знаю как решить задачу на делфи : Найти точку...


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

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