Distance_LP - compute distance between point and line

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: Homework in Pascal

Program: Poilinp.pasPoilinu.pas
File exe: Poilinp.exePoilinu.tpu
need: Angeom02.tpuUninout.tpuEgavga.bgi
flow: Poilin.docAmater.txt
Example: Angeom02.pasUninout.pas

For units AnGeom02 (algebraics geometry) make function Distance_LP. This function compute distance between point and line.

FUNCTION Distance_LP(Line1:TLine; bodA:TPoint): Real;
Matemetické zdôvodnenie ako sa vypočítava vzdialenosť bodu od priamky.
Vzorec je:
 
Distance := Abs(a * ox + b * oy + c)/Sqrt( Sqr(a) + Sqr(b))
v prípade že rovnica priamky je ax+by+c a bod má súradnice [ox,oy].
 
<Tu niekde nakresli priamku a bod a ukáž aká je vzdialenosť>
 
A teraz maly exkurz do OOP
--------------------------
 
OOP je založené na tom že "premena"-object obsahuje zároveň funkcie ktore pracuju
s premenou. Napriklad ak mam objekty Line a Bod z nazvu je jasne o com su tak
mozem k nim definovat funkcie ktore patria iba im.
Napriklad kazda z nich obsahuje funkciu Draw. (Draw a tie objecty naprogramoval profesor)
Takze ak napisem prikaz Draw tak
Line.Draw - nakresli ciaru
Bod.Draw - nakresli bod
 
A najkrajsie na tom je ze suradnice bodu a ciary su zase definovane vramci 
objekty. Takze napriklad pociatocne suradnice ciary su:
Line.ob - co je definicia bodu, konkretne suradnice x,y su potom
Line.ob.ox
Line.ob.oy
 
Pre bod:
Bod.ox
Bod.oy
 
Definovanie takychto bodov je pomocou funkcie Init.
V tvojom pripade sa bod definuje takto
bodA.Init(x,y,'bodA'); - pozri program BODPR_OO.PAS
 
Ciara sa definuje ako dve body
Najprv nadefinujem bod1 a bod2
  bod1.Init(x1,y1,'bod1');
  bod2.Init(x2,y2,'bod2');
 
A teraz pomocou tychto 2 bodov definujem ciaru
  line.Init_PP(bod1,bod2,'Priamka');
 
Inac ciara sa da definovat niekolkymi sposobmi popisem aby si vedel.
   Init_kq( vk, vq: Real; vInstName: TString16  ); - definicia <a> a <c> z rovnice priamky
   Init_PV( vo: TPoint; vw: TVector; vInstName: TString16 ); - pomocou pociaocneho bodu a vektoru
   Init_PP( vb, ve: TPoint; vInstName: TString16 ); - pomocou 2 bodov
 
Dalej kazda premena obsahuje premenu bYnit ktora vravi ci uz bola takto definovana.
Takze bod1.bYnit ak je true znamena ze uz som niekedy v programe definoval
bod1.Init(x,y,''). ak je bod1.bYnit false tak nie. Samozrejme pri spusteni programu
su vsetky bYnit false pretoze som este nic nedifinoval.
 
A teraz ako funguje tvoja funkcia Distance_LP
1. Nadefinuje hodnotu vzdialenost na nezmyselnu -1
2. Zisti ci boli inicializovane TPoint (bod) a TLine (priamka) pomocou
   bodA.bYnit a Line1.bYnit. Ak je niektora false nastavi premennu err a nepocita 
   vzdialenost, ostane v nej nezmyselna hodnota -1. Ta -1 zaroven indikuje 
   ze prepocet nebol uskutoceneny.
3. Ak je vsetko OK vypocita
     mez := Line1.a * bodA.ox + Line1.b * bodA.oy + Line1.c;
     sq  := Sqr(Line1.a) + Sqr(Line1.b);
   pred poslednou operaciou coz je odmocnina a delenie s <sq> este zisti ci sq je
   rozne od 0. <Nulou delit nemozeme>
4. Vydeli
    Abs( mez ) / Sqrt( sq )
5. Koniec
 
V pripade ze nastala neaka chyba tak procedura zavola funkciu Error.
Funkcia Error sluzi na vypisovanie chyb programu.
Procedura pise tieto chyby.
  1 - Bod pre urcenie vzdialenosti bodu od priamky neexistuje
  1 - Priamka pre urcenie vzdialenosti bodu od priamky neexistuje
  1 - Vyskytla sa chyba delenia nulou pri pocitani vzdialenosti bodu od priamky
 
Posledna chyba teoreticky nastat nemoze.
 
Popis testovacieho programu DOBOP_OO
------------------------------------
1. Program si postupne vyziada suradnice bodu a suradnice 2 bodov na priamke
2. Potom pomocou funkcie entity Draw vykresli aj bod aj priamku
3. Pocka na stlacenie klavesu a zavrie graficku konzolu pomocou prikazov
   CloseGraph;
   RestoreCrtMode;