Distance_LP - compute distance between point and line
Delphi & Pascal (česká wiki)
Category: Homework in Pascal
Program: Poilinp.pas, Poilinu.pas
File exe: Poilinp.exe, Poilinu.tpu
need: Angeom02.tpu, Uninout.tpu, Egavga.bgi
flow: Poilin.doc, Amater.txt
Example: Angeom02.pas, Uninout.pas
Program: Poilinp.pas, Poilinu.pas
File exe: Poilinp.exe, Poilinu.tpu
need: Angeom02.tpu, Uninout.tpu, Egavga.bgi
flow: Poilin.doc, Amater.txt
Example: Angeom02.pas, Uninout.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;
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;