Cvičení 10: Delphi - rovinné transformace

Transformace v rovině

Mějme dány body A[1, 2 ] ,B[ 3, 5 ] a rovnice
x1˘
=
x1+6
(1)
x2˘
=
x1+x2+3
Pomocí těchto bodů získáme body A˘, B˘
a1˘
=
a1+6 = 1+6 = 7
(2)
a2˘
=
a1+a2+3 = 1+2+3=6
Bod A˘ má souřadnice [7, 6 ] a bod B˘ = [9, 11 ]
Provedli jsme transformaci úsečky AB na úsečku AB pomocí rovnic 1. Rovnice 1 budeme nazývat transformační rovnice a lze jej maticově zapsat jako

x˘ = T * x +r
(3)
Matice T se nazývá transformační matice.
Příklad:
Mějme dány body A[1, -5 ] ,B[ 7, 6 ] a rovnice
x1˘
=
x1+ x2+6
(4)
x2˘
=
x1+3*x2+3
Pomocí těchto bodů vypočtěte body A˘, B˘ a napište transformační matici T

Homogenizace

Při práci s transformace se používá homogenizace ke zjednodušení výpočtu. Vezme se transformační matice T a vektor r z rovnice transformace x˘ = T * x +r a vytvoří se z nich jediná matice 3 krát 3 a tuto matici transponujeme.

      t11     t21     0

H = t12     t22     0

      r1     r2     1

Typy zobrazení

Různé typy zobrazení jsou popsány v teoretické části týkající se obecně transformací v Základech počítačové grafiky, část 8.

1  Program na transformace trojúhelníku

  1. Vytvořte si adresář Transformace a do něj si zkopírujte základní soubory s unitou Graph2D
  2. Podle obrázku umístěte na formulář tři zaškrtávací políčka a tři buttony.
  3. Propojte buttony Smaz a Konec s příslušnými procedurami
  4. Na začátku zdrojového kódu přidejte nový typ (type ) - pro zadávání matic
    TMatrix = array[1..3,1..3] of Real;
    
    
  5. Tlačítko Transformuj propojte s procedurou Transformuj
  6. Zadeklarujte potřebné proměnné (před begin)
    var  A,B,C:TPoint;
         Red,Green,Blue:Byte;
         At, Bt, Ct:TPoint;
         Z:TMatrix;
    
    
  7. Nastavte uživatelské souřadnice, barvy a vykreslete souřadné osy.
    with Image1 do
    begin
       x1:=-10;
       x2:=10;
       y1:=-10;
       y2:=10;
    
      Scale(x1,x2,y1,y2);
    
      Red:=0;
      Green:=100;
      Blue:=0;
    
      XAxis(x1,x2,0,Red,Green,Blue);
      YAxis(y1,y2,0,Red,Green,Blue);
    end;
    
    
  8. Zadejte souřadnice původního trojúhelníku ABC a vykreslete ho pomocí procedury Line.
      A[1]:=3; A[2]:=0;  A[3]:=1;
      B[1]:=6; B[2]:=6;   B[3]:=1;
      C[1]:=-3; C[2]:=4;  C[3]:=1;
    
      Line(A,B,Red,Green,Blue);
      Line(A,C,Red,Green,Blue);
      Line(C,B,Red,Green,Blue);
    
    
  9. Vyzkoušejte, zda program funguje.
  10. Přidejte pomocnou proceduru na osovou souměrnost. Po zadání bodu vypočte bod souměrně sdružený podle osy x. Jedná se o násobení souřadnic bodu transformační maticí Z ve dvou for cyklech. (doplňte za var před begin)
    procedure OsovaSoumernost(X:TPoint; var Xt:TPoint);
    var i,j:Byte;
    begin
      Z[1,1]:=1;   Z[1,2]:=0;  Z[1,3]:=0;
      Z[2,1]:=0;   Z[2,2]:=-1;  Z[2,3]:=0;
      Z[3,1]:=0;   Z[3,2]:=0;  Z[3,3]:=1;
    
      for i:=1 to 3 do Xt[i]:=0;
    
      for j:=1 to 3 do
       for i:=1 to 3 do
         Xt[j]:=Xt[j]+X[i]*Z[i,j];
    end;
    
    
  11. Dále do programu doplňte vykreslení transformovaného trojúhelníku. Nejdříve se body A,B,C převedou procedurou OsovaSoumernost na body At,Bt,Ct a ty procedurou Line vykreslí transformovaný trojúhelník. Vše proběhne pouze v případě, že je první Check box zaškrtnutý.
    if checkBox1.checked=true then
      begin
        OsovaSoumernost(A,At);
        OsovaSoumernost(B,Bt);
        OsovaSoumernost(C,Ct);
    
        Line(At,Bt,Red,Green,Blue);
        Line(At,Ct,Red,Green,Blue);
        Line(Ct,Bt,Red,Green,Blue);
      end;
    
    
  12. Sami přidejte procedury StredovaSoumernost, Posunuti. Od první se liší pouze v tvaru matice Z, který najdete v teoretické části.
  13. Přidejte další možnosti zašktrtnutí CheckBox2 a CheckBox3, opět je vše stejné, pouze se volá jiná transformační procedura.
  14. Na panel doplňte EditBoxy pro zadávání rozsahu souřadných os a barev. Na převod na čísla použijte opět funkci VAL. (viz předchozí cvičení)
  15. Doplňte šest EditBoxů pro zadávání souřadnic trojúhelníka přímo z panelu.
  16. Můžete dopnit další transformace, například otáčení o zadaný úhel, atd...
  17. A to je vše :-)



File translated from TEX by TTH, version 3.67.
On 2 Aug 2007, 11:16.