Ovdje su pokazane neke implementirane naredbe u sympy modulu vezane uz geometriju trodimenzionalnog prostora.
import platform
platform.platform()
platform.python_version()
from sympy import *
init_printing()
A=Point3D(1,-2,7)
B=Point3D(9,1,-5)
A+B
A.scale(2,5,-3)
A.dot(B)
A=Point3D(2,3,1)
B=Point3D(-4,2,5)
B.x
B.y
B.z
Vektor $\overrightarrow{AB}$
A.direction_ratio(B)
A=Point3D(1,3,-2)
B=Point3D(6,-9,1)
A,B
Egzaktna udaljenost
d=A.distance(B)
d
Udaljenost na 15 znamenaka (default)
N(d)
Udaljenost na 50 znamenaka
N(d,50)
A=Point3D(1,2,3)
B=Point3D(4,0,-5)
C=Point3D(37/16,9/8,-1/2)
D=Point3D(0,-3,2/3)
C
C.evalf()
Točke $A,$ $B$ i $C$ su kolinearne.
Point3D.are_collinear(A,B,C)
Točke $A,$ $B$ i $D$ nisu kolinearne.
Point3D.are_collinear(A,B,D)
Točke $A,$ $B,$ $C$ i $D$ nisu kolinearne.
Point3D.are_collinear(A,B,C,D)
A=Point3D(0,1,-1)
B=Point3D(3,0,-2)
C=Point3D(1,1,-2)
D=Point3D(0,0,1)
E=Point3D(5,4,3)
Točke $A,$ $B,$ $C$ i $D$ su komplanarne.
Point3D.are_coplanar(A,B,C,D)
Točke $A,$ $B,$ $C$ i $E$ nisu komplanarne.
Point3D.are_coplanar(A,B,C,E)
Točke $A,$ $B,$ $C,$ $D$ i $E$ nisu komplanarne.
Point3D.are_coplanar(A,B,C,D,E)
A=Point3D(1,-2,3)
O=Point3D(0,0,0)
O.direction_cosine(A)
A=Point3D(1,4,-2)
B=Point3D(0,-2,1)
A.direction_cosine(B)
rav=Plane(Point3D(1,2,1),(-2,3,-1))
rav
rav.p1
rav.normal_vector
Opći oblik jednadžbe ravnine
rav.equation()
Neka slučajna točka u ravnini
ranT=rav.random_point()
ranT
Koordinate slučajne točke zaokružene na 5 znamenaka
ranT.n(5)
Neka druga slučajna točka u ravnini
ranT2=rav.random_point(seed=41)
ranT2.n(5)
Parametarske jednadžbe ravnine
u,v=var('u v')
par=rav.arbitrary_point(u,v)
par
Točka u ravnini koja se dobije za $u=2,$ $v=1$
Tp=par.subs({u:2,v:1})
Tp
Dobivanje parametara za danu točku koja leži u ravnini
rav.parameter_value(Tp,u,v)
T1=Point3D(1,2,1)
T2=Point3D(-1,0,3)
T3=Point3D(-2,-1,5)
rav=Plane(T1,T2,T3)
rav
rav.normal_vector
rav.p1
Opći oblik jednadžbe ravnine
rav.equation()
Parametarske jednadžbe ravnine
par=rav.arbitrary_point(u,v)
par
Točka u ravnini koja se dobije za $u=3,$ $v=-5$
Tp=par.subs({u:3,v:5})
Tp
Dobivanje parametara za danu točku koja leži u ravnini
rav.parameter_value(Tp,u,v)
točka: $T(1,-2,4)$ ravnina: $2x-y+3z-10=0$
rav=Plane(Point3D(5,0,0),(2,-1,3))
T=Point3D(1,-2,4)
d=rav.distance(T)
d
N(d)
Točka $T$ ne leži u zadanoj ravnini.
rav.is_coplanar(T)
$\pi_1\dotsc 2x+3y-4z+5=0\qquad$ $\pi_2\dotsc x-2y+2z-1=0$
rav1=Plane(Point3D(-5/2,0,0),(2,3,-4))
rav2=Plane(Point3D(1,0,0),(1,-2,2))
kut između normali
kut1=rav1.angle_between(rav2)
kut1
kut između normali u radijanima
kr=N(kut1)
kr
kut između normali u stupnjevima
ks=N(kut1*180/pi)
kut između ravnina u stupnjevima
180-ks
kut između ravnina u radijanima
N(pi-kr)
Ravnine nisu paralelne niti okomite.
rav1.is_parallel(rav2)
rav1.is_perpendicular(rav2)
Ravnine su različite.
rav1.is_coplanar(rav2)
Ravnine se sijeku po pravcu koji prolazi točkama $T_1(-1,-1,0)$ i $T_2(-3,-9,-7)$.
rav1.intersection(rav2)
točka: $M(1,2,3)$ ravnina: $2x+y-z-13=0$
rav=Plane(Point3D(7,0,1),(2,1,-1))
M=Point3D(1,2,3)
S=rav.projection(M)
S
Simetrična točka točke $M$ s obzirom na zadanu ravninu.
S+M.direction_ratio(S)
točka: $T(1,-2,7)$ ravnina: $2x+3y-5z+10=0$
rav=Plane(Point3D(-5,0,0),(2,3,-5))
T=Point3D(1,-2,7)
rav_par=rav.parallel_plane(T)
rav_par
rav_par.equation()
točke: $T_1(1,0,-1),\,$ $T_2(0,2,5)$ ravnina: $2x+y-5z+6=0$
rav=Plane(Point3D(-3,0,0),(2,1,-5))
T1=Point3D(1,0,-1)
T2=Point3D(0,2,5)
rav_perp=rav.perpendicular_plane(T1,T2)
rav_perp
rav_perp.equation()
Ravnine $2x-y+3z-5=0,$ $x+y-z+1=0$ i $3x+2y-4z-3=0$ ne pripadaju istom pramenu.
rav1=Plane(Point3D(0,-5,0),(2,-1,3))
rav2=Plane(Point3D(0,0,1),(1,1,-1))
rav3=Plane(Point3D(1,0,0),(3,2,-4))
Plane.are_concurrent(rav1,rav2,rav3)
A=Point3D(2,3,-1)
B=Point3D(1,0,8)
pravac=Line3D(A,B)
pravac
pravac.p1
pravac.p2
vektor smjera pravca
pravac.direction
pravac.direction_ratio
Pripadni jedinični vektor smjera pravca
pravac.direction_cosine
Pravac prikazan kao presjek dvije ravnine
pravac.equation()
Neka slučajna točka na pravcu
ranT=pravac.random_point()
ranT
Koordinate slučajne točke zaokružene na 5 znamenaka
ranT.n(5)
Neka druga slučajna točka na pravcu
ranT2=pravac.random_point(32)
ranT2.n(5)
Parametarske jednadžbe pravca
par=pravac.arbitrary_point(u)
par
Točka na pravcu koja se dobije za $u=-2$
Tp=par.subs({u:-2})
Tp
Dobivanje parametra za danu točku koja leži na pravcu
pravac.parameter_value(Tp,u)
točka: $T(2,1,3)$ pravac: $\frac{x-1}{1}=\frac{y-1}{2}=\frac{z-1}{3}$
pravac=Line3D(Point3D(1,1,1),Point3D(0,-1,-2))
T=Point3D(2,1,3)
d=pravac.distance(T)
d
N(d)
Točka $T$ ne leži na zadanom pravcu.
pravac.contains(T)
$p_1\dotsc\dfrac{x-1}{8}=\dfrac{y+2}{-3}=\dfrac{z+1}{1},\qquad p_2\dotsc\dfrac{x-6}{2}=\dfrac{y+3}{1}=\dfrac{z-1}{3}$
p1=Line3D(Point3D(1,-2,-1),Point3D(9,-5,0))
p2=Line3D(Point3D(6,-3,1),Point3D(8,-2,4))
U ovom slučaju se kut između vektora smjerova podudara s kutom između pravaca jer smo dobili arkus kosinus od pozitivnog broja.
kut=p1.angle_between(p2)
kut
Kut između pravaca u radijanima
kr=N(kut)
kr
Kut između pravaca u stupnjevima
ks=N(kut*180/pi)
ks
Pravci su različiti.
p1.contains(p2)
Pravci nisu paralelni.
p1.is_parallel(p2)
Pravci nisu okomiti.
p1.is_perpendicular(p2)
Pravci se sijeku u točki $S\big(5,-\frac{7}{2},-\frac{1}{2}\big)$
p1.intersection(p2)
točka: $A(6,1,-5)$ pravac: $\frac{x-2}{3}=\frac{y+4}{1}=\frac{z-2}{-1}$
pravac=Line3D(Point3D(2,-4,2),Point3D(5,-3,1))
A=Point3D(6,1,-5)
S=pravac.projection(A)
S
okomita dužina iz točke $A$ na zadani pravac
pravac.perpendicular_segment(A)
normala iz točke $A$ na zadani pravac
pravac.perpendicular_line(A)
Simetrična točka točke $A$ s obzirom na zadani pravac.
S+A.direction_ratio(S)
Pravac koji prolazi točkom $A$ i paralelan je sa zadanim pravcem
pravac.parallel_line(A)
A=Point3D(1,2,3)
B=Point3D(4,0,-5)
S=Point3D(37/16,9/8,-1/2)
Točka $S$ pripada dužini $\overline{AB}$
AB=Segment3D(A,B)
AB
AB.contains(S)
$\dfrac{|AS|}{|BS|}=\dfrac{7}{9}$
A.distance(S)/B.distance(S)
$p_1\dotsc\dfrac{x+2}{3}=\dfrac{y-7}{-4}=\dfrac{z-2}{4},\qquad p_2\dotsc\dfrac{x+5}{-1}=\dfrac{y}{1}=\dfrac{z+3}{5}$
p1=Line3D(Point3D(-2,7,2),Point3D(1,3,6))
p2=Line3D(Point3D(-5,0,-3),Point3D(-6,1,2))
Pravci su mimosmjerni.
p1.is_parallel(p2)
p1.intersection(p2)
Vektori smjerova pravaca $p_1$ i $p_2$ kao matrice
s1=Matrix(p1.direction_ratio)
s2=Matrix(p2.direction_ratio)
s1,s2
Vektor smjera zajedničke normale
nor=s1.cross(s2)
nor
Ravnina $\pi_1$
nor_pi1=s1.cross(nor)
nor_pi1
pi1=Plane(Point3D(-2,7,2),nor_pi1)
pi1
pi1.equation()
Ravnina $\pi_2$
nor_pi2=s2.cross(nor)
nor_pi2
pi2=Plane(Point3D(-5,0,-3),nor_pi2)
pi2
pi2.equation()
normala=pi1.intersection(pi2)[0]
normala
$N_1\left(-\frac{59}{67},\frac{369}{67},\frac{234}{67}\right)\qquad$ $N_2\left(-\frac{419}{67}, \frac{84}{67}, \frac{219}{67}\right)$
N1=normala.intersection(p1)[0]
N1
N2=normala.intersection(p2)[0]
N2
d=N1.distance(N2)
d
N(d)
$p\dotsc\dfrac{x+1}{2}=\dfrac{y}{1}=\dfrac{z}{-1},\qquad \Pi\dotsc x+2y-2z-5=0$
pravac=Line3D(Point3D(-1,0,0),Point3D(1,1,-1))
ravnina=Plane(Point3D(5,0,0),(1,2,-2))
U ovom slučaju se kut između normale ravnine i vektora smjera pravca podudara s kutom između pravca i ravnine jer smo dobili arkus sinus od pozitivnog broja.
kut=ravnina.angle_between(pravac)
kut
kut u radijanima
N(kut)
kut u stupnjevima
N(kut*180/pi)
U slučaju negativnog predznaka, vektor smjera pravca i normala ravnine zatvaraju tupi kut. Kut između pravca i ravnine je tada jednak apsolutnoj vrijednosti tog broja, tj. zaboravimo negativni predznak.
pravac2=Line3D(Point3D(1,1,-1),Point3D(-1,0,0))
kut=ravnina.angle_between(pravac2)
kut
kut između vektora smjera pravca i normale ravnine u radijanima
kr=N(kut+pi)
kr
kut između vektora smjera pravca i normale ravnine u stupnjevima
N(kr*180/pi)
kut između pravca i ravnine u radijanima
kr=N(Abs(kut))
kr
kut između pravca i ravnine u stupnjevima
N(kr*180/pi)
Pravac i ravnina nisu paralelni.
ravnina.is_parallel(pravac)
Pravac i ravnina nisu okomiti.
ravnina.is_perpendicular(pravac)
Pravac i ravnina se sijeku u točki $S(1,1,-1)$.
ravnina.intersection(pravac)
$p\dotsc\dfrac{x+1}{2}=\dfrac{y}{1}=\dfrac{z}{-1},\qquad \Pi\dotsc x+2y-2z-5=0$
pravac=Line3D(Point3D(-1,0,0),Point3D(1,1,-1))
ravnina=Plane(Point3D(5,0,0),(1,2,-2))
Ortogonalna projekcija pravca na ravninu
orto_pr=ravnina.projection_line(pravac)
orto_pr
Parametarske jednadžbe ortogonalne projekcije pravca $p$ na ravninu $\Pi$
orto_pr.arbitrary_point(u)
Parametarske jednadžbe simetričnog pravca od pravca $p$ s obzirom na ravninu $\Pi$
S=ravnina.intersection(pravac)[0]
ortT=ravnina.projection(pravac.p1)
simT=ortT+(pravac.p1).direction_ratio(ortT)
sim_pr=Line3D(S,simT)
sim_pr.arbitrary_point(u)
Pravac koji prolazi točkom $T(-1,0,0)$ i okomit je na ravninu $\Pi$
okomica=ravnina.perpendicular_line(Point3D(-1,0,0))
okomica
okomica.arbitrary_point(u)
Napišite jednadžbu ravnine koja prolazi točkom $B(-1,2,-4)$, a okomita je na ravnine $\Pi_1\dotsc x+3y-2z+5=0$ i $\Pi_2\dotsc -4x+5y-z+3=0$.
B=Point3D(-1,2,-4)
nor1=Matrix([1,3,-2])
nor2=Matrix([-4,5,-1])
nor3=nor1.cross(nor2)
nor3
tuple(nor3)
Tražena ravnina: $7x+9y+17z+57=0$
rav=Plane(B,nor3)
rav.equation()
Za koju vrijednost parametra $a\in\mathbb{R}$ se sijeku pravci $p_1\dotsc\frac{x-a}{4}=\frac{y-2}{3}=\frac{z}{1}$ i $p_2\dotsc\frac{x+3}{-1}=\frac{y+a}{5}=\frac{z+1}{1}$. Odredite u tom slučaju jednadžbu ravnine koja sadrži pravce $p_1$ i $p_2$.
a=var('a')
s1=Matrix([4,3,1])
s2=Matrix([-1,5,1])
T1=Matrix([a,2,0])
T2=Matrix([-3,-a,-1])
vek=T2-T1
Uvjet komplanarnosti pravaca
uvjet=vek.cross(s1).dot(s2)
uvjet
Pravci su komplanarni jedino za $a=1$.
solve(uvjet,a)
T1=Point3D(T1).subs({a:1})
T2=Point3D(T2).subs({a:1})
T1,T2
Ravnina $\pi$ koja sadrži pravce $p_1$ i $p_2$ prolazi npr. kroz točku $T_1$ i ima normalu $\vec{n}_{\pi}=\vec{s}_1\times\vec{s}_2$.
nor=s1.cross(s2)
nor
Jednadžba tražene ravnine: $-2x-5y+23z+12=0$
rav=Plane(T1,nor)
rav.equation()
Odredite vektor smjera pravca $q$ koji prolazi točkom $T(1,0,4)$ i siječe pravac $p\dotsc\frac{x-2}{1}=\frac{y-1}{-1}=\frac{z+1}{0}$ te je paralelan s ravninom $\Sigma\dotsc -2y+z-1=0$.
pravac=Line3D(Point3D(2,1,-1),Point3D(3,0,-1))
T=Point3D(1,0,4)
nor=Matrix([0,-2,1])
Neka je točka $S$ presjek pravaca $p$ i $q$.
t=var('t')
S=pravac.arbitrary_point(t)
ST=S.direction_ratio(T)
ST
Kako je pravac $q$ paralelan s ravninom $\Sigma$, mora vrijediti $\overrightarrow{ST}\cdot\vec{n}_{\Sigma}=0$.
sp=Matrix(ST).dot(nor)
sp
rj=solve(sp,t)
rj
Možemo uzeti $\vec{s}_{q}=2\cdot\overrightarrow{ST}=(-9,5,10)$
2*Matrix(ST).subs({t:rj[0]})
Zraka svjetlosti prolazi točkom $T(-2,-1,1)$ i kreće se u smjeru vektora $\vec{v}=(-1,0,-1)$ te se reflektira na ravnini $\Pi_1\dotsc x+y-2z=0$. U kojoj točki reflektirana zraka siječe ravninu $\Pi_2\dotsc x+y+z+18=0$?
T=Point3D(-2,-1,1)
vek=Point3D(-1,0,-1)
zraka=Line3D(T,T+vek)
pi1=Plane(Point3D(0,0,0),(1,1,-2))
pi2=Plane(Point3D(-18,0,0),(1,1,1))
Točka $S(-7,-1,-4)$ je presjek zrake i ravnine $\pi_1$.
S=pi1.intersection(zraka)[0]
S
Zraka siječe ravninu jer je $t>0$. Zraka je polupravac pa moramo poštivati i orijentaciju vektora $\vec{v}$.
zraka.parameter_value(S,t)
Neka je $q$ pravac okomit na ravninu $\Pi_1$ koji prolazi kroz točku $S$. Neka je $P$ ortogonalna projekcija točke $T$ na pravac $q$.
okomica=pi1.perpendicular_line(S)
P=okomica.projection(T)
P
Neka je $T'$ simetrična točka točke $T$ s obzirom na pravac $q$.
Tc=P+T.direction_ratio(P)
Tc
Reflektirana zraka je polupravac s početkom u točki $S$ koji prolazi točkom $T'$. Reflektirana zraka siječe ravninu $\Pi_2$ u točki $S'(-11,-2,-5)$.
reflektirana_zraka=Line3D(S,Tc)
Sc=pi2.intersection(reflektirana_zraka)[0]
Sc
Reflektirana zraka siječe ravninu $\Pi_2$ jer je $t>0$.
reflektirana_zraka.parameter_value(Sc,t)