LearnToCP
Prijavi se
Navigacija
PočetnaRoad-mapaProblemiO Nama
Teorija
Takmičarsko Znanje
Izbor Radnog Okruženja (IDE)
Osnove
Tvoj Prvi ProgramTipovi podataka, Unos i IzlazC++ sintaksaModuloFunkcijeVektoriMatriceVremenska Složenost Algoritma
Sortiranje
SortiranjeSortiranje PrebrojavanjemRadix Sort
Tehnike Optimizacije
Dva PokazivačaZbir brojeva od 1 do nZbir PrefiksaBinarna PretragaPohlepni AlgoritmiFunkcije Binarne PretrageBinarna Pretraga po RešenjuPodeli, pa Vladaj
Binarni Brojevi
Binarni BrojeviBrojevi u koduOperacije nad BitovimaBitmaske
Matematika
Binarno StepenovanjeProsti BrojeviRastavljanje na proste činioceNZD i NZSEratostenovo SitoModifikovano Sito
Strukture Podataka
Niske (Stringovi)StekRedMapeSkupovi (Set)Red sa PrioritetomKorišćenje Proizvoljnih KriterijumaSegmentna StablaFenvikova StablaSparse TabeleDisjunktni Skupovi
Kombinatorika
Pravilo SabiranjaPravilo MnoženjaKombinatorni ObjektiPrincip Uključenja Isključenja
Geometrija
Osnove GeometrijeVektoriVektorski i Skalarni ProizvodLinijePoligoniUgloviTačka u PoligonuRastojanja i Tačke PresekaKonveksni OmotačKrugovi
Rekurzija
PokazivačiRekurzijaGenerisanje Kombinatornih Objekata
Dinamičko Programiranje
O DP-uDP nad StablimaDP nad BitmaskamaDP nad brojevima
Teorija Grafova
GrafoviDFS i BFSNajkraći PuteviStablaTopološko SortiranjeDajkstrin AlgoritamMinimalna Razapinjuća StablaAlgoritmi Najkraćih Puteva
Napredna Teorija Grafova
Dvostruka PovezanostJako Povezane KomponenteBipartitni GrafMaksimalni Protok u GrafuFord-Fulkersonov AlgoritamDualnost Protoka i Minimalnog PresekaTeško-Laka DekompozicijaCentroidna Dekompozicija
Napredne Strukture Podataka
2D i 3D Segmentna StablaLenjo PropagiranjeImplicitna Segmentna StablaPerzistentna Segmentna StablaNajbliži Zajednički PredakTrieBalansirana Binarna Stabla PretrageMoov Algoritam

Vektorski i Skalarni Proizvod

U ovoj lekciji učimo kako da množimo vektore - i zašto je to zaista korisno

Skalarni proizvod

Skalarni proizvod je prvi način na koji možemo da pomnožimo vektore. Piše se kao A⋅B

Računa se ovako:

A⋅B=Ax​∗Bx​+Ay​∗By​

Koristan je zato što nam govori da li su dva vektora normalna jedan na drugi.

Normalni vektori

Normalni vektori su vektori koji zaklapaju ugao od 90°

Ako je skalarni proizvod 2 vektora 0, onda su oni normalni jedan na drugi.

Tri mreže sa vektorima A i B pod oštrim, pravim i tupim uglom, gde je skalarni proizvod redom 9, tačno nula, i minus 8

Implementacija

Pretpostavimo da su svi vektori implementirani ovako:

struct v{
	long long x;
	long long y;
};

Skalarni proizvod je:

int dot_product(v a, v b){
    return (a.x * b.x) + (a.y * b.y);
}

Vektorski proizvod

Drugi, i korisniji način množenja je vektorski proizvod.

Pomoću njega možemo da izračunamo da li je poligon konveksan ili nije, da li su dva vektora paralelna, da li se dva vektora seku, i tako dalje..

Vektorski proizvod za dva 2D vektora svodi se na računanje determinante njihovih koordinata. Piše se kao A×B

Što znači:

A×B=Ax​∗By​−Ay​∗Bx​

Znak vektorskog proizvoda nam govori gde se dva vektora nalaze jedan u odnosu na drugi.

Čitanje vektorskog proizvoda

Zamisli da vektori seku krug.

Kada izračunamo vektorski proizvod A×B, ako je proizvod pozitivan, onda se po krugu, da bismo stigli od A do B, krećemo suprotno od kazaljke na satu.

Ako je proizvod negativan, da bismo stigli od A do B, krećemo se u smeru kazaljke na satu.

Ako je proizvod 0, onda su A i B paralelni!

Tri mreže sa vektorima A i B na krugu, gde je vektorski proizvod 10 za skretanje suprotno smeru kazaljke, minus 7 za skretanje u smeru kazaljke, i nula kada su vektori paralelni

Površina trougla

Znak nije jedino što nam vektorski proizvod daje. Korisna je i sama njegova vrednost.

Uzmi AB i AC, dva vektora koja polaze iz iste tačke A, i dopuni ih do paralelograma. Apsolutna vrednost vektorskog proizvoda je tačno površina tog paralelograma.

Taj paralelogram su dva ista trougla ABC, pa površinu prepolovimo:

PABC​=2∣AB×AC∣​

Proverimo to na trouglu čiju površinu znamo i bez ovoga. Neka je A = (0, 0), B = (4, 0) i C = (0, 3):

  • AB=(4,0) i AC=(0,3)
  • AB×AC=4⋅3−0⋅0=12
  • pa je površina 12 / 2 = 6

A to je pravougli trougao sa katetama 4 i 3, čiju površinu već znamo: 24⋅3​=6.

Primeti da nam vektorski proizvod daje dvostruku površinu, a ta dvostruka vrednost je uvek ceo broj. Zato površine možemo da računamo tačno u tipu long long i da delimo sa 2 tek na samom kraju - trik koji ćemo u narednim lekcijama stalno koristiti.

Napomena:
Bez apsolutne vrednosti površina ima znak, baš kao i ranije: pozitivna je kada je C levo od AB, a negativna kada je desno. Jedan broj, dva odgovora.

Implementacija

int cross_product(v a, v b){

    return (a.x * b.y) - (a.y * b.x);
}