Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Алгоритмы
Перезагрузить страницу Проекция точки на прямую
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 25.03.2007, 15:28

Есть две плоскости, каждая задаётся тремя точками в 3D.

Так же есть некая произвольная точка A.

Надо найти проекцию точки A на прямую, образующуюся в результате пересечения этих двух плоскостей. Т. е., основание перпендикуляра, опущенного из т. A на эту прямую.

Вряд ли это сложно, но задолбало.... в справочниках везде все уравнения в разных видах, пока переведёшь туда-сюда, непременно где-нибудь облажаешься с выводом формулы... Ни у кого нет простого описания, как найти такую проекцию?
Ответить с цитированием
  (#2 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 25.03.2007, 18:38

Вот что у меня получилось:
пусть A1,B1,C1 точки задающие первую плоскость, а A1x,A1y...... их координаты
аналогично со второй плоскостью - A2,B2,C2.
<A1,B1> - (обозначение вектора A1,B1) = <B1>-<A1>
[<a>*[b]] векторное произведение
(<a>*[b]) скалярное
O - начало координат
Цитата:
Надо найти проекцию точки A на прямую, образующ
переименую её в точку D
[<A1,B1>*<A1,C1>] = <N1> - вектор перпендикулярный плоскости 1
[<A2,B2>*<A2,C2>] = <N2> - вектор перпендикулярный плоскости 2
если любой из них = 0 значит плоскость задана не верно - точки лежат на одной прямой
[<N1>*<N2>] = <S> - вектор перпендикулярный обоим перпендикулярам, а значит параллельный прямой пересечения 2 плоскостей, если =0, то плоскости не пересекаются, или совпадают.
(<X>-<O,A1>*<N1>)=0 - Уравнение первой плоскости (здесь и далее сначала вычитание, потом умножение)
(<X>-<O,A2>*<N2>)=0 - Уравнение второй плоскости
любой вектор X, удовлетворяющий уравнению, принадлежит соответствующей плоскости
нам нужно, что бы точка X была такой, что бы она лежала в обоих плоскостях (удов. обоим уравн), и вектор <X>-<D> (Отрезок от D до точки пересечения X) был перпендикулярен <S>, т.е.
(<X>-<D>*<S>)=0
Решая систему трёх уравнений
(<X>-<O,A1>*<N1>)=0
(<X>-<O,A2>*<N2>)=0
(<X>-<D>*<S>)=0
где N1,N2,S ищутся по приведённым выше формулам
найдём координаты точки X (x,y,z)

если M - матрица 3х3 первая строка которой состоит из координат вектора N1, вторая строка которой состоит из координат вектора N2, третья строка которой состоит из координат вектора S
и L - вектор-столбец размером 3, первый элемент которого (<A1>*<N1>), второй элемент которого (<A2>*<N2>), третий элемент которого (<D>*<S>)
То ответом является вектор <X> = M^(-1) * L
где M^(-1) - матрица, обратная M.
следует отметить, что произведение матриц не комутативно, поэтому переставлять множители местами нельзя.
X и есть искомая точка.

Итого: Ищем <A1,B1>, <A1,C1>, <A2,B2>, <A2,C2>
ищем N1,N2,S проверяем на неравенство их 0
Формируем матрицу M, ищем вектор L
Ищем M^(-1) умножаем её на L
Получим результат.

Может не самый эффективный способ - первое, что в голову пришло


импортирован с progz.ru
Ответить с цитированием
  (#3 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 25.03.2007, 18:52

Прогресс очевиден - твои вопросы становятся всё более "корректными".


импортирован с progz.ru
Ответить с цитированием
  (#4 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 26.03.2007, 06:21

Спасибо, доктор, а когда меня уже выпишут?

Вот хороший совсем вопрос: как найти обратную матрицу?
Ответить с цитированием
  (#5 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 26.03.2007, 16:05

Мне объяснили, как найти обратную матрицу. Я жутко расстроился и скачал библиотеку NumPy, которая умеет ее вычислять сама. Способ проекции, предложенный тобой, работает. Не то чтобы я изначально очень сомневался, но оно ведь как - перепутаешь пару индексов, и потом недоищешься....
Давно уже собирался приспособить NumPy. Пойду домой с чувством выплаченного долга
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 26.03.2007, 18:40

Цитата:
Мне объяснили, как найти обратную матрицу. Я жутко расстроился и скачал
Чего это ты расстроился? Там ничего сложного вроде...
Цитата:
и скачал библиотеку NumPy,
На Питоне пишешь? Почему на нём? Ведь не самый быстрый язык, а у тебя графика..


импортирован с progz.ru
Ответить с цитированием
  (#7 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 26.03.2007, 20:21

Цитата:
Чего это ты расстроился? Там ничего сложного вроде...
Да нет, конечно.... знай себе определители считай....

Цитата:
На Питоне пишешь? Почему на нём? Ведь не самый быстрый язык, а у тебя графика..
Зато на нем быстро пишется, правится и переписывается. А когда код устаканивается - можно ради скорости исполнения уже один раз на С++ переписать.
Ответить с цитированием
  (#8 (permalink)) Старый
Kefircheg
Guest
 
Сообщений: n/a
По умолчанию 28.07.2009, 18:36

A,B - две точки прямой; C - проецируемая точка;
ABC - треугольник; CH - высота; H - проекция.

AB = B - A; BC = C - B; CA = A - C.
(обозначения: |v| = длина вектора v; m^2 = квадрат числа m)

|AH| = |AB|*x; |HB| = |AB| - |AB|*x; x = ?.

|CA|^2 - |AH|^2 = |CH|^2 = |BC|^2 - |HB|^2;

|CA|^2 - (|AB|*x)^2 = |BC|^2 - (|AB| - |AB|*x)^2;

x = (1 + (|CA|^2 - |BC|^2)/|AB|^2)/2;

H = A + AB*x.

Так помоему проще и быстрее чем с обратной матрицей...
Ответить с цитированием
  (#9 (permalink)) Старый
winamp winamp вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.08.2008
Talking 28.07.2009, 22:10

Код:
///input :
pt3d point_to_project;//point to project
pt3d pts[2][3];//plane definition points
...
plane p0(pts[0][0],pts[0][1],pts[0][2]);
plane p1(pts[1][0],pts[1][1],pts[1][2]);
line3d intersect;
if(p0.GetIntersect(intersect,p1))
{
    pt3d proj_point=intersect.PerpFrom(point_to_project);//output 
    
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать прямую ссылку на аудиопоток? medved1979 Любые вопросы от новичков 1 14.03.2012 19:57
BitBlt как нарисовать прямую линию ivan1994 WinAPI 2 01.05.2011 17:42
Трехмерная проекция Виктория8.11 Вопросы начинающих программистов 0 28.04.2011 17:59
Освещение и перспективная проекция D.I.N. Программирование графики 1 04.07.2009 15:32
Перспективная проекция в OGL D.I.N. Программирование графики 1 15.02.2009 14:56
Игра точки как написать массив который хранит точки wenom C++ Builder 6 07.03.2007 00:57
Нужно написать программу, результатом выполнения которой будет проекция гантели Shtudentka Lisp 1 04.01.2007 23:42
Как нарисовать точку и прямую в Visual C++ imported_Sharky Вопросы начинающих программистов 9 25.11.2005 10:23
Как соединить точки дугой точки Denalko Delphi 6 16.09.2005 22:10
Antialiasing как нарисовать прямую линую ReMY Программирование графики 0 20.12.2004 22:50
Как на прямую, оперировать с битами в числе типа int Rem Visual C++ 4 11.07.2004 23:19
Си и шина ISA как обращаться на прямую imported_zmey Железо. Написание драйверов 5 03.06.2004 17:33



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов