3D-Grafik Denkfehler bei Verschieben von Shapes

mac21

Aktives Mitglied
Hallo Community,
versuche mich zZ an einem kleinen "Spiel" im Steckkastenprinzip.
per zufall erezugte Shapes müssem dem jeweils deckgleichen Shape zugeordnet werden.
Nun bin ich soweit, dass 4 statische Shapes erzeugt werden (kreis, rechtecht, vieleck und dreieck)
und ein Shape, das man in das passende der 4 o.g. Shapes ziehen soll.

Soweit so gut, nun bleibt leider das Problem, dass das Verschieben des ZufallsShapes nicht richtig aussieht.
Wenn ich zB das Dreieck an einer Ecke ziehe, so springt die Maus in die Mitte des Dreiecks, sobald ich es in eine andere Position gebracht habe.
Es fällt mir leider sehr schwer, das zu beschreiben :p

Wer es versuchen will, wird feststellen, was ich meine.

Zur Klärung:
Java:
width/9*<irgendwas>
Damit steuere ich, in welchem 9. der Bildschirmbreite etwas dargestellt wird.
9 Teile: ABSTAND - KREIS - ABSTAND - RECHTECK - ABSTAND - VIELECK - ABSTAND - DREIECK - ABSTAND

TEST.java
Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.Scanner;

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

public class TEST extends JPanel {

	Dimension dim;
	Ellipse2D.Double circle;
	int circleWidth;
	int circleHeight;
	int circleX;
	int circleY;	
	int currentX;
	int currentY;
	int height;
	int lastX;
	int lastY;
	int rectWidth;
	int rectHeight;
	int rectX;
	int rectY;
	int polyRadius;
	int polyX;
	int polyY;
	int polyvertex;
	int[] starX;
	int[] starY;
	int width;		
	JFrame mainFrame;
	Polygon triangle;
	Rectangle2D.Double rectangle;
	RegularPolygon polygon;
	String shapeType;
	
	Shape test;

	public TEST() {
		initGUI();
		initListeners();
		initVariables();
		shapeType = createRandomShape();
	}

	public void updateLocation() {
		repaint();
	}

	public void initGUI() {
		
		this.setBackground(Color.LIGHT_GRAY);
		mainFrame = new JFrame();
		dim = Toolkit.getDefaultToolkit().getScreenSize();
		mainFrame.setTitle("Nele's Spiel");
		mainFrame.setDefaultCloseOperation(3);
		mainFrame.setUndecorated(true);
		mainFrame.setVisible(true);
		mainFrame.setSize((int) dim.getWidth(), (int) dim.getHeight());
		mainFrame.add(this);
	}

	public void initVariables() {
		height = (int) dim.getHeight();
		width = (int) dim.getWidth();
		currentX = width / 9 * 4 - width/9/2;
		currentY = 200;
		lastX = 0;
		lastY = 0;
		
		circleWidth = width / 9;
		circleHeight = circleWidth;
		circleX = width / 9;
		circleY = height - circleHeight - 100;
		
		rectWidth = width / 9;
		rectHeight = rectWidth;
		rectX = width / 9 * 3;
		rectY = height - rectHeight - 100;
		
		polyRadius = width / 9 / 2 + 15;
		polyX = (int) (width / 9 * 5.5);
		polyY = height - polyRadius - 90;
		polyvertex = 6;
		
		starX = new int[3];
		starY = new int[3];
		starX[0] = width / 9 * 7;
		starY[0] = height - 100;
		starX[1] = (int) (width / 9 * 7.5);
		starY[1] = (int) (height - 100 - width/9);
		starX[2] = width / 9 * 8;
		starY[2] = height - 100;
	}
	
	public void initListeners() {
		int delay = 2; // milliseconds

		this.addMouseMotionListener(new MouseAdapter() {
			public void mouseDragged(MouseEvent e) {
				currentX = e.getX()-width/9/2;
				currentY = e.getY()-width/9/2;
			}
		});

		this.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent e) {
				System.out.println("lastX: " + lastX);
				System.out.println("lastY: " + lastY);
				System.out.println("X: " + currentX);
				System.out.println("Y: " + currentY);
				
				if(true) {shapeType = createRandomShape();}
			}
			public void mousePressed(MouseEvent e) {

			}
		});

		ActionListener taskPerformer = new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				// refresh
				updateLocation();

			}
		};
		new Timer(delay, taskPerformer).start();
	}

	public String createRandomShape()
    {
		shapeType = null;
		
    	int zahl = (int)(Math.random() * 4 + 1);
    	switch(zahl) {
    	case 1:
    		return "circle";
    		
    	case 2:
    		return "rectangle";
    		
    	case 3:

    		return "polygon";
    		
    	case 4:
    		return "triangle";
    		
    	default:
    		return "";
    	}
    	
    }
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		circle = new Ellipse2D.Double(circleX, circleY, circleWidth, circleHeight);
		rectangle = new Rectangle2D.Double(rectX, rectY, rectWidth, rectHeight);
		polygon = new RegularPolygon(polyX, polyY, polyRadius, polyvertex);
		triangle = new Polygon();
		triangle.addPoint(starX[0], starY[0]);
		triangle.addPoint(starX[1], starY[1]);
		triangle.addPoint(starX[2], starY[2]);
		
		((Graphics2D) g).setColor(Color.RED);
		((Graphics2D) g).fill(circle);
		((Graphics2D) g).fill(rectangle);
		((Graphics2D) g).fill(polygon);
		((Graphics2D) g).fill(triangle);
		
		((Graphics2D) g).setColor(Color.BLACK);
		((Graphics2D) g).setStroke(new BasicStroke(3.0f));
		((Graphics2D) g).draw(circle);
		((Graphics2D) g).draw(rectangle);
		((Graphics2D) g).draw(polygon);
		((Graphics2D) g).draw(triangle);
		
		if(shapeType.equals("circle")){Ellipse2D.Double circ = new Ellipse2D.Double(currentX, currentY, circleWidth, circleHeight);
		((Graphics2D) g).draw(circ);}
		if(shapeType.equals("rectangle")){Rectangle2D.Double rect = new Rectangle2D.Double(currentX, currentY, rectWidth, rectHeight);
		((Graphics2D) g).draw(rect);}
		if(shapeType.equals("polygon")){RegularPolygon poly = new RegularPolygon(currentX+width/9/2, currentY+width/9/2, polyRadius, polyvertex);
		((Graphics2D) g).draw(poly);}
		if(shapeType.equals("triangle")){Polygon tri = new Polygon(new int[]{currentX,currentX + width/9/2,currentX+width/9}, new int[]{currentY+width/9,currentY,currentY+width/9}, 3);
		((Graphics2D) g).draw(tri);}

		
		 
		

	}

	public static void main(String[] args) {
		new TEST();
	}
}

RegularPolygon.java (um vielecke zu erzeugen)
Java:
import java.awt.*;

public class RegularPolygon extends Polygon {
    public RegularPolygon(int x, int y, int r, int vertexCount) {
        this(x, y, r, vertexCount, 0);
    }
    public RegularPolygon(int x, int y, int r, int vertexCount, double startAngle) {
        super(getXCoordinates(x, y, r, vertexCount, startAngle)
              ,getYCoordinates(x, y, r, vertexCount, startAngle)
              ,vertexCount);
    }

    protected static int[] getXCoordinates(int x, int y, int r, int vertexCount, double startAngle) {
        int res[]=new int[vertexCount];
        double addAngle=2*Math.PI/vertexCount;
        double angle=startAngle;
        for (int i=0; i<vertexCount; i++) {
            res[i]=(int)Math.round(r*Math.cos(angle))+x;
            angle+=addAngle;
        }
        return res;
    }

    protected static int[] getYCoordinates(int x, int y, int r, int vertexCount, double startAngle) {
        int res[]=new int[vertexCount];
        double addAngle=2*Math.PI/vertexCount;
        double angle=startAngle;
        for (int i=0; i<vertexCount; i++) {
            res[i]=(int)Math.round(r*Math.sin(angle))+y;
            angle+=addAngle;
        }
        return res;
    }
}


Primarfrage: Wie komme ich zu einer Lösung für mein Problem?
Sekundärfrage: Verbesserungsvorschläge willkommen. Wie erwähnt: erster Versuch mit Graphics bzw. Graphics2D
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Wo mache ich den Denkfehler? AWT, Swing, JavaFX & SWT 8
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
Redeason Objekte in meiner GUI verschieben AWT, Swing, JavaFX & SWT 1
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
frager2345 JTextLabel im Flowlayout verschieben AWT, Swing, JavaFX & SWT 4
U JavaFX CheckBoxen in GUI verschieben AWT, Swing, JavaFX & SWT 20
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
F Popup Menu etwas verschieben AWT, Swing, JavaFX & SWT 2
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
B JavaFX Viewport verschieben AWT, Swing, JavaFX & SWT 3
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
C Swing Geschachteltes GUI mit BorderLayout - Vertikal & horizontal Verschieben AWT, Swing, JavaFX & SWT 1
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
Y Titel Verschieben AWT, Swing, JavaFX & SWT 11
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
W Buttons verschieben AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
L JFrame von der Taskleiste zu den ausgeblendeten Symbolen verschieben AWT, Swing, JavaFX & SWT 2
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
D JSplitPane lässt sich nicht verschieben AWT, Swing, JavaFX & SWT 3
A JLabel verschieben AWT, Swing, JavaFX & SWT 9
bluerob JComponenten verschieben sich bei Fenster wechseln AWT, Swing, JavaFX & SWT 3
J jFrame verschieben verhindern AWT, Swing, JavaFX & SWT 4
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
R JTextField Eingabefeld innerhalb verschieben AWT, Swing, JavaFX & SWT 2
P Rectangle verschieben AWT, Swing, JavaFX & SWT 11
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
P Objekte anzeigen und verschieben - wie? AWT, Swing, JavaFX & SWT 6
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
B Element schrittweise verschieben AWT, Swing, JavaFX & SWT 2
G Swing JPanel per Maus verschieben AWT, Swing, JavaFX & SWT 5
K Button verschieben AWT, Swing, JavaFX & SWT 4
T 2D-Grafik gezeichnetes Bild verschieben - rand bleibt sichtbar AWT, Swing, JavaFX & SWT 2
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
propra Objekte auf Zeichenfläche verschieben AWT, Swing, JavaFX & SWT 2
P Swing JTable null values an das Ende verschieben AWT, Swing, JavaFX & SWT 2
M verschieben der Objekte in JPanel nur stückchenweise möglich AWT, Swing, JavaFX & SWT 14
B FlowLayout Buttons verschieben? AWT, Swing, JavaFX & SWT 13
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
R Swing Verschieben eines jButtons mittels MouseDragged AWT, Swing, JavaFX & SWT 4
Z 2D-Grafik Bild auf JPanel verschieben AWT, Swing, JavaFX & SWT 4
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Swing AbstractTableModel rows verschieben AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Shapes auf Zeichenfläche gleichmäßig verschieben AWT, Swing, JavaFX & SWT 5
Burny91 Swing Vertical JSplitPane lässt sich nicht nach rechts verschieben AWT, Swing, JavaFX & SWT 2
E Swing Rechteck und Kreise verschieben AWT, Swing, JavaFX & SWT 3
N verschieben von Dateien auf der Festplatte über TreePaths funktioniert nicht AWT, Swing, JavaFX & SWT 10
F Swing Objekte mit Maus verschieben AWT, Swing, JavaFX & SWT 8
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
T Swing JComboBox: Listeneinträge mit der Maus verschieben AWT, Swing, JavaFX & SWT 5
J showMessageDialog nicht über frame verschieben AWT, Swing, JavaFX & SWT 6
R Bereiche auf Panel verschieben AWT, Swing, JavaFX & SWT 2
U SWT Linien verschwinden nach Verschieben AWT, Swing, JavaFX & SWT 3
D Swing Spaltenköpfe verschieben sich nicht mit, wenn man an horizontaler Scrollbar zieht AWT, Swing, JavaFX & SWT 9
R Swing Frame verschieben AWT, Swing, JavaFX & SWT 3
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
D Swing Buttons verschieben sich bei umbennenung! AWT, Swing, JavaFX & SWT 3
R Rows und Columns in JTable verschieben? AWT, Swing, JavaFX & SWT 8
N RCP/SWT View durch Programm auf 2. Bildschirm verschieben AWT, Swing, JavaFX & SWT 2
O JTable Zeilen "nach oben" verschieben AWT, Swing, JavaFX & SWT 3
G Listenelemente mit der Maus verschieben AWT, Swing, JavaFX & SWT 4
K JTable Spalten nicht verschieben AWT, Swing, JavaFX & SWT 2
F Verschieben einer Messnadel auf einem Bild AWT, Swing, JavaFX & SWT 2
S Buttons verschieben mit Swing AWT, Swing, JavaFX & SWT 5
R JPanel durch "klicken und ziehen" verschieben AWT, Swing, JavaFX & SWT 8
H Tabelle: Spaltenüberschriften verschieben sich AWT, Swing, JavaFX & SWT 2
T Fenster verschieben => Wann fertig? AWT, Swing, JavaFX & SWT 8
T Synchrones Window-verschieben AWT, Swing, JavaFX & SWT 4
K JFrame verschieben / Inhalt ändern AWT, Swing, JavaFX & SWT 5
E Komponenten auf Zeichenfläche gruppieren u. verschieben AWT, Swing, JavaFX & SWT 3
Tom299 JTable - Spalten verschieben deaktivieren? AWT, Swing, JavaFX & SWT 3
F "Verschieben" des paint-Bereichs AWT, Swing, JavaFX & SWT 4
vogella JPanel Größe verschieben AWT, Swing, JavaFX & SWT 2
B Objekte auf Fenster verschieben. Bewegliche jPanels. AWT, Swing, JavaFX & SWT 5
J Nochmal Drag&Drop, ABER: Object verschieben AWT, Swing, JavaFX & SWT 2
D Rechtecke verschieben? AWT, Swing, JavaFX & SWT 2
S drag&drop bild verschieben AWT, Swing, JavaFX & SWT 14
M gezeichnete Punkte dynamisch verschieben mit mousedragged AWT, Swing, JavaFX & SWT 4
B Verschieben einer Komponente unterbinden AWT, Swing, JavaFX & SWT 6
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
P Bild verschieben AWT, Swing, JavaFX & SWT 2
J Grafik "sichtbar" verschieben AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben