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

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

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

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

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

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

Миниатюры
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2015, 13:33
Ответы с готовыми решениями:

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

Найти основание перпендикуляра, опущенного из точки на прямую
Необходимо решить 2 задачи,но я не понимаю каким образом это можно сделать. 1.Дан метрический тензор g_{ij}=\begin{pmatrix} 1 &...

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

30
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.07.2015, 19:53
Студворк — интернет-сервис помощи студентам
Зря вы так категоричны. Может там опечатка в формуле...вектора крутые если в них шарить. Просто когда-то сам искал решение этой задачи и интересны альтернативы работающие быстрей всегда пригодятся. А теперь человек старался а вы его спугнули =(.
Лучший ответ обозначает решение задачи, пока что он один.
Вот графически наглядная интерпретация повторов.

А вот в символьной форме:
a0=(x3-x1)
a1=(x2-x1)
a2=(y3-y1)
a3=(y2-y1)
a4=((a0*a1+a2*a3))
a5=a1*a1
a6=a3*a3
a7=Sqrt(a5+a6)

Лежит ли внутри отрезка Proverka<0:
Proverka=a4*((x3-x2)*a1+(y3-y2)*a3)
x=x1+(a4/a7)*(a1/a7)
y=y1+(a4/a7)*(a3/a7)
Также неправильно, и проверка неправильна…Вроде ошибок нет =).
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
24.07.2015, 07:52
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Также неправильно, и проверка неправильна…Вроде ошибок нет =).
Что конкретно не правильно. Формула совпадает с вашей, которую вы привели в первом посте "с помощью программиста из википедии". Если я не прав укажите где. Буду благодарен если вы поможете мне стать чуточку умнее, а пока возвращаю все на свои места и привожу код для тестирования.
У меня мой код выдавал правильные ответы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cmath>
int main(){
    float x1 = 0;
    float x2 = 1;
    float x3 = 0.5;
    float x4;
    float y1 = 0;
    float y2 = 0;
    float y3 = 1;
    float y4;
    float k;
 
    k = ((x3-x1) * (x2-x1) + (y3-y1)*(y2-y1))/ (std::pow(x2-x1, 2) + std::pow(y2-y1, 2));
    x4 = x1 + k * (x2-x1);
    y4 = y1 + k * (y2-y1);
 
    std::cout << "(x, y) = " << "(" << x4 << ", " << y4 << ")" << std::endl;
 
    return 0;
}
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.07.2015, 09:24
Цитата Сообщение от Ilot Посмотреть сообщение
в первом посте "с помощью программиста из википедии".
Вы все напутали…то координаты в 3д. И там ссылка на либу.
Вот почему не работало, я перепутал точки. А теперь работает и проверка, упростил и исправил =).
Теперь есть два решения:
Отрезок:
A (x1,y1)
B (x2,y2)

Точка:
C (x3,y3)

Точка на отрезке:
D (x4,y4)
--------
Метод1:
a0=x2-x1
a1=y2-y1

x4=(a0*a1*(y3-y1)+x1*a1^2+x3*a0^2)/(a1^2+a0^2)
y4=a1*(x4-x1)/a0+y1
Принадлежность отрезку Если x4<x2…
--------

--------
Метод2:
a0=x2-x1
a1=y2-y1
a2=x3-x1
a3=y3-y1

Если Proverka<0 то точка принадлежит отрезку.
Proverka=(a2*a0+a3*a1)*((x3-x2)*a0+(y3-y2)*a1)
k=(a2*a0 + a3*a1) / (a0² + a1²)
x4=x1 + k*a0
y4=y1 + k*a1
Butt-Head спешите с выводами… и поленились проверить формулы сами.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
24.07.2015, 09:30
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Вы все напутали…то координаты в 3д.
Т.е. я опять не прав? Да и какая разница какое пространство - хрен один только вид сбоку.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Butt-Head спешите с выводами… и поленились проверить формулы сами.
Т.е. опять не вы ввели ТС в заблуждение, а он сам виноват?
Напомню вам про правила форума:
 Комментарий модератора 

Правила форума п. 5.22
Запрещено намеренно вводить других пользователей форума в заблуждение.

Так, что либо делайте выводы, либо в следующий раз получите карту.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.07.2015, 09:41
Предлагаю отметить пост 23 как лучший ответ. Два метода решения с коментами.
0
Почетный модератор
12274 / 5341 / 268
Регистрация: 05.04.2011
Сообщений: 14,086
Записей в блоге: 2
24.07.2015, 09:56
Excalibur921, модератор разберется.
0
Заблокирован
24.07.2015, 10:57  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Принадлежность отрезку Если x4<x2…
Про проверку метода 1 в посте №23 (Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки)
Такая проверка сработает только если у исходного отрезка вторая точка правее и выше первой, иначе не получится. Точнее получится, но надо будет писать 4 условия для 4-х направлений и ещё 4 проверки для ортогональных условий.

Думаю, что проверка в векторном стиле более удачный ход в данном случае, она же лишена таких недостатков и куда бы не был направлен отрезок, отрицательный результат скалярного произведения векторов всегда будет свидетельствовать о том, что точка не принадлежит отрезки, всё верно, Ilot или я что - то не так понял?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
24.07.2015, 11:02
Цитата Сообщение от Butt-Head Посмотреть сообщение
Думаю, что проверка в векторном стиле более удачный ход в данном случае, она же лишена таких недостатков и куда бы не был направлен отрезок, отрицательный результат скалярного произведения векторов всегда будет свидетельствовать о том, что точка не принадлежит отрезки, всё верно, Ilot или я что - то не так понял?
Не скалярного произведения, а произведения скалярных произведений. Впрочем это просто игра слов. А так все верно.
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.07.2015, 12:20
Цитата Сообщение от Butt-Head Посмотреть сообщение
иначе не получится. Точнее получится, но надо будет писать 4 условия для 4-х направлений и ещё 4 проверки для ортогональных условий.
Не понимаю что это значит.
Разве проверка не очевидна? Сравните.
Если x4<x2 и x4>x1 и y4<y2 и y4>y1
(a2*a0+a3*a1)*((x3-x2)*a0+(y3-y2)*a1)
А разве сверка чисел не много быстрей чем 5 умножений т.д. действия?
0
Заблокирован
24.07.2015, 12:51  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Не понимаю что это значит.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Если x4<x2 и x4>x1 и y4<y2 и y4>y1
ну смотри, для простоты берём только X-ы, допустим отрезок имеет координаты:
x1 = 3;
x2 = 7;
точка на луче (наша точка пересечения) имеет координаты:
x4 = 5;

тут да, всё ок:
(x4 >= x1 && x4 <= x2) -> true;

Теперь, если делать такую же проверку, но для отрезка с координатами:
x1 = -4;
x2 = -12;
точка на луче (наша точка пересечения) имеет координаты:
x4 = -7;

тогда твоя проверка не сработает, т.к. отрезок направлен в другую сторону, понимаешь? (несмотря на то, что точка на отрезке)
(x4 >= x1 && x4 <= x2) -> false!;


В этом случае необходимо 8-мь проверок! Для 4-х направления отрезка и для 4-х частных случаев ортогональности, а это как ты понимаешь - оверхэд по скорости
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.07.2015, 13:32
А по нормальному нужно курить условия проверки с учетом четверти и будет всеравно быстрей умножения)).Но если разовая операция то чего париться.. вон тут вообще
http://hardfire.ru/point_in_segment
Кучи форумов где “принадлежность точки отрезку”
Сотни страниц коментов... жесть .Вот еще пример…
if(((sgn(x1-x2))<>(sgn(x1-x3)))then OK
Вектора так вектора=).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2015, 13:32

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru