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);
}
}