Построение перпендикуляра к данной прямой из данной точки вне данной прямой
Построение перпендикуляра к данной прямой из данной точки вне этой прямой. Даны прямая a и точка B вне этой прямой. Требуется построить луч CB, начинающийся на прямой a, проходящий через точку B и перпендикулярный прямой a. Для этого произвольным раствором циркуля проводим первую вспомогательную дугу окружности с центром в точке B и пересекающую прямую a в двух точках — D и E. Теперь произвольным раствором циркуля проводим вторую вспомогательную дугу окружности с центром в точке D и тем же раствором циркуля проводим третью вспомогательную дугу окружности с центром в точке E — так, что третья дуга пересекает вторую в некоторой точке F. Теперь соединяем эту точку F и данную точку B прямой, пересекающей данную прямую. Получившуюся точку пересечения называю C. Луч CB — и есть требуемый перпендикуляр. И вот почему: рассмотрим два треугольника — BDF и BEF. В этих треугольниках стороны BD и BE равны (потому что их откладывали одним и тем же раствором циркуля), стороны FD и FE тоже равны (потому что их тоже откладывали одним и тем же раствором циркуля), а сторона BF — общая. Значит, треугольники равны по третьему признаку, а это значит, что соответственные углы FBD и FBE в них равны. Следовательно, в равнобедренном треугольнике DBE отрезок CB является биссектрисой, а значит и высотой, то есть перпендикуляром. Построение закончено.
Перпендикуляр из точки на прямую
Из данной точки A, лежащей вне данной прямой l, при помощи только лишь циркуля и линейки опустить перпендикуляр на прямую l:

При этом нужно выполнить построение, проведя не более трёх линий (третьей линией должна быть искомая прямая).
Сначала проводим окружность произвольного радиуса, проходящую через точку A, с центром в произвольной точке O, лежащей на прямой l:

Затем проводим ещё одну окружность произвольного радиуса, проходящую через точку A, с центром в произвольной точке O’, лежащей на прямой l, которая пересекает первую окружность в точке B:

Искомая прямая проходит через точки A и B:
Тригонометрия: как найти перпендикуляр от точки в прямой
Ребята такой вопрос простой вопрос по тригонометрии
Как найти перпендикуляр от точки в прямой
есть вектор v`(x,y,z) — направление прямой
есть точка t(xt,yt,zt)
нужно найти точку пересечения прямой проходящей через данную точку и прямую прямые ортогональны
#1
13:08, 10 апр 2006
Про тригонометрию лучшеб ты не вспоминал, это аналлитическая геометрия.
Задай почеловечески вопрос а то вообще не понял что откуда и куда пересекаеться.
#2
13:13, 10 апр 2006
могу подсказать только длину перпендикуляра, если прямая задана двумя точками.
#3
13:36, 10 апр 2006
stim24
Напиши всё это вразумительно — может что и подскажем. А то математику на албанском я не понимаю.
#4
14:04, 10 апр 2006
вообщем пусть есть ландшафт
я мышкой задаю направление вектора (вектор идет от места положения камеры и проходит через точку проекции указанной мышкой на мониторе)
нужно определить какую точку(вершину) из ландшафта я выбрал т.к. точно на нее попасть практически не возможно нужно определить саму близ лежащию точку до места положения камеры и самое маленькое расстояние от точки до прямой проходящей через указанный вектор. расстояние найти не проблемма))). Как извесно самое минимальное расстояние
от точки до прямой это перпендикулял опщенный на прямую из данной точки. вот и хочу найти это расстояние перпендикуляра
mbait
скажи
#5
14:05, 10 апр 2006
Однозначно определить не получится. Перпендикуляр к прямой в 3D пространстве — это плоскость. Задача решается только на плоскости.
если прямая определена y = k1x+b1, то препендикулярная ей прямая (y = k2x + b2) будет иметь k2=-1/k1.
Если прямая проходит через точку (x0, y0), то
b2 = y0 — (k2*x0), т.е. окончательное уравнение результирующей прямой:
y = (-1/k1)*x + y0 + (1/k1)*x0.
Это работает для не горизонтальных и не вертикальных прямых.
Можно через векторный анализ.
причем тут тригонометрия? (это аналитическая геометрия)
#6
14:10, 10 апр 2006
да я чето тут загнул с тригонометрией.. )))))))) бывает этож простительно
#7
14:15, 10 апр 2006
>>Однозначно определить не получится. Перпендикуляр к прямой в 3D пространстве — это плоскость.
это кто тебе сказал?
#8
14:17, 10 апр 2006
>>это кто тебе сказал?
Sorry. Тут я погоречился, бвыает 🙂
Если исходная прямая определна направляющей V(A, B, C), то перпендикулярная плоскость
Ax + By + Cz + D = 0.
D находится подставляя вместо x, y, z значения tx, ty, tz
D = -A*tx — B*ty — C*tz
далее ищется точка пересечения прямой и плоскости (система из 3-х уравшений (базовый курс линейки)).
решение допустим : tx1, tx2, tx3
Искомый вектор (tx — tx1, ty1 — ty, tz1 — tz).
#9
14:20, 10 апр 2006
#10
14:20, 10 апр 2006
. опечатка : Искомый вектор (tx1- tx, ty1 — ty, tz1 — tz).
#11
14:25, 10 апр 2006
HamWallet
>Перпендикуляр к прямой в 3D пространстве — это плоскость.
Врете батенька вам на повторный курс мат аналитики. Если точка не лежит на прямой то всегда можно опустить перпендикуляр.
void Vector3d::Projection(const Vector3d &NVector,const Vector3d &PVector) < float k,sq; sq=NVector.x*NVector.x + NVector.y*NVector.y + NVector.z*NVector.z; if( sq!=0 ) < k=(NVector.x*PVector.x + NVector.y*PVector.y + NVector.z*PVector.z)/sq; x=k*NVector.x; y=k*NVector.y; z=k*NVector.z; >else < x=0; y=0; z=0; >>
думаю определит вектор из точки к прямой сумееш?
#12
14:52, 10 апр 2006
>далее ищется точка пересечения прямой и плоскости (система из 3-х уравшений (базовый курс линейки)).
Оно конечно можно решать и через плоскости и перпендикуляры, но это фигня. В печку.
Цитирую одно из определений скалярного произведения:
«Скалярным произведением двух векторов назывется число, равное произведению длины одного их этих векторов на проекцию другого вектора на ось, определяемую первым из указанных векторов»:
если b — это направляющий вектор (в твоём случае вектор зрения) единичной длины, то вектор проекции произвольной точки а на ось зрения будет
s = b*dot(a,b);
Соответственно |a — s| расстояние между точкой а и её проекцией на ось зрения.
—
правка — попытался яснее выразить вторую строчку. )
Перпендикуляр к прямой(2D)
В общем дана точка «C». И дана прямая, задаваемая точками «A» и «B».
Вопрос: как найти координаты точки, в которую опустится перпендикуляр из «C» на прямую «AB»? Естественно координаты A,B,C — нам известны.
#1
16:48, 27 ноя 2007
да. задачка совсем олимпиадная 🙂
из прямой AB получишь нормаль плоскости в которой лежит искомый перпендикуляр, эта плоскость проходит через точку С.
потом ищешь точку пересечения плоскости этой и прямой АВ.
#2
16:52, 27 ноя 2007
wawan
Забыл добавить — в двухмерном пространстве! 🙂
#3
17:33, 27 ноя 2007
каноническое уравнение прямой:
Его приводим к виду:
a*x+b*y+c=0
В нем, вектор с координатами (a,b) перпендикулярен прямой.
Отсюда, уравнение прямой, перпендикулярной данной, которая проходит через точку М(x3,y3) имеет вид:
#4
18:02, 27 ноя 2007
FlyNN
Фи. как никрасиво.. 🙂
remixx
>В общем дана точка «C». И дана прямая, задаваемая точками «A» и «B».
>Вопрос: как найти координаты точки, в которую опустится перпендикуляр из «C» на
>прямую «AB»? Естественно координаты A,B,C — нам известны.
нвходим точку D.
ABn = normalize(AB); — Нормализуем вектор AB
t = dot(ABn, C); — находим длину проекции ветора AC на вектор ABn.
D = t * ABn; — домножаем вектор ABn на длину проекции.
И все, точка найдена. Единственное, следует обратить внимание, что если t < 0 и больше length(AB) то перпендикуляр опустить не возможно.
И работает это для всех измерений. 😉
#5
19:12, 27 ноя 2007
Demiurg-HG
Cool! Спасибо
- Frankinshtein
- Постоялец
#6
23:19, 27 ноя 2007
Demiurg-HG
dir = A-B;
cross = (dir.y, -dir.x);
аа. тут еще есть точка С, тогда да))
#7
0:18, 29 ноя 2007
думаю не было такого ответа еще.
ax+b=y -уравнение прямой АБ
-ax+b1=y — перпендикуляр.
зная с можно найти b1
#8
0:41, 29 ноя 2007
ZhanZS, может, потому что это не правильный ответ? ))))))
#9
13:36, 29 ноя 2007
ZhanZS
Неверно.
ALL
Всем спасибо за проявленное внимание, все-таки нашел правильное решение. Вот рабочий вариант на Delphi:
function VDot(v1,v2:TVector):single; begin result:=(v1.X*v2.X+v1.Y*v2.Y); end; function VMul(v1:Tvector;A:single):TVector; begin result.X:=v1.X*A; result.Y:=v1.Y*A; end; function VSub(const v1,v2:TVector):TVector; begin result.X:=v1.X-v2.X; result.Y:=v1.Y-v2.Y; end; function VNorm(V:TVector):TVector; var vl:single; begin vl:=VLength(V); result.X:=V.X/vl; result.Y:=V.Y/vl; end; function VProject(A,B:TVector):TVector; begin A:=VNorm(A); result:=VMul(A,VDot(A,B)); end; function Perpendicular(A,B:TVector;C:TVector):TVector; var CA:TVector; begin CA:=VSub(C,A); result:=VSub(VProject(VSub(B,A),CA),CA); end;
Из всего этого бреда нужно юзать функцию «Perpendicular», где A,B — точки отрезка, С — точка, из которой опускать перпендикуляр. На выходе — искомый вектор из точки C.
Тип TVector я думаю понятен:
type TVector = record X,Y:extended; end;
Прошло более 2 лет
#10
15:53, 17 фев 2010
#11
16:21, 17 фев 2010
aw, jeez, нынешние «участники» ищут темы по проекции вектора на прямую..
#12
16:30, 17 фев 2010
Но нашел же, и все уже спроектировал. 11 Между прочим самое адекватное описание из поисковика.
P.S. уже не торт? прям как раз недавно писал: http://www.gamedev.ru/flame/forum/?id=129722
Прошло более 6 лет
- zhigarartem
- Постоялец
#13
18:11, 6 мар 2016
Недавно столкнулся с такой же проблемой, только в 3d, и решил её без векторов.
В основе решения лежат свойства треугольника и уравнение прямой:
x = x1 + t*(x2-x1);
y = y1 + t*(y2-y1);
z = z1 + t*(z2-z1);
Представим, что точки (x1,y1,z1), (x2,y2,z2) — основание треугольника,
а высота из точки (x3,y3,z3) — это наш перпендикуляр.
1. По трём точкам треугольника — рассчитаем длины сторон треугольника a, b, c.
2. Зная стороны — рассчитываем высоту h.
3. Рассмотрим два прямоугольных треугольника со сторонами a, h, c1 и b, h, c2
4. По формуле Пифагора — рассчитаем c1, c2.
5. Отношение с1/c и будет являться t в уравнении прямой, но тут важно учесть частный случай треугольника с тупым углом:
Т.к. тупой угол в треугольнике может быть только один, то мы выбираем более острый угол у основания, сравнивая отношения a/c и a/b
Если a/c > a/b то используем с1/с, иначе c2/c
////// Перпендикуляр из точки (x3,y3,z3) на прямую, проходящую через точки (x1,y1,z1), (x2,y2,z2). /// public static void Ortho(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, out double x, out double y, out double z) < // Длины отрезков. var c = Math.Sqrt(Math.Pow(x1-x2, 2) + Math.Pow(y1-y2, 2) + Math.Pow(z1-z2, 2)); var b = Math.Sqrt(Math.Pow(x2-x3, 2) + Math.Pow(y2-y3, 2) + Math.Pow(z2-z3, 2)); var a = Math.Sqrt(Math.Pow(x3-x1, 2) + Math.Pow(y3-y1, 2) + Math.Pow(z3-z1, 2)); // Полупериметр треугольника. var p = (a + b + c)/2; // Высота (длина перпендикуляра). var h = 2*Math.Sqrt(p*(p - a)*(p - b)*(p - c))/c; if (a/c >b/c) < var c1 = Math.Sqrt(a*a - h*h); var k = c1/c; x = x1 + k*(x2 - x1); y = y1 + k*(y2 - y1); z = z1 + k*(z2 - z1); >else < var c2 = Math.Sqrt(b*b - h*h); var k = c2/c; x = x2 + k*(x1 - x2); y = y2 + k*(y1 - y2); z = z2 + k*(z1 - z2); >>
На всякий случай прикрепил проект в visual studio 2010:
LineOrtho.7z
- >:+()___ [Smile]
- Постоялец
#14
20:48, 6 мар 2016
zhigarartem
> Недавно столкнулся с такой же проблемой, только в 3d, и решил её без векторов.
А теперь выкинь этот говнокод и выучи векторы.