# Rechteck rotieren und frontal anzeigen



## pat270881 (17. Okt 2006)

Hallo,

ich möchte gerne ein Rechteck dass zuerst so schräg angezeigt wird nach vorne gezogen wird, also durch betätigen zum beispiel eines JSliders.

Ich habe hier eine ganz kleine zeichnung wie ich das meine:

bringingToFront

hat jemand eine ahnung, wie ich das am einfachsten mit Java3D oder JOGL realisieren kann...? :bahnhof: 

lg pat


----------



## Soulfly (19. Okt 2006)

Du nimmst einen Glcanvas der meinetwegen die Fläche anzeigt.

Über den Jslider veränderst du den Wert der Rotierung, die wie in der Zeichnung um die rechte Kante der Fläche geht.
Jogl muss halt diese Werte bekommen und fertig.

MfG
Soulfly


----------



## kaie (30. Okt 2006)

Falls Du noch Interesse an einer Lösung haben solltest... kommt sogar ohne Java3D und den ganzen Schnickschnack aus. Viel Spass damit!


```
import java.awt.*;
import java.awt.event.*;
import java.net.*;

import javax.imageio.*;
import javax.swing.*;

public class Perspektive extends JPanel
{
    // Attribute
    private Image  bild;
    private double winkel;
    private int    breite;
    private int    hoehe;

    // Konstruktor
    public Perspektive(String url)
    {
        try
        {
            bild = ImageIO.read(new URL(url));
            breite = bild.getWidth(null);
            hoehe = bild.getHeight(null);
            setPreferredSize(new Dimension(breite, hoehe));
        } catch (Exception e)
        {
        }
    }

    public void setzeWinkel(double w)
    {
        if (winkel > 90 || winkel < -90)
            return;
        winkel = w * Math.PI / 180;
        repaint();
    }

    // Zeichenmethode
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        // Lichteffektfarbe setzen
        int farbe = (int) (Math.abs(Math.sin(winkel) * 200));
        g.setColor(new Color(0, 0, 0, farbe));

        // Koordinaten berechnen
        int x1 = (int) Math.max(Math.sin(winkel) * breite, 0);
        int x2 = breite - (int) Math.max(Math.sin(-winkel) * breite, 0);
        int y1 = (int) Math.abs(Math.sin(winkel) * hoehe / 4);

        // Bild spaltenweise zeichnen
        for (int x = 0; x < breite; x++)
        {
            int dx = x1 + (x2 - x1) * x / breite;
            int dy = winkel < 0 ? y1 * x / breite : y1 * (breite - x) / breite;

            g.drawImage(bild, dx, dy, dx + 1, hoehe - dy, x, 0, x + 1, hoehe,
                    null);

            //g.drawLine(dx,dy,dx,hoehe-dy); //<-- für Beleuchtung
        }
    }

    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Perspektive p = new Perspektive(
                "http://www.sternwarte-hannover.de/galerie/bilder/mars_explorer.jpg");
        JScrollBar scroll = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, -90, 90);

        scroll.addAdjustmentListener(new AdjustmentListener()
        {
            public void adjustmentValueChanged(AdjustmentEvent a)
            {
                p.setzeWinkel(a.getValue());
            }
        });

        f.getContentPane().add(p);
        f.getContentPane().add(scroll, "South");
        f.pack();
        f.setVisible(true);
    }
}
```


----------

