Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Butt-Head
Заблокирован
#1

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

23.07.2015, 13:33. Просмотров 2730. Ответов 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++):

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

Найти точки пересечения отрезка и окружности - C++
Here i go again :) Нужен код готовой функции для поиска точек пересечения отрезка и окружности в 2D, может есть у кого готовая...

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

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

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

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

30
Excalibur921
689 / 397 / 62
Регистрация: 12.10.2013
Сообщений: 2,705
23.07.2015, 13:53 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хлебнете вы от аналитической геометрии…
Может тут?
Подобие math.h для геометрии
Где-то на форуме была точно помню…
Гуглить вроде “ перпендикуляр на прямую, Координаты перпендикуляра на прямую”?.

Добавлено через 6 минут
Вот ответ.
Перпендикуляр из точки на прямую
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
689 / 397 / 62
Регистрация: 12.10.2013
Сообщений: 2,705
23.07.2015, 14:10 #4
Цитата Сообщение от Butt-Head Посмотреть сообщение
попадает по лучу, а не по отрезку)
То найдет координаты точки на луче вроде.
1
Butt-Head
Заблокирован
23.07.2015, 14:17  [ТС] #5
Цитата Сообщение от Excalibur921 Посмотреть сообщение
То найдет координаты точки на луче вроде.
чта?
Я нахожу координаты точки пересечения перпендикуляра и отрезка. Как теперь мне определить, принадлежать ли эти координаты этому отрезку?
0
Excalibur921
689 / 397 / 62
Регистрация: 12.10.2013
Сообщений: 2,705
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
689 / 397 / 62
Регистрация: 12.10.2013
Сообщений: 2,705
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
689 / 397 / 62
Регистрация: 12.10.2013
Сообщений: 2,705
23.07.2015, 14:57 #10
Цитата Сообщение от Butt-Head Посмотреть сообщение
Вообще странно, что нет ничего готового для таких стандартных вещей
Я в Qt сначала неделю его ставил… Неверные переменные среды QT 4.8.0 Creator 2.4.1
потом не мог вывести синусоиду никто не подсказал 600 чел смотрели тему…
Синусоида OpenGL и слайдер
Потом ели стер этот Qt еще и с ошибками даже на удалении =).А примеры там это вообще жесть… куча мусора. Как не программист делал примеры туда.
1
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
23.07.2015, 16:03 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 16:03
Привет! Вот еще темы с ответами:

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

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

Найти координаты точки, делящей отрезок в заданном отношении - C++
3)Найти координаты точки, делящей отрезок с координатами (X1, Y1, Z1) и (X2, Y2, Z2) в отношении M / N.

Найти точки пересечения гиперболы и окружности - C++
Нужно найти точки пересечения гиперболы и окружности. Если смотреть с матиматической точки зрения то у окружности и гиперболы может бить...


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

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

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