Tilbake til startsida IKT i praksis - Pascal

Meny
 
 
 
 
 
 
Linjer
 
 
 
 

Pascal. Å teikne linjer

Pascal har ein del ferdige funksjonar for å teikne linjer på teikneflata (canvas). Desse blir omtala i dette avsnittet.

Linjene blir plasserte på teikneflata (canvas) ved hjelp av dei vanlege koordinata som er omtalte i kapitlet generelt.

Strekbreidde, strekstil og strekfarge blir styrt av innstilingane for pen.

I dei tilfella der teikninga inneheld fyll, blir denne bestemt med verdiane sette for brush.

 

Å teikne rette strekar

Colors

Kommandoen for å teikne ei linje er
line(x1,y1,x2,y2)
der x1,y1 er koordinata for startpunktet og x2,y2 er koordinata for sluttpunktet. I eksemplet ønskjer eg å teikne streken på eit panel kalla Panel1 i Form1. Kommandoen blir då:
Form1.Panel1.Canvas.Line(30,20,100,20);
Merk at (0,0) er ytterkantane på panelet.

Colors

Dersom pennen alt er plassert på canvas, kan ein halde fram teikninga frå denne staden med kommandoen lineTo(x,y). Det er då nok å oppgi det nye endepunktet for streken. Startpunktet vil vere der pennen står, altså sluttpunktet for den førre streken. Kommandoane for å lage bildet til høgre er:
Form1.Panel1.Canvas.Line(70,20,140,20);
Form1.Panel1.Canvas.LineTo(30,80);

Det er også råd å flytte pennen utan å teikne.
Form1.Panel1.Canvas.MoveTo(50,30);
vil flytte pennen til punktet (50,30). Bruker ein nå kommandoen
Form1.Panel1.Canvas.LineTo(50,80);
vil det bli teikna ein strek frå punktet (50,30) til (50,80).

Ein annan måte å oppgi koordinate på er å bruke «Point». Det første punktet inneheld x-,y-koordinata for startpunktet, det andre punktet tilsvarande for sluttpunktet. Kommandoen kan vere f. eks.:
Canvas.Line(Point(10, 10), Point(200, 100));
Kanskje ikkje den mest opplagte innsparinga, men kan vere nyttig likevel. I eit program vil det ofte vere mange gjentakingar med litt ulike data. Det er t.d. råd å definere variablane start og slutt som Point og bruke data frå desse i programmet som skal teikne strekane. Igjen eit eksempel:

procedure lagStrek(fra,til: TPoint);
begin
  Form1.Panel1.Canvas.Line(fra,til);
end;

procedure Strek;
var
  start, slutt: TPoint;
begin
  start.x := 20; start.y := 20;
  slutt.x := 200; slutt.y := 20;
  lagStrek(start,slutt);
end;
I prosedyren Strek kan ein sjølvsagt legge inn diverse while --- do eller andre funksjonar som legg inn varierande data.

Ein tredje måte å oppgi koordinata på er å bruke ein variabel deklarert som TRect. Streken vil då bli teikna frå det øvre, venstre hjørnet til det nedre, høgre hjørnet i variabelen. Også dette er enklast med eit eksempel:

procedure Strek;
var
  rekt: TRect;
begin
  rekt.Left := 20; rekt.Top := 20;
  rekt.Right := 200; rekt.Bottom := 100;
  Form1.Panel1.Canvas.Line(rekt);
end;

 

Å teikne boga strekar

Deler av ei ellipse

Arc teikner deler av ei ellipse. Den generelle kommandoen er
Canvas.Arc(x1,y1,x2,y2,SX,SY,EX,EY: Integer);

canvas arc

Dei fire første verdiane i kommandoen (x1,y1,x2,y2) er koordinata for å definere rektangelet som inneheld ellipsen. SX,SY er koordinata for startpunktet (3 på figuren) for sirkelbogen og EX,EY er koordinata for sluttpunktet (4 på figuren) for bogen.

På figuren til høgre er rektangelet som ellipsen blir teikna inne i vist. Heile ellipsen er også prikka inn. Resultatet av Arc()-kommandoen er teikna i blått. Arc teiknar bogen mot klokka. Dersom verdiane for start- og sluttpunktet blir bytta om, vil den delen som er prikka bli teikna i staden for den delen som nå er teikna.

Kommandoen for å teikne den blå bogen er:
Canvas.Arc(30,30,330,180,80,50,270,160);

Vinklar i staden for koordinat

I staden for å oppgi start- og stoppkoordinata, kan ein bruke vinklar. Av ein eller annan grunn har utviklarane vald å bruke 1/16 grader i staden for grader. Ein full sirkel blir såleis 360 × 16 = 5760. 90º tilsvarer 16 × 90 = 1440 osv. Null-streken er klokka 3 på ellipsen, dvs. rett aust. Ein positiv vinkelverdi betyr at bogen blir teikna mot klokka, medan ein negativ verdi gjer at bogen blir teikna med klokka.
Eksempel på kommando med vinklar:
Canvas.Arc(x1,y1,x2,y2,90*16,180*16);

Arc kan teikne med alle verdiar definerte for pen.

canvas chord

Sirkelsegment

Chord er i alle måtar nokså likt Arc, men teiknar i tillegg korden mellom endepunkta på sirkelbogen og fyller segmentet med fargen frå Brush. Bruken er som for Arc. Bare bytt Arc med Chord.
Figuren viser Chord brukt med dei same innstillingane som for Arc i bildet ovanfor. I tillegg er Brush sett til fargen $0c0c0c (grå).

Sjå også Pie som teiknar eit sirkeldiagram.

 

Bézierkurver

canvas bezier

Bézierkurver er noen spesielle matematiske kurver der bogen blir styrt av noen kontrollpunkt («anker») langs linja. Det første bildet viser ei bøygd kurve teikna i svart. Ved start- og endepunktet finn du prikka inn eit «anker». Plasseringa av dette ankeret styrer retninga og bogen for kurva inn eller ut frå det punktet ankeret hører til. På den neste teikninga er det høgre ankeret flytt mot venstre. Dette gjer at kurva inn til endepunktet blir noe flatare enn på det første bildet. Alt som er teikna i blått på bildet er hjelpelinjer og blir ikkje tatt med når kurva blir skriven ut.

For å teikne ei bézierkurve må ein altså definere koordinata for start og slutt for kurva og dei to kontrollpunkta (ankera). Dette blir gjort i ei punktliste som så blir brukt i funksjonen PolyBezier(punktliste).

canvas bezier

Kurven på bildet til høgre er laga slik:
var
  tblPoints: array[1..4] of TPoint;
begin
  tblPoints[1] := Point(50,100);
  tblPoints[2] := Point(75,150);
  tblPoints[3] := Point(175,150);
  tblPoints[4] := Point(200,100);
  Form1.PaintBox.Canvas.PolyBezier(tblPoints);
end;
Tala viser posisjonen for startpunktet (1) og endepunktet (4) og dei to mellomligjande ankerpunkta (2 og 3).

canvas bezier

Skal ein lage fleire samanhengande bézierkurver, kan ein sjølvsagt gjere dette ved å setje startpunktet for den nye kurva lik endepunktet for den førre kurva. Men det er også råd å gjere dette ved å skrive inn data for dei to ankerpunkta og endepunktet for den nye kurva. Startpunktet for den nye kurva vil då automatisk bli sett til å vere det same som endepunktet for den førre kurva. Altså
tblPoints[1] := Point(250,50);
tblPoints[2] := Point(300,50);
tblPoints[3] := Point(400,100);
Canvas.PolyBezier(tblPoints);
I dokumentasjonen er det oppgitt at dei to første punkta i lista er ankerpunkta og det siste punktet er data for endepunktet for kurva. I mi utgåve av Lazarus er det det første punktet i lista som er endepunktet.

canvas bezier

Fyllt kurve

Bildet til høgre viser den same kurva som tidlegare, men nå er det teikna ei linje mellom start- og endepunktet. Mellomrommet mellom denne linja og kurva er fylt med Brush. Dette er gjort ganske enkelt ved å legge til True i kommandoen: Canvas.PolyBezier(tblPoints,True);.

Litt tust i dokumentasjonen

I følgje hjelp for Lazarus er det generelle funksjonskallet
PolyBezier(const Points: array of TPoint; Filled: Boolean = False; Continous: Boolean = False) eller
PolyBezier(Points: PPoint; NumPts: Integer; Filled: Boolean = False; Continous: Boolean = False)
I det siste tilfellet kan Points vere ei punktliste med mange innslag. Bare dei NumPts første blir brukte for å teikna kurva.
Parameteret Continous i funksjonskallet virkar ikkje slik eg oppfattar at det er tenkt. Det enklaste er å ikkje bry seg om dette, men gjere slik eg har forklart ovanfor.


Send melding

© Innhald og design:  Kolbjørn StuestølStuestøl heimesideSist endra 11. april 2013