2D-Grafik Ruckelfreie Animation

Aljosha.k

Mitglied
Guten Tag,
ich bin momentan dabei mir die Grafikprogrammierung mit swing und awt anzueignen und bin da auch direkt auf ein Problem gestoßen.
Mein derzeitiges Projekt ist die Visualisierung der "Diffusion Limited Aggregation".
Es werden je nach Wunsch n-Teilchen erzeugt welche sich durch Brownsche Bewegung in ein Fraktal einfinden sollen.
Die Animation ist jedoch sehr rucklig/"flackerig". Wie könnt ich dies Beheben?

MfG Aljosha

DLA-Class
Code:
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;

/**
 * DLA = Diffusion Limited Aggregation
 * 
 * @author Aljosha Kubon 
 * @version 03.04.2018
 */
public class DLA extends JFrame
{
    private int numberDots = 100;
    private int radius = 20;
    private List<Dot> dots = new ArrayList<Dot>();
    private boolean first = true;
    private Random r;
   
    /**
     * Konstruktor für Objekte der Klasse DLA
     */
    public DLA()
    {
        setSize(500,500);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
       
        for(int i = 0; i < numberDots; i++){
            dots.add(new Dot(this.getWidth(),this.getHeight()));
        }
        // System.out.println("test");
    }
   
    public void paint(Graphics g){
        g.setColor(Color.black);
        g.fillRect(0,0, this.getWidth(), this.getHeight());
       
        g.setColor(Color.blue);

        for(int i = 0; i < numberDots; i++){
            g.fillOval(dots.get(i).x, dots.get(i).y, radius, radius);
            collision(dots.get(i));
            movement(dots.get(i));
        }
        repaint();
    }
   
    public void movement(Dot dot){
        if(dot.active){
            int deltaX = (int)(Math.round((Math.random())*2)-1);
            int deltaY = (int)(Math.round((Math.random())*2)-1);
           
            if( (dot.getX() + deltaX) > 0 && (dot.getX() + deltaX) < this.getWidth()){
                dot.setX(dot.getX() + deltaX);
            }
            if( (dot.getY() + deltaY) > 0 && (dot.getY() + deltaY) < this.getHeight()){
                dot.setY(dot.getY() + deltaY);
            }
        }
        System.out.println("X: "+dot.getX()+" Y: "+dot.getY());
    }
   
    public void collision(Dot dot){
        for(int i = 0; i < numberDots; i++){
            if(dot != dots.get(i)){
           
                int D = (int)Math.sqrt(( (dots.get(i).x - dot.x)^2 + (dots.get(i).y - dot.y)^2 ));
       
                if(D < radius){
                    dot.active = false;
                }
            }
        }
    }
}

Dot-Class
Code:
/**
 * Beschreiben Sie hier die Klasse Dot.
 * 
 * @author Aljosha Kubon 
 * @version 03.04.2018
 */
public class Dot
{
    public int x;
    public int y;
    public boolean active = true;

    /**
     * Konstruktor für Objekte der Klasse Dot
     */
    public Dot(int width, int height)
    {
        x = ((int) (Math.random()*width));
        y = ((int) (Math.random()*height));
    }
   
    public int getX(){
        return x;
    }
   
    public int getY(){
        return y;
    }
   
    public void setX(int newX){
        x = newX;
    }
   
    public void setY(int newY){
        y = newY;
    }
}
 

Aljosha.k

Mitglied
Die Logik ist zur Zeit nicht richtig implementiert, da ich erstmal schauen wollte wie es sich mit einer festen Anzahl an Partikeln verhält. Da selbst dies nicht zu funktionieren scheint, ist es für mich sinnvoller zu erst die derzeitigen Probleme zu beseitigen. Vielleicht ist "ruckeln" auch ein wenig falsch ausgedrückt, es ist eher das flackern der repaint() Methode. Existiert eine andere Möglichkeit außer Mutltithread dies zu beheben?
 

Robat

Top Contributor
1. Zeichne nicht in paint. Zeichne lieber in paintComponent
2. In der paintComponent / paint Methode solltest du wirklich nur zeichnen. Das updaten der Partikel solltest du außerhalb in einem Thread realisieren.
3. Nutze bspw einen Thread. Dort kannst du nach jedem Durchlauf ein delay einbauen. Damit kannst du deine FPS etwas minimieren und das könnte auch das flackern beheben. Momentan rufst du einfsch zu oft hinter einander repaint auf (mMn)
 
Zuletzt bearbeitet:

Aljosha.k

Mitglied
Vielen Dank für die Vielzahl an Antworten, ich werde das Projekt zu nächst ruhen lassen und mich mit den Grundlagen der Grafikprogrammierung beschäftigen.

MfG Aljosha
 

Aljosha.k

Mitglied
Ich habe mich entgegen meines letzten Posts doch dazu entschieden an meinem Projekt weiterzuarbeiten und bin auch auf Erfolg gestoßen. Nun habe ich jedoch ein weiteres "Problem" auch wenn man dieses nicht wirklich so nennen kann.
Das Programm läuft ruckelfrei und erfüllt seinen Zweck abgesehen davon, dass die Kollisionsabfrage nur auf den letzten "festen" Pixel bezogen wird... Jedoch dauert es eine halbe Ewigkeit( + zufällig Zeit :p ) bis sich ein Pixel mit einem anderen Kollidiert, insbesondere das erste. Den Timer zum aktualisieren habe ich schon auf 1ms gesetzt und kann somit nicht weiter hinuntergehen. Existiert eine andere Möglichkeit den Prozess zu beschleunigen oder habe ich etwas falsch implementiert?

MfG Aljosha
Main:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JPanel implements ActionListener{
 
    private int _width = 800;
    private int _height = 800;
    private int numberPixels = 100;
    private int pixelSize = 5;
    private List<Pixel> pixels = new ArrayList<Pixel>();
 
 
    private String s = "";
    private int distance;
 
    private Timer t;
 
    public Main() {
        addKeyListener(null);
        setPreferredSize(new Dimension(_width, _height));
        setBackground(Color.darkGray);
 
        pixels.add(new Pixel(_width/2, _height/2));
        spawnPixel();
        t = new Timer(1, this);
        t.start();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        move();
        repaint();
    }
 
    private void move() {
        int r = (int)((Math.round( Math.random() )*2 ) )-1;
        pixels.get(pixels.size()-1).setX(pixels.get(pixels.size()-1).pixel_x+r);
        r = (int)((Math.round( Math.random() )*2 ) )-1;
        pixels.get(pixels.size()-1).setY(pixels.get(pixels.size()-1).pixel_y+r);
    
        if( (int)Math.sqrt( Math.pow( (pixels.get(pixels.size()-1).pixel_x ) - _width/2, 2) + Math.pow( (pixels.get(pixels.size()-1).pixel_y - _height/2) , 2) ) > 350 ) {
            pixels.remove(pixels.size()-1);
            spawnPixel();
        }
    
        collide();
    }

    private void spawnPixel() {
        int pixel_x = _width/2 + (int)((Math.random() )* (_width)  ) -400;
        int pixel_y = _width/2 + (int)((Math.random() )* (_width)  ) -400;
    
    
        pixels.add(new Pixel(pixel_x, pixel_y));
    }
 
    private void collide() {
        boolean collided = false;
        int secPixelX;
        int secPixelY;
        int firPixelX = pixels.get(pixels.size() - 1).pixel_x;
        int firPixelY = pixels.get(pixels.size() - 1).pixel_y;
    
        for(int i = 0; i < pixels.size()-1; i++) {
            secPixelX = pixels.get(i).pixel_x;
            secPixelY = pixels.get(i).pixel_y;
            s = "Distance: " + distance + " Pos1: " + firPixelX+","+firPixelY+" Pos2: " + secPixelX + "," + secPixelY + " NumberPixels: "+pixels.size() + " i: "+i;
        
            distance = (int)Math.sqrt( Math.pow( (secPixelX - firPixelX) , 2) + Math.pow( (secPixelY - firPixelY) , 2) );
    
            if(distance < pixelSize/2) {
                collided = true;
            }
        }

        if(pixels.size() < numberPixels && collided) {
            collided = false;
            spawnPixel();
        }
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    
        int pixel_x, pixel_y;
    
    
    
        g.setColor(Color.cyan);
        g.drawString(s, 10, 10);
    
        for(int i = 0; i < pixels.size(); i++) {
            pixel_x = pixels.get(i).pixel_x;
            pixel_y = pixels.get(i).pixel_y;
        
            g.fillRect(pixel_x, pixel_y, pixelSize, pixelSize);
        
        }
    
        Toolkit.getDefaultToolkit().sync();
    }

}

Pixel:

Pixel:
Code:
public class Pixel {
    public int pixel_x;
    public int pixel_y;
 
    public Pixel(int x, int y) {
        pixel_x = x;
        pixel_y = y;
    }
 
    public void setX(int x) {
        this.pixel_x = x;
    }
 
    public void setY(int y) {
        this.pixel_y = y;
    }
}

Fenster:
Code:
import java.awt.EventQueue;

import javax.swing.JFrame;

public class Fenster extends JFrame{
 
    public Fenster() {
        add( new Main());
    
        setResizable(false);
        pack();
    
        setTitle("DLA - Diffused Limited Aggregation");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
 
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame fenster = new Fenster();
                fenster.setVisible(true);
            }
        
        
        });
    }
}
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Du musst nicht zwingend nach jedem Move ein repaint machen. Der Timer mit Repaint war für die FPS erwähnt. Du musst nicht öfter repainten als das menschliche Auge wahr nimmt. Eine Bewegung findet auch in der Natur viel öfter statt
 

Aljosha.k

Mitglied
Also sollte ich die repaint() Methode nicht in der ActionPerformed Methode welche durch den Timer getaktet wird aufrufen sondern seperat beispielsweise mit einer Abfrage wie:

Code:
repaintValue++;

if(repaintValue % 50 == 0){
    repaint()
}

?
 

MoxxiManagarm

Top Contributor
Doch Repaint im Timer aber die Bewegung musst du nicht im Timer machen. Die Bewegung kann zb auch in einem einfachen Thread passieren.

Außerdem habe ich den Code gerade grob überflogen. Ich sehe du verwendest das letzte Element der Arraylist als Bewegungteilchen. Das würde ich nicht tun die vielen Zugriffe auf die Arraylist in Move sind nicht optimal und zudem sehr unübersichtlich/schwer lesbar). Erstelle besser eine Arraylist angedockter Teilchen und ein einzelnes Teilchen welches sich bewegt. Sobald es andockt fügst du es der Arraylist hinzu
 

Aljosha.k

Mitglied
Ich habe nun deine Anregungen aufgenommen und sie implementiert( bzw. komplett neu geschrieben =D ) nun fängt der Code an seeeeeehr langsam zu werden mit zunehmender Anzahl von Pixeln, welche Möglichkeiten habe ich nun dagegen anzuwirken? Sollte ich anstatt des ganzen Bildes nur die Ausschnitte der neu angedockten Pixel neuzeichnen und wenn ja wie ist dies Möglich?
Wenn Jemand Interesse daran hat, hier ist der neue Code, ich bin auch sehr offen für weitere Optimierungsvorschläge:

EDIT: Gerade gelesen, dass eine Möglichkeit besteht ein Image zu erstellen und die einzelnen Pixel zu bearbeiten, wäre das ein guter Versuch hierfür? Also nur die einzelnen Pixel zu Manipulieren und das Bild neuzuladen.

Main:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JPanel implements ActionListener {

    protected static final int _width = 800;
    protected static final int _height = 800;
    private int pixel_x;
    private int pixel_y;
    private int pixel_s;
    private static int pixel_max = 1000;
    protected static Pixel actPixel;
 
    private Move move = new Move();
 
    protected static List<Pixel> pixelList = new ArrayList<Pixel>();
    private static int listSize = 0;
 
    private Timer t;
 
    public Main() {
        setPreferredSize(new Dimension( _width, _height));
        setBackground(Color.DARK_GRAY);
   
        actPixel = new Pixel( _width/2, _height/2 );
   
        t = new Timer(1, this);
        t.start();
        move.start();
   
    }
 
    protected static void createPixel() {
        if(pixelList.size() < pixel_max) {
            actPixel = new Pixel( _width/2, _height/2 );
        }
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
        if(listSize != pixelList.size()) {
            repaint();
            listSize = pixelList.size();
        }
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.cyan);
   
        g.fillRect(actPixel.getX(), actPixel.getY(), actPixel.getSize(), actPixel.getSize());
   
        if(pixelList.size() > 0) {
            for(int i = 0; i < pixelList.size(); i++) {
                pixel_x = pixelList.get(i).getX();
                pixel_y = pixelList.get(i).getY();
                pixel_s = pixelList.get(i).getSize();
       
                g.fillRect(pixel_x, pixel_y, pixel_s, pixel_s);
            }
        }
    }

}

Pixel:
Code:
public class Pixel {
    private int x;
    private int y;
    private final int size = 5;
 
    public Pixel(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public int getX() {
        return this.x;
    }
 
    public int getY() {
        return this.y;
    }
 
    public int getSize() {
        return this.size;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
}

Fenster:
Code:
import java.awt.EventQueue;

import javax.swing.JFrame;

public class Frame extends JFrame {

    public Frame() {
        add( new Main());
   
        setResizable(false);
        pack();
   
        setTitle("DLA - Diffused Limited Aggregation");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

    }
 
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame fenster = new Frame();
                fenster.setVisible(true);
            }
       
       
        });
    }

}

Move: (Thread)
Code:
public class Move implements Runnable{
    Thread t;
 
    @Override
    public void run() {
   
        while(true) {
            int r = (int)((Math.round( Math.random() )*2 ) )-1;
            Main.actPixel.setX( Main.actPixel.getX() + r );
       
            r = (int)((Math.round( Math.random() )*2 ) )-1;
            Main.actPixel.setY( Main.actPixel.getY() + r );
   
            collision();
       
            try {
                Thread.sleep(0);
            } catch (InterruptedException e) {
       
                e.printStackTrace();
            }
        }
   
    }
 
       public void start () {
              System.out.println("Starting ");
              if (t == null) {
                 t = new Thread (this);
                 t.start ();
              }
       }
   
       private void collision() {
           int temp_X = 0, temp_Y = 0;
           double Dist = 0;
       
           if(Main.actPixel.getX() <= 0 || Main.actPixel.getX() >= (Main._width - Main.actPixel.getSize()) || Main.actPixel.getY() <= 0 || Main.actPixel.getY() >= (Main._height - Main.actPixel.getSize())) {
           
               Main.pixelList.add(Main.actPixel);
               Main.createPixel();
           
           } else    if(Main.pixelList.size() > 0) {
               for(int i = 0; i < Main.pixelList.size(); i++) {
                   temp_X = Main.pixelList.get(i).getX();
                   temp_Y = Main.pixelList.get(i).getY();
               
                   Dist = Math.sqrt( Math.pow( (Main.actPixel.getX() - temp_X), 2) + Math.pow(( Main.actPixel.getY() - temp_Y ), 2));
               
                   if(Dist < Main.actPixel.getSize()) {
                       Main.pixelList.add(Main.actPixel);
                       Main.createPixel();
                   }
               }
           }
       }
}
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Hier ein paar Anmerkungen:
1) Du zeichnst immernoch jede Sekunde. 60FPS (für das menschliche Auge mehr als ausreichend) wären 16,666ms.
2) So ganz verstehe ich den Sinn von listSize nicht. Bitte erkläre ihn mir.
3) Get rid of static, mach lieber Move auch in Main
4) Wozu schläft ein Thread 0ms? Noch nie gesehen. Hat das irgendeine Bedeutung oder könntest du den Part entfernen?
5) Main ist bei dir runnable und Thread ist auch runnable. Du hast gewisser Maßen 2 Threads. Schau dir z.B. die Beschreibung hier nochmal an: https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
6) Du solltest die Collisionsdetection auch abbrechen wenn du eine gefunden hast, sonst rennt die Loop, welche immer größer wird, weiter. Also mach am besten ein return nach createPixel
7) Die Wahrscheinlichkeit bei später angefügten Pixeln in der Liste auf eine Collision zu treffen ist höher als bei den vorderen. Daher wäre es sinnig die Loop in der Collision rückwärts zu durchlaufen.
8) if(Main.pixelList.size() > 0) kannst du dir sparen, wenn du 0 hast wird die Loop eh nicht durchlaufen.

Das wars für den Moment ;-)
 
Zuletzt bearbeitet:

Aljosha.k

Mitglied
Ich melde mich mal wieder, ich habe alles Tipps und Ratschläge befolgt und das Programm abgeändert, nun funktioniert alles so wie es soll und ich bin dabei die performance auszutesten. Dabei habe ich nun zwei Wege gefunden, einmal über die komplette Liste zu iterieren und zu schauen ob mein aktuelles Pixel sich mit anderen überlappt und eine Area aus allen "angedockten" Pixeln zu erschaffen und diese dann per intersects() Methode abzuprüfen. Jedoch ist alles zu langsam(wobei das Iterieren der Liste um ein deutliches schneller von der Hand geht als die Area zu überprüfen.) Was könnte ich noch tun, damit es schneller wird?

MoveThread
Code:
import java.awt.Color;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;

public class MoveThread implements Runnable {
    Thread t;
   
    private final static int _width = 400;
    private final static int _height = 400;

    Random r;
    private double Dist = 0;
   
    int i;
   
    private final int pixel_max =  5000; //(_width*_height)/100;
    private List<Pixel> pixelList = new ArrayList<Pixel>();
   
    private Color pixel_color;
   
    private Pixel actPixel = new Pixel(_width/2, _height/2);
   
    @Override
    public void run() {
       
        r = new Random(System.currentTimeMillis());
       
        while(Main.calc_status) {
            actPixel.setX( ( r.nextBoolean() ? 1 : -1) );
            actPixel.setY( ( r.nextBoolean() ? 1 : -1) );
           
            if(collision()) {
                createPixel(r);
            };   
        }
    }
   
    public void start () {
          if (t == null) {
                 t = new Thread (this);
                 t.start ();
                 System.out.println("Thread Start");
          }
    }
   
    public void stop () {
        t = null;
        t.interrupt();
    }
   
       private boolean collision() {
           if (pixelList.size() > pixel_max) {
               System.out.println("Size: " + pixelList.size());
               paintImage();
           }
           
           for(int i = 0; i < pixelList.size(); i++) {

               if(actPixel.getBounds().intersects(pixelList.get(i).getBounds())) {
                   return true;
               }
           }

           if(actPixel.getX() < 2 || actPixel.getY() < 2 || actPixel.getX() > _width - 1 || actPixel.getY() > _height - 1) {
               return true;
           }

        return false;       
       }
       
       public void paintImage() {
            BufferedImage output = new BufferedImage(_width+2, _height+2, BufferedImage.TYPE_INT_ARGB);
            int b;
           
           
            for(int i = 0; i < pixelList.size() - 1; i++) {
                Dist = Math.sqrt( Math.pow( (pixelList.get(i).getX() - _width/2), 2) + Math.pow(( pixelList.get(i).getY() - _height/2 ), 2));
               
                b = (int)( (255/ ((_width/2)) * Dist) % 255);
               
                pixel_color = new Color(0,0,b);
                try {
                    output.setRGB(pixelList.get(i).getX(), pixelList.get(i).getY(), pixel_color.getRGB());
                } catch (Exception e) {
                    System.out.println("Exception: " + e + " IndexAt: " + i + " ,Pos: "+ pixelList.get(i).getX() + " " + pixelList.get(i).getY());
                }
            }
           
            try {
                File outputfile = new File("saved.png");
                ImageIO.write(output, "png", outputfile);
            } catch (IOException e) {
                e.printStackTrace();
            }
           
            System.out.println("Fertig");

               System.exit(0);

        }
       
        private void createPixel(Random r) {
            pixelList.add(actPixel);
   
            if(pixelList.size() <= pixel_max) {

                actPixel = new Pixel( r.nextInt(_width)+1 ,r.nextInt(_height) + 1);
                i++;
                if(i%100==0) {
                    System.out.println(i);
                }
//                System.out.println("Pixel: " + i + " X: " + actPixel.getX() + " Y: " + actPixel.getY() );  // For Debug only
               
            } else {
            }
        }
}

Main:
Code:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Main {
   
    private static MoveThread move = new MoveThread();
    private static boolean first = true;
    protected static boolean calc_status = true;
   
   
    public Main() {
        move.start();
    };
   
    public static void main(String[] args) {
        System.out.println("Main");
         
        if(first) {
            first=false;
            new Main();
        }
    }
}

Pixel:
Code:
import java.awt.Rectangle;

public class Pixel {
    private int _x;
    private int _y;
    private final int _size = 2;
   
    public Pixel(int x, int y) {
        this._x = x;
        this._y = y;
    }
   
    public int getX() {
        return this._x;
    }
   
    public int getY() {
        return this._y;
    }
   
    public int getSize() {
        return this._size;
    }
   
    public void setX(int x) {
        this._x += x;
    }
   
    public void setY(int y) {
        this._y += y;
    }
   
    public Rectangle getBounds() {
        return (new Rectangle(_x, _y, _size, _size));
    }
   
}

MfG Joshi
 

Thallius

Top Contributor
Ich habe das jetzt nur überflogen aber es scheint mir, dass du alles über einzelne Pixel machst und dabei auch noch für jedes Pixel eine eigene Klasse hast. Ich denke das kann nur langsam werden.
Warum ezeugst du nicht einfach ein 2dArray von Ints und initialisierst alles Felder mit 0. Dann setzt du die ensprechenden Felder mit 1 und wenn du überprüfen willst ob Pixel oder banchbarte Pixel gesetzt sind ist das eine Abfrage im Array. Das sollte wesentlich schneller sein.

Gruß

Claus
 

MoxxiManagarm

Top Contributor
Ich denke bei QuadTree und dem pixelarray Array könnte ggf. Auf die Füße fallen dass es ja eigentlich nicht nur ein Pixel ("punkt") ist sondern ein Partikel mit einer Größe. Daher dürfen nicht nur die direkten Nachbarn betrachtet werden, sondern auch in einem bestimmten umkreis. An der Stelle ist die Benennung eventuell etwas irreführend. Aber ich bin auf deine Version mit den Vorschlägen gespannt.nichts desto trotz wäre hier die Laufzeit konstant und würde nicht mit steigender Größe explodieren
 

Aljosha.k

Mitglied
Die Abfrage bzgl. des Arrays habe ich ein wenig arg umständlich realisisert, vielleicht wisst ihr sie zu kürzen.
Der direkte Nachbar ist nicht die realitätsnähste Simulation aber es reicht für meine Ansprüche.

Eine Idee wäre noch, das ganze per switch/case zu lösen, indem man das Y Array ausgibt, in der Y-Abfrage bin ich aber im unklaren und sie scheint auch nicht so zu funktionieren wie sie soll.

Code:
           if(pixelArray[actPixel.getX()] != null) {
               if(pixelArray[actPixel.getX()][actPixel.getY()] == 1) {
                   return true;
               }else if(pixelArray[actPixel.getX()][actPixel.getY()+1] == 1) {
                   return true;
               }else if(actPixel.getY() != 0) {
                   if(pixelArray[actPixel.getX()][actPixel.getY()-1] == 1) {
                   return true;
                   }
               }
            }
          
           if(Arrays.asList(pixelArray).indexOf(new int[actPixel.getY()]) == actPixel.getX()) {
               System.out.println("Y");
               return true;
           }else if (Arrays.asList(pixelArray).indexOf(new int[actPixel.getY()]) == actPixel.getX()-1) {
               System.out.println("Y");
               return true;
           }else if (Arrays.asList(pixelArray).indexOf(new int[actPixel.getY()]) == actPixel.getX()+1) {
               System.out.println("Y");
               return true;
           }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben