Documente Academic
Documente Profesional
Documente Cultură
Neagu Alexandru
26 Februarie 2023
1 Geometrie 2D
Cea mai importantă not, iune atunci când rezolvăm probleme de geometrie computat, ională
sunt, fără doar s, i poate, vectorii. Atunci când vorbim despre vectori, contează foarte
mult punctul de referint, ă pe care ı̂l considerăm. De exemplu, dacă considerăm orig-
inea O = (0, 0) ca punct de referint, ă, atunci fiecare punct p = (x, y) din plan poate fi
echivalent definit de vectorul p⃗ = (x, y). Folosind interpretarea vectorială, operat, iile
precum rotat, ia, translat, ia s, i aflarea anumitor unghiuri sunt mult mai intuitive.
O idee foarte utilă ı̂n geometria computat, ională este că, indiferent de punctul de
referint, ă pe care dorim să ı̂l considerăm, putem abstractiza totul raportându-ne la
origine. De exemplu, fie că avem două puncte ı̂n plan a = (x1 , y1 ) s, i b = (x2 , y2 ).
Folosind, notat, iile s, i operat, iile vectoriale, este foarte us, or să răspundem la următoarea
ı̂ntrebare: Dacă am considera punctul a drept punctul de referint, ă, cum s-ar modifica
coordonatele punctului b? Răspunsul este surprinzător de simplu:
⃗b = ((x2 − x1 ), (y2 − y1 ))
Dacă aplicăm această transformare peste toate punctele din plan, observăm că punctul
a se transformă ı̂n (0, 0) iar toate celelalte puncte rezultate ı̂n urma transformării de
mai sus sunt amplasate fat, ă de (0, 0) exact cum erau amplasate punctele init, iale fat, ă
de a. Dacă privim din punct de vedere vectorial, aceste transformări capătă mult
mai mult sens, deoarece ı̂n fond, tot ce contează atunci când analizăm un punct din
perspectiva altui punct este direct, ia s, i distant, a. Astfel, raportându-ne la un punct,
putem vedea toate celelalte puncte ca nis, te vectori ce au aceeas, i origine. O imagine
mai clară a procesului este prezentată mai jos:
O astfel de reducere este, deseori, crucială ı̂n problemele de geometrie computat, ională,
deoarece putem să ne folosim de proprietăt, i s, i identităt, i utile din algebra liniară.
1
• θ - semnifică unghiul care se formează ı̂ntre cei doi vectori. Trebuie de precizat
că un unghi poate fi pozitiv sau negativ, conform direct, iei sale de rotat, ie. Dacă
unghiul este ı̂n sens trigonometric (anticlockwise), el este pozitiv, in caz contrar
este negativ. Un exemplu care ilustrază acest lucru este afis, at mai jos.
Am ment, ionat acest lucru deoarece, chiar dacă ı̂n acest caz funct, ia cos este
simetrică, cel mai des ı̂n abordarea problemelor de geometrie computat, ională
este ales următorul domeniu de valori: θ ∈ [−π, π]).
• Datorită proprietăt, ii cos (θ) = cos (−θ), conchidem că ⃗v · w ⃗ · ⃗v .
⃗ =w
Fascinant este că, produsul scalar a vectorilor ⃗v = (x1 , y1 ) s, i w
⃗ = (x2 , y2 ) poate fi
calculat s, i după formula
2) ⃗v · w
⃗ = x1 x2 + y1 y2
Bineı̂nt, eles, putem egala proprietăt, ile 1) s, i 2) s, i să utilizăm produsul scalar ı̂n următoarele
scopuri:
1. Stabilirea unghiului θ dintre vectorii ⃗v s, i w
⃗ prin următoarea formulă:
!
⃗v · w
⃗ x1 x2 + y1 y2
arccos = arccos p 2
∥v∥∥w∥ (x1 + y12 )(x22 + y22 )
Atent, ie, domeniul de valori al funct, iei arccos este [0, π], deci unghiul returnat
va fi mereu pozitiv, net, inându-se cont de sensul trigonometric unghiului.
3) ⃗v × w
⃗ = ∥v∥∥w∥ sin (θ)
Norma unui vector ∥⃗a∥ s, i unghiul θ sunt definite exact ca ı̂n cazul produsului scalar.
Există totus, i o diferent, ă crucială: Funct, ia sin nu este simetrică, prin urmare obt, inem
că sin (−θ) = − sin (θ). Astfel, semnul unghiului θ influent, ează direct semnul produsu-
lui vectorial.
2
La fel ca ı̂n cazul produsului scalar, putem calcula produsul vectorial al vectorilor
⃗v = (x1 , y1 ) s, i w
⃗ = (x2 , y2 ) folosind o formulă mult mai simplă:
4) ⃗v × w
⃗ = x1 y2 − x2 y1
Din nou, putem pune cap la cap proprietăt, ile 3) s, i 4) s, i să folosim produsul vectorial
ı̂n următorul scop:
1. Semnul produsului vectorial ne comunică direct s, i semnul unghiului θ, astfel
obsevăm că
(a) ⃗v × w
⃗ < 0 ⇒ sin (θ) < 0 ⇒ θ ∈ (−π, 0) ⇒ w ⃗ este orientat ı̂n sens anti-
trigonometric (clockwise) fat, ă de ⃗v . Intuitiv, mai putem spune că vectorul
w
⃗ este orientat ”la dreapta” lui ⃗v .
(b) ⃗v × w
⃗ = 0 ⇒ sin (θ) = 0 ⇒ θ ∈ {0, π} ⇒ vectorii ⃗v s, i w
⃗ sunt coliniari.
(c) ⃗v × w⃗ > 0 ⇒ sin (θ) > 0 ⇒ θ ∈ (0, π) ⇒ w ⃗ este orientat ı̂n sens trigono-
metric (anticlockwise) fat, ă de ⃗v . Intuitiv, mai putem spune că vectorul w⃗
este orientat ”la stânga” lui ⃗v .
S, tim deja din geometria plană că aria unui asemenea triunghi poate fi calculată
conform formulei:
1
5) A = ∥⃗v ∥∥w∥ ⃗ sin (θ)
2
Dacă punem cap la cap formulele 3) s, i 5) obt, inem că
1
6) A = |⃗v × w|
⃗
2
Din motiv că facem abstract, ie de orientarea celor doi vectori atunci când cal-
culăm aria triunghiului, considerăm valoarea absolută a produsului vectorial!
3
1.3 Rotat, ii de coordonate
Avem nevoie deseori să rotim ı̂n jurul originii un vector P⃗ = (x, y) cu un anumit unghi
α ∈ (−π, π]. Defapt, putem roti un punct ı̂n jurul oricărui alt punct dacă facem trans-
formarea de coordonate descrisă ı̂n sect, iunea 1.
Pentru realizarea s, i ı̂nt, elegerea acestui procedeu, putem să vizualizăm punctul P⃗ drept
un număr complex x+yi. Dacă analizăm teoria numerelor complexe, facem următoarea
observat, ie:
• Fie ⃗a = x1 + y1 i s, i ⃗b = x2 + y2 i două numere complexe oarecare. Aceste numere
pot fi rescrise ı̂n formă polară astfel: ⃗a = r1 (cos α+i sin α) s, i ⃗b = r2 (cos ϕ+i sin ϕ)
• Dacă analizăm produsul celor două numere complexe scrise ı̂n formă polară,
obt, inem următorul rezultat
⃗a ∗ ⃗b = r1 r2 (cos (α + ϕ) + i sin (α + ϕ))
Argumentele ambelor numere complexe se adună iar razele se ı̂nmult, esc. Bineı̂nt, eles,
acelas, i rezultat ı̂l putem obt, ine s, i dacă ı̂nmult, im numerele complexe scrise ı̂n
formă normală, clasic.
• Analizând bine această proprietate, putem să tragem următoarea concluzie: Pen-
tru a roti vectorul P⃗ = (x, y) cu unghiul α ı̂n jurul originii este suficient să facem
următorul calcul:
(x + yi) ∗ (cos α + i sin α) =
x cos α + xi sin α + yi cos α + i2 y sin α) =
(x cos α − y sin α) + i(x sin α + y cos α)
Astfel, am reus, it intuitiv să arătăm că vectorul P⃗ = (x, y) rotit cu unghiul α rezultă
vectorul P⃗ ′ = (x cos α − y sin α, x sin α + y cos α).
4
Cu alte cuvinte, trebuie să sortăm eficient vectorii ı̂n funct, ie de unghiul (cu semn)
pe care aces, tia ı̂i formează cu axa Ox. În desenul de mai sus, am dori să sortăm
prioritizând unghiurile ı̂n felul următor − π2 , − π2 + 2π . Cum putem face acest lucru
eficient? O primă idee ar fi să comparăm vectorii ⃗v s, i w ⃗ ı̂n funct, ie de produsul lor
vectorial. Dacă ⃗v × w ⃗ > 0, atunci ⃗v apare ı̂naintea lui w ⃗ ı̂n sortare. Din păcate,
această idee nu este completă. De exemplu, dacă ne uităm la J, ⃗ observăm că vectorul
⃗ ⃗ ⃗ ⃗
F ar trebui să apară după J ı̂n sortare, ı̂nsă J × F > 0! Problema cu ideea de mai
sus apare ı̂n momentul ı̂n care unghiul (antitrigonometric) ı̂ntre vectorul J⃗ s, i vectorul
X⃗ este mai mare decât π. Din cauza faptului că produsul vectorial interpretează
unghiurile ı̂n intervalul (−π, π], unghiul α ∈ (π, 2π) este interpretat ca α − 2π. Prin
urmare, acesta ı̂s, i schimbă semnul. Astfel, algoritmul de mai sus este corect doar dacă
unghiul ı̂n sens anti-trigonometric dintre cei doi vectori este mai mic decât π. Putem
corecta această problemă dacă ı̂mpărt, im planul ı̂n două jumătăt, i. Pentru exemplul
din imagine, putem defini:
1. Vectorii din prima jumătate sunt cei cu unghiurile ∈ [− π2 , π2 ) fat, ă de origine.
2. Vectorii din a doua jumătate ca fiind cei cu unghiurile ∈ [ π2 , 3π
2 ) fat, ă de origine.
Bineı̂nt, eles, această implementare a sortării polare este corectă numai pentru cazul
particular ı̂n care ı̂ncepem sortarea ı̂ncepând cu unghiul − π2 . Totus, i, acest cod poate fi
adaptat indiferent care ar fi unghiul de start. Tot ce trebuie să modificăm este funct, iei
de ı̂ncadrare a vectorului ı̂n una dintre jumătăt, i.
5
2. Dacă linia este caracterizată de punctele A = (x1 , y1 ) s, i B = (x2 , y2 ), putem să
ı̂i asociem vectorul ⃗v = (x2 − x1 , y2 − y1 ), care este paralel cu linia. În acest caz
ı̂nsă, nu ne este foarte clar care este valoarea c care trebuie asociată linie astfel
ı̂ncât ⃗v × (x, y) = c dacă s, i numai dacă punctul (x, y) apart, ine liniei. S, tim ı̂nsă că
punctul A apart, ine cu sigurant, ă liniei, astfel putem calcula valoarea c = ⃗v × A.
Conform definit, iei, valoarea produsului vectorial rămâne constantă dacă (x, y) se
mis, că paralel cu ⃗v . Astfel, dacă ⃗v × (x, y) = c, atunci (x, y) este coliniar cu A.
|side|
dist =
∥v∥
|⃗
v ×w|
⃗
⃗ = ∥w∥
Bineı̂nt, eles, d⃗v (w) ⃗ sin θ = ∥v∥
Translarea liniei
Uneori poate apărea nevoia de a transla o linie conform unui vector ⃗t. Cu alte cuvinte,
am dori ca fiecare punct p = (x, y) cu proprietatea ⃗v × p = c să fie transformat ı̂n
p + ⃗t. Observăm că vectorul ⃗v va fi vectorul corespunzător liniei translate, deoarece va
rămâne paralel cu aceasta. Valoarea c ı̂n schimb se va modifica atunci când translăm
linia conform următorului rat, ionament:
Fie p = (x, y) un punct care apart, ine liniei init, iale (ı̂nainte de translat, ie). Ob-
servăm că p + ⃗t trebuie să apart, ină liniei după translat, ie, adică trebuie să se
satisfacă identitatea:
⃗v × (p + ⃗t) − c′ = 0 ⇔ c′ = ⃗v × p + ⃗v × ⃗t ⇔ c′ = c + ⃗v × ⃗t
6
Figure 9: Proiect, ia ortogonală a punctului P pe linia l
Fie vectorul w,
⃗ perpendicular cu vectorul ⃗v corespunzător liniei l. Observăm că pentru
a găsi punctul p′ trebuie să găsim cel mai mic k astfel ı̂ncât p + k w
⃗ se află pe linia l
caracterizată de vectorul ⃗v s, i de valoarea c. Cu alte cuvinte, trebuie să găsim cel mai
mic k astfel ı̂ncât:
0 = ⃗v × (p + k w)
⃗ −c
= ⃗v × p + ⃗v × k w
⃗ −c
= (⃗v × p − c) + k(⃗v × w)
⃗
= (⃗v × p − c) + k∥v∥2
−(⃗
v ×p−c)
Astfel, observăm că k = ∥v∥2 . Prin urmare, proiect, ia ortogonală se calculeaază ı̂n
felul următor:
⃗ v × p − c)
w(⃗
p′ = p −
∥v∥2
⃗ efectuând o rotat, ie de coordonate la 90 de grade ( π2 radiani).
Putem obt, ine vectorul w
Am vorbit despre cum se poate face asta ı̂n sect, iunea 1.3.
2 Geometrie 3D
Tot ce t, ine de operat, iile elementare cu vectori este aproape la fel cu ce am ı̂ntâlnit la
geometria 2D. Singura diferent, ă este numărul de dimensiuni cu care operăm. În cazul
geometriei 3D, un punct P este reprezentat de 3 numere reale (x, y, z). Mici diferent, e
se găsesc ı̂n interpretarea produsului vectorial s, i scalar.
⃗v · w
⃗ = ∥⃗v ∥∥w∥
⃗ cos θ
Vizual, ne putem imagina că originea, ı̂mpreună cu cei doi vectori, formează un plan,
iar unghiul θ (ı̂ntre cei doi vectori) apart, ine acestui plan. Relat, iile dintre rezultatul
produsului scalar s, i tipul unghiului θ sunt exact aceleas, i ca s, i cele prezentate aici 2.
Bineı̂nt, eles, s, i ı̂n acest caz, produsul scalar mai poate fi calculat simplu, utilizând
următoarea formulă:
⃗v · w
⃗ = x1 x2 + y1 y2 + z1 z2
⃗v × w ⃗ = (∥v∥∥w∥ sin θ) ∗ ⃗n
⃗ =N
Simbolul ∗ utilizat ı̂n formula de mai sus semnifică ı̂nmult, irea unui vector cu un scalar.
De exemplu, dacă ı̂nmult, im valoarea c cu vectorul ⃗v = (x, y), obt, inem:
7
Dacă analizăm un pic rezultatul produsului vectorial, observăm că acesta este foarte
similar cu ce obt, ineam ı̂n două dimensiuni. Putem să ne imaginăm acest rezultat
ca: un vector ⃗n scalat cu valoarea care se calculează ı̂n 2 dimensiuni. Singurul lucru
care rămâne de aflat este: ce este vectorul ⃗n? Vectorul ⃗n este un vector unitate
(lungimea egală cu 1) perpendicular cu ambii vectori ⃗v s, i w, ⃗ direct, ia căruia este
calculată conform regulii mâinii drepte. Folosind algebra liniară, produsul vectorial
poate fi calculat s, i cu ajutorul formulei:
⃗ = (y1 z2 − z1 y2 , z1 x2 − x1 z2 , x1 y2 − y1 x2 )
N
Figure 11: Orientarea vectorului P⃗S fat, ă de planul determinat de vectorii P⃗R s, i P⃗Q
(⃗v × w)
⃗ · p⃗
⃗ · p⃗, unde N
Observăm că această formulă este echivalentă cu N ⃗ este un vector perpen-
dicular pe planul determinat de vectorii ⃗v s, i w.
⃗ Astfel, putem folosi această formulă
ca să determinăm tipul unghiului care se formează ı̂ntre o perpendiculară la plan s, i
vectorul p⃗. Astfel:
• Dacă (⃗v × w) ⃗ s, i
⃗ · p⃗ > 0, unghiul care se formează ı̂ntre perpendiculara la plan N
vectorul p⃗ este ascut, it, prin urmare vectorul p⃗ este orientat deasupra planului.
• Dacă (⃗v × w) ⃗ s, i
⃗ · p⃗ = 0, unghiul care se formează ı̂ntre perpendiculara la plan N
vectorul p⃗ este drept, prin urmare vectorul p⃗ este orientat pe planului.
• Dacă (⃗v × w) ⃗ s, i
⃗ · p⃗ < 0, unghiul care se formează ı̂ntre perpendiculara la plan N
vectorul p⃗ este obtuz, prin urmare vectorul p⃗ este orientat sub planului.
8
2.4 Reprezentarea Planelor
Putem defini un plan ı̂n următorul mod: Toate punctele (x, y, z) care satisfac ecuat, ia
ax + by + cz = d
Ca s, i ı̂n cazul liniilor, ne imaginăm că planul nostru este translat ı̂n as, a fel ı̂ncât trece
prin origine. Din acest motiv, folosind formula ⃗n · (x, y, z) putem să vedem testăm
apartenent, a unui punct la planul care trece prin origine. Valoarea d ne spune practic,
cu cât trebuie să translăm planul astfel ı̂ncât acesta să revină la starea init, ială (paralelă
cu originea). Astfel, putem efectua următoarele transformări:
1. Dacă ne este dată ecuat, ia planului ax + by + cz = d, putem considera ⃗n = (a, b, c)
s, i valoarea d dată ı̂n ecuat, ie. Este demonstrabil că ⃗n este perpendicular cu planul.
2. Dacă ne sunt date trei puncte (necoliniare) P , Q, R s, i dorim să formulăm ecuat, ia
planului determinat de aceste puncte putem proceda ı̂n felul următor:
• Extragem vectorii P⃗Q s, i P⃗R as, a cum am discutat ı̂n sect, iunea 1.
• Observăm că ambii vectori sunt paraleli cu planul, astfel ei determină un
plan paralel cu planul init, ial.
• Putem determina un vector ⃗n perpendicular cu acest plan utilizând produsul
vectorial P⃗Q × P⃗R
• S, tim că punctul P apart, ine sigur planului, astfel putem afla valoarea lui d
folosind formula ⃗n · P .
• Prin urmare, ecuat, ia ⃗n · (x, y) = d determină planul format de cele 3 puncte.
• Folosind rat, ionamente similare cu cele pe care le-am dedus la geometria 2D,
putem deduce că formula de calcul a distant, ei este următoarea:
|side|
dist =
∥⃗n∥
9
3.3 Convex Hull
Link Problemă: https://cses.fi/problemset/task/2195/
Link Solut, ie: https://pastebin.com/Yw3X6LHd
4 Probleme Medii
4.1 Norocoase
Link Problemă: https://www.infoarena.ro/problema/norocoase
Link Solut, ie: https://www.infoarena.ro/job_detail/2977490?action=view-source
4.2 Geometrie
Link Problemă: https://www.infoarena.ro/problema/geometrie
Link Solut, ie: https://www.infoarena.ro/job_detail/2977169?action=view-source
6 Alte Probleme
• Robot Arm
• Hongcow Draws a Circle
References
[1] Resurse De Anul Trecut.
https://profs.info.uaic.ro/~infogim/2021/lectii/1112/18%20geometrie.
pdf
[2] Victor Lecomte. Handbook of geometry for competitive programmers.
https://victorlecomte.com/cp-geo.pdf
[3] Al. Cash. Geometry: 2D points and lines [Tutorial].
https://codeforces.com/blog/entry/48122
10