(1) Prosta jako przecięcie dwóch płaszczyzn

A1={A1x,A1y,A1z};

A2={A2x,A2y,A2z};

r1={r1x,r1y,r1z};

r2={r2x,r2y,r2z};

r={x,y,z};

w1=A1.(r-r1)==0

w2=A2.(r-r2)==0

w3=A1\[Cross]A2≠{0,0,0}

s1=Simplify[Solve[{w1,w2,w3},r]]

(* Nie można uzyskać jednoznacznego rozwiązania na (x,y,z), bo prosta zawiera nieskończenie wiele punktów ! *)

(* Ta postać rozwiązania ma sens, gdy składowa x wektora A1 x A2 jest różna od zera *)

s1=Simplify[Solve[{w1,w2,w3},{y,z}]]

(* Ta postać rozwiązania ma sens, gdy składowa y wektora A1 x A2 jest różna od zera *)

s2=Simplify[Solve[{w1,w2,w3},{x,z}]]

(* Ta postać rozwiązania ma sens, gdy składowa z wektora A1 x A2 jest różna od zera *)

s3=Simplify[Solve[{w1,w2,w3},{x,y}]]

(* Jeden z poniższych sposobow określenia prostej musi byc możliwy ze względu na warunek w3, że A1 x A2 jest wektorem niezerowym  *)

prosta1={x,y,z}/.s1[[1]]

prosta2={x,y,z}/.s2[[1]]

prosta3={x,y,z}/.s3[[1]]

(2) Prosta określona przez wektor równoległy do prostej i punkt należący do prostej

B={Bx,By,Bz};

r3={r3x,r3y,r3z};

w=B\[Cross](r-r3)=={0,0,0}

sol1=Solve[w,r]

sol1=Solve[w,{y,z}]

sol2=Solve[w,{x,z}]

sol3=Solve[w,{x,y}]

(* Przejście (1) -> (2) *)

(* wektor równolegly do prostej *)

BB=A1\[Cross]A2

(* punkt należący do prostej *)

rr3=prosta1/.{x->1}

ww=FullSimplify[BB\[Cross](r-rr3)=={0,0,0}]

(* Sprawdzam równoważność trzech warunków na prostą *)

Simplify[Solve[ww,{y,z}]==s1]

Simplify[Solve[ww,{x,z}]==s2]

Simplify[Solve[ww,{x,y}]==s3]

(* Oznacza to, że w każdym przypadku otrzymuję zgodność ! *)

(4) Prosta przechodząca przez dwa różne punkty

r5={r5x,r5y,r5z};

r6={r6x,r6y,r6z};

(* wektor równoległy do prostej *)

BBB=r6-r5;

(* wektor wodzący punktu należącego do prostej: r5 lub r6; ja wybieram r5 *)

rrr3=r5;

www=FullSimplify[BBB\[Cross](r-rrr3)=={0,0,0}]

(* Punkty są różne, więc jeden z trzech poniższych przepisów musi być poprawny *)

ssol1=Solve[www,{y,z}]

ssol2=Solve[www,{x,z}]

ssol3=Solve[www,{x,y}]

(* Przejście (2) -> (4). Biorę przepisy wynikające z (2), dokładniej mówiąc sol1 i sol2, i produkuję dwa punkty  *)

sol1

rr5={x,y,z}/.sol1[[1]]

rr5=rr5/.{x->3}

sol2

rr6={x,y,z}/.sol2[[1]]

rr6=rr6/.{y->-1}

BBBB=rr6-rr5

wwww=FullSimplify[BBBB\[Cross](r-rr5)=={0,0,0}]

(* Sprawdzam równowazność tego przepisu z formułą dawaną przez (2) *)

Simplify[Solve[wwww,{y,z}]==sol1]

Simplify[Solve[wwww,{x,z}]==sol2]

Simplify[Solve[wwww,{x,y}]==sol3]

(3) Prosta zadana w postaci parametrycznej -> postać równoważna (2):
x= r3x + Bx*t;
y=r3y + By*t;
z=r3z + Bz*t,
gdzie t jest dowolną liczbą rzeczywistą.

Przykład liczbowy

(* Przepis (1) -> przecięcie się dwóch płaszczyzn zdefiniowanych przez wektory prostopadłe do płaszczyzn i punkty należące do płaszczyzn *)

{A1x,A1y,A1z}={1,2,3};

{A2x,A2y,A2z}={-1,0,4};

{r1x,r1y,r1z}={2,3,3};

{r2x,r2y,r2z}={-4,10,6};

Simplify[s1[[1]]]

(* Przepis (2) -> wektor równoległy do prostej oraz punkt, który należy do prostej *)

BB

rr3

ww

l=Simplify[Solve[ww,{y,z}]]

(* Przepis (3) wynika wprost z przepisu (2), gdyż mam już dany wektor równolegly do prostej i punkt, który należy do prostej *)

rrr[t_]=rr3 + t*BB

(* Teraz mogę sprawdzić, że dla dowolnego t rzeczywistego, współrzędne wektora rrr[t] spełniają równanie prostej *)

w1

w2

Simplify[w1/.{x->rrr[t][[1]],y->rrr[t][[2]],z->rrr[t][[3]]}]

Simplify[w2/.{x->rrr[t][[1]],y->rrr[t][[2]],z->rrr[t][[3]]}]

(* Rzeczywiście, oba równania definiują prostą, czyli w1 i w2, są spełnione ! *)

(* Przepis (4) -> dwa punkty, przez które prosta przechodzi *)

r5={x,y,z}/.l[[1]]

r5=r5/.{x->3}

r6=r/.l[[1]]

r6=r6/.{x->-3}

BBB=r6-r5

www=FullSimplify[BBB\[Cross](r-r5)=={0,0,0}]

ll=Simplify[Solve[www,{y,z}]]

ll[[1]]

r/.ll[[1]]

(* Wszystkie przepisy opisują tę samą prostą ! *)

p1=ParametricPlot3D[r/.ll[[1]],{x,-3,3},AxesLabel->{"x","y","z"}]

r5+BBB*t

(* teraz rysunek, gdy parametrem jest t. Zakres t jest tak dobrany, aby rysunki były identyczne *)

p2=ParametricPlot3D[r5+BBB*t,{t,0,1},AxesLabel->{"x","y","z"}]

Show[p1,p2]