Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Kuvat kääntymään(java)

Paulus M [19.10.2005 13:29:41]

#

tietääkö joku kuinka javassa voitaisiin saada kuvat kääntymään esimerkiksi 10 astetta vinoon?

Tällainen on hyvin tärkeää kaksiuloitteisissa ylhäälpäin kuvatuissa peleissä.

FooBat [19.10.2005 15:36:16]

#

Laita Graphics2D luokalle AffineTrasformiksi pyöritysmatriisi ennen kuvan piirtoa. Tämä onnistuu myös melko helposti ja nopeammin pikseli kerrallaan piirtämällä kunhan vain kerrot koordinaatit sopivasti pyöritysmatriisilla ja mappaat ne kuvaan.

Javadocs:
Graphics2D.setTransform()
AffineTransform.getRotateInstance()

Paulus M [19.10.2005 15:51:06]

#

okka, kiitti.

Mitä tarkoitat pikseli kerrallaan piirtämmisellä?

FooBat [19.10.2005 18:22:08]

#

Tälläinen joskus kirjoittamani löityi kovalevyn kätköistä. Tuo on ehkä hiukan liian optimoitu, jotta se toimisi hyvänä esimerkkinä, mutta kaipa tuosta ajatuksen kanssa luettuna saa selvää. Tuo vaatii jonkun kuvan toimiakseen (Tässä "kuva.png", mutta sen voi vaihtaa minkä nimiseksi tahansa).

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.event.*;

public class Rotor extends Canvas {

  private int[] screen;
  private int[] pixels1;
  // 1024*sin values
  private int[] sins = new int[256];
  // 1024*cos values
  private int[] coss = new int[256];


  private Image screenImage;

  private MemoryImageSource mis;

  /**
   * Picture name
   */
  private String sFile1 = "kuva.png";

  private int w, h;
  private int n;

  private int alpha = 0;
  private byte flip = 1;
  public Rotor() {
    Image image = new ImageIcon(sFile1).getImage();
    w = image.getWidth(this);
    h = image.getHeight(this);
    n = w*h;
    pixels1 = getPixels(image);

    screen = new int[w*h];

    mis=new MemoryImageSource(w,h,ColorModel.getRGBdefault(),screen,0,w);
    mis.setAnimated(true);
    mis.setFullBufferUpdates(true);
    screenImage=createImage(mis);
    initTrig();
  }

  private void initTrig() {
    for (int i = 0; i < 256; i++) {
      sins[i] = (int)(1024*Math.sin(  i*Math.PI / 128 ));
      coss[i] = (int)(1024*Math.cos(  i*Math.PI / 128 ));

    }
  }

  public int[] getPixels(Image image) {
    int[] pixels = new int[w*h];

    PixelGrabber pg
      = new PixelGrabber(image,0,0,w,h,pixels,0,w);
    try {
      pg.grabPixels();
    }
    catch (InterruptedException e) {}
    return pixels;
  }

  public void paint(Graphics g) {
    g.drawImage(screenImage,0,0,this);
  }

  public void update(Graphics g) {
    paint(g);
  }

  int db = 1;
  public void render() {
    alpha += 1;

    alpha = alpha &0xff;
    int offs = 0;
    int minY = (-h>>1);
    int maxY = h+minY;
    int minX = -w>>1;
    int maxX = w+minX;
    int n = w*h;

    int cs = coss[alpha];
    int ss = sins[alpha];

    for (int y = minY; y < maxY; y++) {
      for (int x = minX; x < maxX; x++) {
                                //>>10 == /1024 (sin/cos rounding)
	int x1 = ((cs*x  + (ss*y))>>10) -minX;
	int y1 = ((-ss*x + (cs*y))>>10) -minY;

        if (x1 < 0) do { x1 += w; } while(x1 < 0);
        else if (x1 >= w) do { x1 -= w; } while(x1 >=w);
        if (y1 < 0) do { y1 += h; } while(y1 < 0);
        else if (y1 >= h) do { y1 -= h; } while(y1 >=h);
        screen[ offs++ ] = pixels1[y1*w+x1];
      }

    }
  }

  public void nextFrame() {
    render();
    mis.newPixels(0, 0, w, h);
  }

  public static void main(String[] args) {
    JFrame frame = new JFrame("Rotor");
    Rotor f = new Rotor();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setSize(800,600);

    frame.getContentPane().add(f);
    frame.show();

    while(frame.isShowing()) {
      f.nextFrame();

      try {
      	Thread.sleep(20);
      }catch(Exception e) {return;}
    }

  }
}

Paulus M [21.10.2005 16:25:21]

#

kiitti, testaan tuota kohta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta