Analitička geometrija i C# programiranje dio 1/n


Analitička geometrija

Iz matematike znamo da analitička geometrija predstavlja algebarski način opisivanja Euklidove geometrije. U analitičkoj geometriji pojmovi Euklidove geometrije se definišu na algebarski način. Prije konkretnih implementacija određenih problema analitičke geometrije, ponovimo na brzinu osnovne principe na kojim se temelji analitička geometrija.

Tačka

Osnovu analitičke geometrije čini koordinatni sistemi, koji mogu biti pravougli, polarni, sferni koordinatni sastem. Svakoj tački u euklidovom prostoru može se pridružiti jedna i samo jedna tačka koordinatnog sistema.

Npr. tačku A u analitičkoj geometriji možemo predstaviti kao:

A(x,y,z),

gdje x,y,z predstavljaju realne brojeve, koje zovemo još i koordinate.

Tačku A možemo predstaviti i preko polarnog (cilindričnog ) koordinatnog sistema kao:

A(r,\rho,z),

gdje su r,\rho,z – koordinate tačke.

Prava

Prava u Euklidovoj geometriji predstavlja osnovni pojam, a u analitičkoj geometriji se definiše preko jednačine prave. Najčešći oblik jednačine prave u analitičkoj geometriji prikazujemo na sljedeći način:

y=ax+b.

Jednačin prave u prostoru definišemo kao:

\frac{(x-x_0)} {a}=\frac{(y-y_0)} {b}=\frac{(z-z_0)} {c}..

Vektor

U analitičkoj geometriji vektor se definiše kao usmjerena duž. Npr.u koliko imamo dvije tačke A(x_A,y_A) i B(x_B,y_B), vektor \vec{AB} predstavlja usmjerenu duž čiji je početak u tački A a kraj u tački B.

\vec{AB} nije isto što i \vec{BA}.

U analitičkoj geometriji vektor se definiše kao:

\vec{AB}= (x_B-x_A, y_B-y_A)

Operacije nad vektorima

Kao što je poznato operacije nad vektorima se razliku od operacija nad brojevima odnosno skalarima. U koliko želimo da saberemo dva vektora \vec{a} i \vec{b} to možemo uraditi preko pravila:
1.Paralelograma i
2. Trougla.

Skalarni proizvod dva vektora

Skalarni proizvod dva vektora predstavlja proizvod dužine prvog i drugog vektora pomnožen sa kosinusom ugla koje vektori međusobno zatvaraj ili:

\vec{a} \dot \vec{b}= |a|\dot |b| cos (\alpha)

Vektorski proizvod dva vektora

Predstavlja jednu od najznačajniji osobina u analitičkoj geometriji, kao i kompjuterskoj grafici.
Vektorski proizvod predstavlja novi vektor:

  1. čija dužina predstavlja proizvod dužina vektora pomnožen sa sinusom ugla kojeg zatvaraju,
  2. pravac novog vektora okomit je na ravan kojeg čine vektori,
  3. smijer novog vektora se određuje pravilom desne ruke ili desnog koordinatnog sistema.
220px-Right_hand_rule_cross_product.svg

Određivanje smijera vektorskog proizvoda

U koliko imamo vektore \vec{a} i \vec{b} koji su definisani kao: \vec{a}(x_1,y_1,z_1) i \vec{b}(x_2,y_2,z_2), vektorski proizvod definišemo kao:

\vec{c}=\vec{a}\bigotimes \vec{b}=\begin{bmatrix} i & j & k\\ x_1 & y_1 & z_1\\ x_2 & y_2 & z_2 \end{bmatrix}

Primjeri

Problem 1: Položaj tačke u odnosu na pravu p

Pretpostavimo da imamo pravu p i tačku A koja nije kolinearna s pravom p. Potrebno je implementirati algoritam koji će dati odgovor na pitanje s koje strane se ona nalazi. Da bi riješili ovaj problem potrebno je iskoristiti osobinu vektorskog proizvoda dva vektora. Potrebno je napomenuti da je smijer gledanja duž prave važan u definisanju stane. U protivnom ne bi smo znali koja je lijeva, a koja desna strana.

Pretpostavimo da imamo situaciju kao na donjoj slici. Također primjetimo da smo označili smijer gledanaj duž prave p. Uočimo dvije tačke na pravoj p, P1 i P2. Da bi odrediti s koje strane se nalazi tačka A, prvo trebamo formirati vektor \vec(P_1P_2), a zatim vektor \vec(P_1A). Na kraju je potrebno izračunati njihov vektorski proizvod. Primjetimo da nam je P_1  početna tačka za oba vektora shodno pretpostavljenom smijeru gledanja duž prave.

tacka_s_sastrane_prave

 

U koliko sada primjenimo pravilo određivanja smijera vektorskog proizvoda (vidi gore sliku) možemo riješiti problem.  U koliko poznajemo koordinate tačke A, odnosno tačaka P1 i P2 te izračunamo vrijednost vektorskog proizvoda.

Pozitivan rezultat vektorskog proizvoda odgovorit će nam na pitanje  da li je tačka sa desne strane, dok će negativna vrijednost indicirati da se tačka nalazi s lijeve strane.

U koliko dobijemo proizvod nula, to znači se tačka A nalazi na pravoj p, odnosno da je kolinearna sa pravom p.

class Point
{
    public float x;
    public float y;
    public float z;
    public Point() { }
    public Point(float xx, float yy, float zz)
    {
        x = xx;
        y = yy;
        z = zz;
    }
}
/// <summary>
/// da li je tačka s desne strane prave
/// </summary>
/// <param name="A">tačka</param>
/// <param name="p1">početna tačka na pravoj p</param>
/// <param name="p2">krajnja tačka na pravoj p</param>
/// <returns>1 tačka s desne strane, -1 tačka s lijeve strane, 0 tačka na pravoj p.</returns>
static int isOnRightSide(Point A, Point p1, Point p2)
{
    //referentni vektor ili pravac kroz referentne tačke na pravoj
    Point vektor = new Point();
    vektor.x = p2.x - p1.x;
    vektor.y = p2.y - p1.y;

    //Pravimo vektor od referentne tacke 1 i date tacke a
    Point vektor2= new Point();
    vektor2.x = A.x - p1.x;
    vektor2.y = A.y - p1.y;

    //Izračunavamo vektorski proizvod dva verktora
    //ako je prozvod veći od nule tada je tačka s desne strane prave p

    float rezultat = vektor.y * vektor2.x - vektor.x * vektor2.y;

    if (rezultat > 0)
        return 1;//tačka se nalazi s desne strane
    else if (rezultat < 0)
        return -1;//tačka se nalazi s lijeve strane
    else
        return 0; //tačka lezi na pravoj p
}

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 01/05/2014, in .NET, C#, Programiranje, Windows 8 and tagged , , , . Bookmark the permalink. 1 Comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s