NazajNaprejKazalo

Koordinatne transformacije v Javi2D


6.1 Koordinatne transformacije: pregled

Java 1.2 nam omogoča premik, obračanje, povečevanje/zmanjševanje in strižne transformacije koordinatnega sistema. To zna biti zelo prikladno: dostikrat je mnogo enostavneje premakniti koordinatni sistem, kot pa računati nove koordinate za vse točke v njem. Poleg tega za določene like kot npr. elipse ni drugega načina za izris raztegnjene ali rotirane različice. Pomeni prekika, rotacije in skaliranja (povečevanje / zmanjševanje) so jasni. Strižne transformacije pa pomenijo neenakomeren raztezek, strig po x osi premakne točke v desno v odvisnosti od oddaljenosti od osi y, strig po y pa navzdol odvisno od oddaljenosti od osi x.

Lahko pa izvajamo bolj zapletene transformacije (naprimer zrcaljenje slike s preslikavo čez premico) z direktno manipulacijo nizov, ki kontrolirajo transformacijo.

Poznamo dva osnovna načina uporabe transformacij. Ustvarimo lahko AffineTransform objekt, mu določimo lastnosti in ga 'položimo' na Graphics2D objekt s proceduro setTransform. Drugi način pa je, da kličemo željeno transformacijo direktno na Graphics2D objekt.

6.2 Koordinatni premiki in rotacije: Primer programa

Uporabljene datoteke: DrawExample5.java, DrawExample4.java, DrawExample3.java, DrawExample2.java, DrawExample1.java, WindowUtil.java in ExitListener.java
import java.awt.*;



public class DrawExample5 extends DrawExample4 {

  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D)g;

    g2d.clearRect(0, 0,

                  getSize().width, getSize().height);

    drawFilledCircle(g2d);

    drawHollowCircle(g2d);

    g2d.setPaint(Color.black);

    // Move the origin to the center of the circle.

    g2d.translate(185.0, 185.0);

    for (int i=0; i<16; i++) {

      // Rotate the coordinate system (around current

      // origin, which is at the center of the circle).

      g2d.rotate(Math.PI/8.0);

      g2d.drawString("Java", 0, 0);

    }

  }



  public static void main(String[] args) {

    WindowUtil.openInJFrame(new DrawExample5(),

                            380, 400);

  }

}

6.3 Koordinatni premiki in rotacije: Izgled izpisa

Izpis: koortinatni premiki v Javi2D

6.4 Strične transformacije: Pregled

Od nič rayličen x strig bo povzročil zamik točk po osi x v desno, bolj ko so oddaljene od y osi. X strig vrednosti 0.1 bo naprimer zamaknil najbolj oddaljene točke lika za 10% oddaljenosti od osi y. Y strig pa premakne točke navzdol v odvisnosti od odmika od osi x.

6.5 Strižne transformacije: Primer programa

Uporabljene datoteke: Shear.java, WindowUtil.java in ExitListener.java
import com.sun.java.swing.*;

import java.awt.*;

import java.awt.geom.*;



public class Shear extends JPanel {

  private static double gap=10, width=100;

  private Rectangle2D.Double rect =

    new Rectangle2D.Double(gap, gap, 100, 100);



  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D)g;

    g2d.clearRect(0, 0,

                  getSize().width, getSize().height);

    for (int i=0; i<5; i++) {

      g2d.setPaint(Color.red);

      g2d.fill(rect);

      // Each new square gets 0.2 more x shear

      g2d.shear(0.2, 0.0);

      g2d.translate(2.0*gap + width, 0.0);

    }

  }



  public static void main(String[] args) {

    String title =

      "Shear: x shear ranges from 0.0 for the " +

      "leftmost 'square' to 0.8 for the " +

      "rightmost one.";

    WindowUtil.openInJFrame(new Shear(),

                            (int)(20.0*gap + 5.0*width),

                            (int)(5.0*gap + width),

                            title);

  }

}

6.6 Strižne transformacije: Izgled izpisa

Izpis: strižne transformacije v Javi 2D

NazajNaprejKazalo

avtor: Filip Božič
december, 1998