25. Proste i płaszczyzny
Treści kształcenia: Podstawy geometrii analitycznej. Podstawy rachunku wektorów i ich zastosowania. Równania prostych i powierzchni. Równanie prostej - postać kierunkowa i ogólna, warunek równoległości i prostopadłości prostych, odległość dwóch punktów i punktu od prostej, równanie okręgu. Krzywe i powierzchnie zadane parametrycznie.
Efekty kształcenia: Potrafi wykorzystać rachunek wektorowy w odniesieniu do obiektów geometrycznych. Operuje równaniami w opisach geometrycznych.
Równania prostej na płaszczyźnie¶
Przedstawimy teraz kilka sposobów opisu prostych na płaszczyźnie. Dobre zrozumienie tych metod pomoże nam przy rozpatrywaniu bardziej zaawansowanych obiektów geometrycznych, np. prostych w przestrzeni.
Równaniem kierunkowym prostej na płaszczyźnie nazywamy równanie:
W równaniu tym liczbę nazywamy współczynnikiem kierunkowym, zaś liczbę wyrazem wolnym.
Dwie proste oraz są równoległe wtedy i tylko wtedy, gdy oraz prostopadłe wtedy i tylko wtedy, gdy .
Zauważmy jednak, że nie każda prosta ma równanie kierunkowe. Dzieje się tak w przypadku prostych równoległych do osi OY. Mają one równania postaci i nie są wykresem żadnej funkcji. Pozostałe proste mają dokładnie jedno równanie kierunkowe. Z tego powodu mówi się również o równaniu ogólnym prostej:
gdzie . Każda prosta ma równanie ogólne, jednak nie jest ono jednoznacznie wyznaczone (zawsze można je pomnożyć przez stałą).
Opiszemy teraz równanie parametryczne prostej. Zauważmy, że jeżeli nasza prosta przechodzi przez , to powstaje ona przez skalowanie pewnego wektora :
# Ilustracja - wielokrotności wketora tworzą prostą
w = vector((1, 2))
eps = vector((0.2, 0)) #wektor pomocniczy korygujący tekst
image = ((2*w).plot(color = "red")) + text("2w", tuple(2*w+eps), fontsize = 20, color = 'black')
image += w.plot() + text("w", tuple(w+eps), fontsize = 20, color = 'black')
image += ((-4*w).plot(color = "orange")) + text("-4w", tuple(-4*w+eps), fontsize = 20, color = 'black')
image += ((-3*w).plot(color = "green")) + text("-3w", tuple(-3*w+eps), fontsize = 20, color = 'black')
image += ((-1.7*w).plot(color = "yellow")) + text("-1.7 w", tuple(-1.7*w+eps), fontsize = 20, color = 'black')
image.show()
W ogólnym przypadku, możemy najpierw rozważyć wektor z punktu do dowolnego punktu na prostej, a potem “poruszać” się po prostej skalując wektor . Za wektor można przyjąć wektor pomiędzy dowolnymi dwoma różnymi punktami na prostej.
Podsumowując, prosta jest zadana jako zbiór punktów , czyli (jeżeli , zaś ):
Przykład - równanie parametryczne prostej na płaszczyźnie¶
Znajdź równanie kanoniczne i parametryczne prostej:
(a) ,
(b) .
Przykładowa odpowiedź do podpunktu (a):
(wektor , wektor , czyli wektor między a )
Przykładowa odpowiedź do podpunktu (b):
(wektor , wektor to wektor między a )
def prosta_parametrycznie(t):
var('x')
p = parametric_plot((-1 + x, 4 + 2*x), (x, -10, 10), color = "red")
p += arrow((-1, 4), (-1 + t, 4 + 2*t))
p += plot(vector((-1, 4)))
return p
@interact
def _(t = slider(-3, 3, 0.1)):
prosta_parametrycznie(t).show(ymin = -10, ymax = 10, xmin = -10, xmax = 10)
aplet = [prosta_parametrycznie(t0) + text("t = %s"%(t0), (5, 5)) for t0 in [-5, -2, 2, 5]]# Wersja statyczna powyższego apletu.
g1=graphics_array(aplet,ncols=4)
g1.show(figsize=[10,10], aspect_ratio = 1)
Równania płaszczyzny¶
Dowolna płaszczyzna zadana jest równaniem ogólnym , gdzie . Na równanie to można patrzeć w następujący sposób. Niech będzie dowolnym punktem na płaszczyźnie . Wtedy , czyli
gdzie , zaś jest wektorem łączącym punkt z dowolnym punktem na płaszczyźnie . Zatem jest wektorem prostopadłym do dowolnego wektora leżącego na płaszczyźnie! Wektor ten nazywamy wektorem normalnym płaszczyzny . Dowolny inny wektor prostopadły do płaszczyzny jest wielokrotnością wektora .
# Ilustracja wektora normalnego.
var('x', 'y', 'z')
a = plot3d(4-(x+y), (x, -2, 2), (y, -2, 2), opacity = 0.80)
a += arrow3d((0, 0, 0), (1, 1, 1), color = "black", width = 4)
a.show()
# Wersja statyczna.
a = a.rotate((0, 1, 0),pi/2)
a.show(viewer = 'tachyon')
Opowiemy teraz o równaniu parametrycznym płaszczyzny. Tym razem będziemy potrzebowali dwóch parametrów do opisu płaszczyzny, jako że jest ona dwuwymiarowa. O parametrach można myśleć jako o ,,współrzędnych’’ na płaszczyźnie. Niech będzie wektorem z punktu do dowolnego punktu na płaszczyźnie . Wybierzmy również dwa wektory leżące na płaszczyźnie , z których żaden nie jest wielokrotnością drugiego. Wtedy dowolny punkt na płaszczyźnie można uzyskać jako dla pewnych liczb . Przykład można zobaczyć na poniższym aplecie - gdy zmieniamy parametry , , punkt (koniec czarnego wektora) może być dowolnym punktem na płaszczyźnie.
# Równanie parametryczne - aplet ilustrujący
def parametrycznie(t1, t2):
var('x', 'y', 'z')
a = plot3d(4-(x+y), (x, -5, 5), (y, -5, 5), opacity = 0.80)
a += arrow3d((0, 0, 0), (1, 2, 1), color = "orange", width = 4)
a += text3d("v", (1-1, 2-0.5, 1-0.5), color = "orange", fontsize = 20)
a += arrow3d((1, 2, 1), (1+t1, 2+t1, 1-2*t1), color = "red", width = 4)
a += text3d("t1*v1", (1+t1, 2+t1, 1-2*t1), color = "red", fontsize = 20)
a += arrow3d((1, 2, 1), (1-2*t2, 2+t2, 1+t2), color = "yellow", width = 4)
a += text3d("t2*v2", (1-2*t2, 2+t2, 1+t2), color = "yellow", fontsize = 20)
a += arrow3d((1, 2, 1), (1+t1-2*t2, 2+t1+t2, 1-2*t1+t2), color = "black", width = 4)
a += text3d("P", (1+t1-2*t2 + 0.5, 2+t1+t2 + 0.5, 1-2*t1+t2 + 0.2), color = "black", fontsize = 20)
return a
@interact
def _(t1 = slider(-4, 4, 1, default = -1), t2 = slider(-4, 4, 1, default = 1)):
parametrycznie(t1, t2).show(box = False)# Wersja statyczna powyższego apletu.
t1 = 1
for t2 in [1, 2, 3]:
print("t1 = %s, t2 = %s"%(t1, t2))
parametrycznie(t1, t2).show(box = False, viewer = 'tachyon')t1 = 1, t2 = 1

t1 = 1, t2 = 2

t1 = 1, t2 = 3

Przykład - różne równania płaszczyzny¶
Znajdź równanie parametryczne i ogólne płaszczyzny przechodzącej przez punkty , oraz . Czy punkt należy do ? Jeżeli tak, znajdź odpowiadające mu wartości parametrów oraz .
Rozwiązanie: Niech , , . Wtedy równanie parametryczne tej płaszczyzny to , czyli
Aby sprawdzić, czy , rozwiązujemy układ równań:
# Rozwiązanie układu równań.
var('t1, t2')
solve([[-4 == 1 -2 * t1 + t2], [3 == 2 + t1 + t2], [5 == 1 + t1 - 2 * t2]], [t1, t2])[[t1 == 2, t2 == -1]]Aby znaleźć równanie ogólne, możemy np. rozwiązać następujący układ:
#Rozwiązanie układu równań
var('a, b, c, d')
A = (1, 2, 1)
B = (-1, 3, 2)
C = (2, 3, -1)
punkty = [A, B, C]
solve([[a*P[0] + b*P[1] + c*P[2] == d] for P in punkty], [a, b, c, d])
#Układ ten ma nieskończenie wiele rozwiązań, jego rozwiązania zależą od parametru c1768 (lub inna duża liczba - Sage ma dziwną numerację).
#Wystarczy zatem wstawić za c1768 dowolną niezerową liczbę.[[a == c2022, b == c2022, c == c2022, d == 4*c2022]]Przykład - równoległość i prostopadłość płaszczyzn¶
Dla jakich wartości parametru płaszczyzny i są równoległe? Dla jakich wartości są one prostopadłe?
Rozwiązanie: Wektory normalne do danych płaszczyzn są równe odpowiednio: oraz . Płaszczyzny te będą równoległe, jeżeli wektor będzie wielokrotnością wektora . Musi zatem zachodzić:
Z drugiego równania dostajemy , zaś z trzeciego , zatem .
Aby płaszczyzny były prostopadłe, ich wektory normalne muszą być prostopadłe, tzn. . To daje nam równość:
Sprawdźmy nasze wyniki za pomocą Sage’a.
# Płaszczyzny narysowane dla alpha = -1
H.<x,y,z> = HyperplaneArrangements(QQ)
alpha0 = -1
p0 = alpha0*x + y - alpha0^2*z + 1
q0 = x + alpha0*y + z - alpha0
print(p0.normal(), q0.normal())
obrazek = p0.plot() + q0.plot(color = "red")
obrazek = obrazek.rotate((0,0,1),pi/4)
obrazek.show()
obrazek.show(viewer = 'tachyon')(-1, 1, -1) (1, -1, 1)

# GRAFIKA 3D
# Płaszczyzny narysowane dla alpha = 0
H.<x,y,z> = HyperplaneArrangements(QQ)
alpha0 = 0
p0 = alpha0*x + y - alpha0^2*z + 1
q0 = x + alpha0*y + z - alpha0
obrazek = p0.plot() + q0.plot(color = "red")
obrazek.show()
obrazek.show(viewer = 'tachyon')
#Grafika 3D
# Płaszczyzny narysowane dla alpha = 2
H.<x,y,z> = HyperplaneArrangements(QQ)
alpha0 = 2
p0 = alpha0*x + y - alpha0^2*z + 1
q0 = x + alpha0*y + z - alpha0
obrazek = p0.plot() + q0.plot(color = "red")
obrazek = obrazek.rotate((0, 1, 0),3*pi/4)
obrazek.show()
obrazek.show(viewer='tachyon')
Proste w przestrzeni¶
Aby opisać prostą w przestrzeni, możemy użyć postaci parametrycznej tak, jak na płaszczyźnie. Prosta to wówczas zbiór punktów postaci:
dla pewnych wektorów , . Wektor nazywamy wektorem kierunkowym prostej. Jeżeli , , to zmienne można opisać równaniami:
Obliczając z powyższych równań, dostajemy tzw. postać kierunkową prostej:
Uwaga: zauważmy, że liczby mogą być zerowe. Czasem przyjmuje się wtedy konwencję zapisywania ułamka z zerowym mianownikiem w postaci kierunkowej.
Przykład - punkty na prostej w przestrzeni¶
Czy prosta o równaniu , , przechodzi przez punkty , ?
# Definiujemy x, y, z jako wyrażenia zmiennej t
var('t')
x = 2-t
y = -3+2*t
z = 1+t
# Dla danego punktu sprawdzamy, czy znajdziemy odpowiednie t.
pt = (1, -1, 4)
print(solve([[x == pt[0]], [y == pt[1]], [z == pt[2]]], [t]))
# Sprawdzenie dla drugiego punktu.
pt = (0, 1, 3)
print(solve([[x == pt[0]], [y == pt[1]], [z == pt[2]]], [t]))[
]
[
[t == 2]
]
Postać krawędziowa prostej¶
Innym sposobem opisu prostej jest podanie dwóch płaszczyzn, na przecięciu których leży. Prosta jest wówczas opisana układem równań:
Jest to tak zwana postać krawędziowa. Zauważmy, że można znaleźć nieskończenie wiele takich par płaszczyzn.
Przykład - postać krawędziowa prostej¶
Znajdź postać krawędziową prostej o równaniu , , .
Sposób I: Wybierzmy dowolne dwa punkty na prostej, np. (powstałe przez wstawienie ) oraz (powstałe przez wstawienie ) oraz dwa dowolne punkty poza prostą, np. oraz . Wtedy prosta jest przecięciem płaszczyzn ABC oraz ABD (o ile tylko te płaszczyzny nie są sobie równe).
#Wybieramy punkt A na prostej odpowiadający np. parametrowi t0 = 0
t0 = 0
A = (2 - t0, -3 + 2*t0, 1+t0)
#Wybieramy punkt B na prostej odpowiadający np. parametrowi t0 = 1
t1 = 1
B = (2 - t1, -3 + 2*t1, 1+t1)
#Wybieramy dowolne dwa punkty poza prostą.
C = (0, 0, 0)
D = (1, 1, 1)
#Znajdziemy teraz płaszczyznę przechodzącą przez punkty A, B, C.
#W tym celu rozwiążemy układ równań.
a, b, c, d = var ('a, b, c, d')
punkty = [A, B, C]
plaszczyzna = solve ([a*pt[0] + b*pt[1] + c*pt[2] == d for pt in punkty], [a, b, c, d])
print(plaszczyzna)
r = plaszczyzna[0][0].rhs().variables()[0]
a0 = plaszczyzna[0][0].rhs().substitute({r:1})
b0 = plaszczyzna[0][1].rhs().substitute({r:1})
c0 = plaszczyzna[0][2].rhs().substitute({r:1})
d0 = plaszczyzna[0][3].rhs().substitute({r:1})
print("Równanie pierwszej płaszczyzny to:", "%s x + %s y + %s z = %s"%(a0, b0, c0, d0))
#Znajdziemy teraz płaszczyznę przechodzącą przez punkty A, B, D.
#W tym celu rozwiążemy układ równań.
a, b, c, d = var ('a, b, c, d')
punkty = [A, B, D]
plaszczyzna2 = solve ([a*pt[0] + b*pt[1] + c*pt[2] == d for pt in punkty], [a, b, c, d])
print(plaszczyzna2)
r = plaszczyzna2[0][0].rhs().variables()[0]
a1 = plaszczyzna2[0][0].rhs().substitute({r:1})
b1 = plaszczyzna2[0][1].rhs().substitute({r:1})
c1 = plaszczyzna2[0][2].rhs().substitute({r:1})
d1 = plaszczyzna2[0][3].rhs().substitute({r:1})
print("Równanie drugiej płaszczyzny to:", "%s x + %s y + %s z = %s"%(a1, b1, c1, d1))
#GRAFIKA 3D
#Rysujemy płaszczyzny:
H.<x,y,z> = HyperplaneArrangements(QQ)
a0, b0, c0, d0 = QQ(a0), QQ(b0), QQ(c0), QQ(d0)
a1, b1, c1, d1 = QQ(a1), QQ(b1), QQ(c1), QQ(d1)
h1 = a0*x+b0*y+c0*z-d0
h2 = a1*x+b1*y+c1*z-d1
rysunek = h1.plot() + h2.plot(color = "red")
rysunek += parametric_plot3d((2 - t, -3 + 2*t, 1+t), (t, -10, 10), color = "yellow")
rysunek.show(aspect_ratio=1)[
[a == r5, b == 3/5*r5, c == -1/5*r5, d == 0]
]
Równanie pierwszej płaszczyzny to: 1 x + 3/5 y + -1/5 z = 0
[
[a == 4/7*r6, b == 1/7*r6, c == 2/7*r6, d == r6]
]
Równanie drugiej płaszczyzny to: 4/7 x + 1/7 y + 2/7 z = 1
# Wersja statyczna
rysunek.show(aspect_ratio=1, viewer = 'tachyon')
Sposób II: dodajemy do siebie wielokrotności zmiennych x, y, z w taki sposób, żeby zlikwidować zmienną . Przykładowo oraz . Równania te zadają żądane płaszczyzny. Sprawdźmy, że prosta rzeczywiście leży na obu płaszczyznach.
#Definiujemy x, y, z jako wyrażenia zmiennej t i sprawdzamy, czy odpowiednie rónanie się wyzeruje
var('t')
x = 2 - t
y = -3 + 2*t
z = 1 + t
print(2*x + y - 1)
print(y - 2*z + 5)0
0
Sposób III: postać kierunkowa tej prostej to: . Zatem przykładowe dwie płaszczyzny to: (czyli ) oraz (tzn. ).
Wzajemne położenie prostych i płaszczyzn w przestrzeni¶
Jeżeli dwie proste nie leżą na jednej płaszczyźnie, mówimy, że są skośne. Proste, które leżą na jednej płaszczyźnie albo przecinają się w dokładnie jednym punkcie, albo są równoległe. Dwie proste są równoległe wtedy i tylko wtedy, gdy ich wektory kierunkowe są równoległe.
Dowolne dwie płaszczyzny są albo równoległe, albo przecinają się w pewnej prostej. Płaszczyzny są równoległe wtedy i tylko wtedy, gdy ich wektory normalne są równoległe.
Przykład - położenie prostych¶
Czy proste oraz są do siebie równoległe, skośne, czy przecinają się w jednym punkcie? Zakładamy, że są one dane przez:
(a) , , () oraz , , ()
(b) , , () oraz , , ()
(c) , , () oraz , , ()
# Aby znaleźć punkty wspólne, należy rozwiązać układ równań.
#(a)
var('s, t')
print(solve([[1 == 1 - s], [t == 2+s], [2 - t == 1 + 2*s]], [s, t]))
#(b)
var('s, t')
print(solve([[t-2 == s+1], [t+2 == 2*s+7], [2*t + 2 == -2*s]], [s, t]))
#(c)
var('s, t')
print(solve([[1 == 3], [t == 4 - 2*s], [2 - t == -1 + 2*s]], [s, t]))[
]
[
[s == -2, t == 1]
]
[
]
Z powyższych obliczeń wynika, że tylko w podpunkcie (b) proste przecinają się w jednym punkcie. Aby sprawdzić, czy proste z podpunktów (a) oraz (c) są równoległe, czy też skośne, musimy sprawdzić, czy ich wektory kierunkowe są równoległe.
(a) Prosta zadana jest jako: , zatem wektor kierunkowy to . Podobnie, wektor kierunkowy prostej to . Wektory te nie są równoległe, zatem proste te są skośne.
(c) Wektory kierunkowe tych prostych to oraz . Są one równoległe, zatem proste te również są równoległe.
Przykład - wzajemne położenie prostej i płaszczyzny¶
Czy prosta o równaniu , , leży na płaszczyźnie:
(a) ,
(b) ?
#Sprawdzamy, czy x, y, z zadane jako wyrażenia zmiennej t spełniają dane równanie płaszczyzny
var('t')
x = 2-t
y = -3+2*t
z = 1+t
print("(a):", (x - 2*y + 3*z - 9).is_trivial_zero())
print("(b):", (3*x + 2*y -z + 1).is_trivial_zero())(a): False
(b): True
Przykład - płaszczyzna przecinająca inną pod kątem prostym¶
Wyznaczyć równanie ogólne i parametryczne płaszczyzny, która przecina płaszczyznę
pod kątem prostym, a częścią wspólną tych płaszczyzn jest prosta , , .
Rozwiązanie: niech płaszczyzna ta będzie dana równaniem . Wektor normalny płaszczyzny musi być prostopadły do , zatem
Ponadto, aby prosta leżała na płaszczyźnie:
czyli (porównując wyrazy wolne oraz współczynnik przy ) oraz . Rozwiążmy ten układ równań:
# Rozwiązujemy układ równań
var('a, b, c, d')
abcd = solve([[2*a + 3*b - c == 0], [a - b + 2*c == d], [-a+b +c == 0]], [a, b, c, d])
#abcd to lista rozwiązań. Jest ich nieskończenie wiele, zależą od parametru
r = abcd[0][0].rhs().variables()[0]
a1 = abcd[0][0].rhs().substitute({r:1})
b1 = abcd[0][1].rhs().substitute({r:1})
c1 = abcd[0][2].rhs().substitute({r:1})
d1 = abcd[0][3].rhs().substitute({r:1})
print("Równanie płaszczyzny to: %s x + %s y + %s z = %d"%(a1, b1, c1, d1))
####
# GRAFIKA 3D
# Rysujemy płaszczyzny
H.<x,y,z> = HyperplaneArrangements(QQ)
h0 = 2*x + 3*y - z + 3
h = QQ(a1)*x + QQ(b1)*y+QQ(c1)*z - QQ(d1)
rysunek = h0.plot(color = "red") + h.plot()
var('t')
rysunek += parametric_plot3d([1-t, t-1, t+2], [t, -10, 10], color = "yellow", boundary_style={"thickness": 5})
rysunek.show()
rysunek.show(viewer = 'tachyon')Równanie płaszczyzny to: 1 x + -1/4 y + 5/4 z = 3

Zadania dodatkowe¶
Zadanie nr 1¶
Znajdź równanie parametryczne prostej przechodzącej przez punkty oraz .
Zadanie nr 3¶
Dane są dwie proste: i . Czy proste te leżą na jednej płaszczyźnie? Jeżeli tak, to wyznacz równanie ogólne tej płaszczyzny.