LearnToCP
Prijavi se
Navigacija
PočetnaRoad-mapaProblemiO Nama
Teorija
Takmičarsko Znanje
Izbor Radnog Okruženja (IDE)Interaktivni ZadaciOutput-only Zadaci
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 SkupoviSqrt Dekompozicija
Kombinatorika
Pravilo SabiranjaPravilo MnoženjaKombinatorni ObjektiPrincip Uključenja Isključenja
Geometrija
Osnove GeometrijeVektoriVektorski i Skalarni ProizvodLinijePoligoniTačke i PoligoniUgloviKonveksni Omotač
Rekurzija
PokazivačiRekurzijaGenerisanje Kombinatornih Objekata
Dinamičko Programiranje
O DP-uDP problemiDP nad StablimaDP nad Bitmaskama
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

Vektori

U ovoj lekciji učimo o vektorima - objektu od kog je zapravo sagrađen skoro svaki geometrijski zadatak (ne mešati sa strukturom podataka).

Šta je vektor

Vektor je strelica: ima pravac, smer i dužinu, ali nema fiksni položaj. Zapisujemo ga kao par brojeva, v=(x,y), što čitamo kao "pomeri se x udesno i y nagore".

Znači, tačka i vektor se čuvaju na potpuno isti način - kao dva broja. Razlika je samo u tome kako o njima razmišljamo:

  • tačka je mesto (gde se nešto nalazi)
  • vektor je pomeraj (kako da stignemo negde)

Dve strelice iste dužine i istog smera su isti vektor, bez obzira gde ih nacrtamo. To znači ono "nema fiksni položaj", i baš zato su vektori toliko zgodni: možemo ih slobodno pomerati tamo gde nam trebaju u računu.

vector-no-position.png

Od tačaka do vektora

Vektor koji nas vodi od tačke A do tačke B je prosto razlika njihovih koordinata:

AB=(Bx​−Ax​,By​−Ay​)

Ovo je najčešće korišćena operacija u geometrijskim zadacima. Skoro svaki zadatak počinje tako što tačke iz ulaza pretvorimo u vektore - i od tog trenutka radimo isključivo sa vektorima.

Na primer, za A = (1, 2) i B = (4, 6):

AB=(4−1,6−2)=(3,4)

Što nam govori upravo ono što očekujemo: da bismo od A stigli do B, idemo 3 udesno i 4 nagore.

Pazi na redosled: BA nije isto što i AB, to je potpuno suprotna strelica, BA=−AB. Oduzimanje u pogrešnom redosledu je jedna od najčešćih grešaka u geometrijskom kodu.

vector-from-points.png

Operacije nad vektorima

Postoje tri osnovne stvari koje možemo da radimo sa vektorima:

Sabiranje - izvršavanje jednog pomeraja pa zatim drugog:

u+v=(ux​+vx​,uy​+vy​)

Oduzimanje - pomeraj od vrha vektora v do vrha vektora u:

p​−v=(px​−vx​,py​−vy​)

Množenje skalarom - istezanje strelice brojem k. Pravac ostaje isti, a dužina se množi sa k; negativno k okreće strelicu na suprotnu stranu:

k⋅v=(k⋅vx​,k⋅vy​)
vector-operations.png

Dužina vektora

Vektor ima dužinu (intenzitet), a to je ista ona formula za rastojanje iz prethodne lekcije:

∣v∣=vx2​+vy2​​

Implementacija

U C++-u sve ovo možemo napisati kao nekoliko malih funkcija pored naše strukture.

Vector.cpp
#include <bits/stdc++.h>

using namespace std;

struct v{

    long long x, y;
};

v add(v a, v b){

    return {a.x + b.x, a.y + b.y};
}

v sub(v a, v b){

    return {a.x - b.x, a.y - b.y};
}

v scale(v a, long long k){

    return {a.x * k, a.y * k};
}

long long len2(v a){ // kvadrat duzine - ostaje ceo broj!

    return a.x * a.x + a.y * a.y;
}

double len(v a){

    return sqrt((double)len2(a));
}

double dist(v a, v b){

    return len(sub(b, a));
}

int main(){

    v a = {1, 2};
    v b = {4, 6};

    v ab = sub(b, a); // vektor od a do b

    cout<<"Vektor AB: ("<<ab.x<<", "<<ab.y<<")\n";
    cout<<"Duzina: "<<len(ab)<<'\n';
    cout<<"Rastojanje od a do b: "<<dist(a, b);

    return 0;
}

Output:
Vektor AB: (3, 4)
Duzina: 5
Rastojanje od a do b: 5

Rezime

Operacija Formula Napomena
Vektor A do B (Bx​−Ax​,By​−Ay​) oduzmi početnu tačku
Sabiranje (ux​+vx​,uy​+vy​) jedan pomeraj pa drugi
Oduzimanje (ux​−vx​,uy​−vy​) pazi na redosled
Množenje skalarom (k⋅vx​,k⋅vy​) negativno k okreće smer
Dužina vx2​+vy2​​ ista formula kao rastojanje

Vektori su glavni alat kojim rešavamo geometrijske zadatke, a u narednim lekcijama ćemo videti kako da ih iskoristimo!