Punkte automatisch verbinden?

  • Themenstarter Themenstarter Astrid
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Astrid

Gast
Hallo,

ich möchte auf einer Malfläche gezeichnete Punkte automatisch durch eine Linie verbinden lassen.

Die Punkteerzeugung klappt, mir ist aber nicht ganz klar wie man über Arrays und drawLine bzw drawPloyLine die bereits gezeichneten Punkte verbinden kann. Bisher hab ich versucht jeweils ein Array dür die Punktkoordinaten und ein Array für die Linienkoordinaten zu erzeugen und dies bei einem Mouseevent (gezeichnter Punkt) ineinander zu übergeben.
Irgendwie klappt es nicht - Was mache ich flasch?

Hier der Code - danke im vorraus!

-----------------------------------------------------------------------------------------------------------------------------------------
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Cpzeich extends JFrame
{
	CFlaeche2 flaecheNeu2;          // Fläche für Darstellung der Funktionen
        int[] xPoints = new int[1000];  // x-Koordinaten Linie	
        int[] yPoints = new int[1000];  // y-Koordinaten Linie
        int nPoints = 0;                // Anzahl Punkte
	int [] m_Xpos = new int[1000];  // Mausposition
	int [] m_Ypos = new int[1000];	
	int auswahl = 0;
	
        // AUSGABE HAUPTPROGRAMM--------------------------------------------------------
	
	 public static void main (String[] args)
	        {
		Cpzeich test2 = new Cpzeich("Punktezeichner");
		test2.pack();
		test2.setSize(450,500);
		test2.setResizable(false);
		test2.show();
	        }	
         //KONSTRUKTOR-------------------------------------------------------------------
	
	Cpzeich(String titel)
	{
		super(titel);
		
		// Layout
		getContentPane().setLayout(new FlowLayout());
		// Malflaeche integrieren
		flaecheNeu2 = new CFlae[che2();
		getContentPane().add(flaecheNeu2);	
		// Schalter für Punkteingabe
		JButton Bu7 = new JButton("Punktfolge eingeben ...");
		getContentPane().add(Bu7);
		// Listenerklasse für Schliessen des Fensters anlegen;
		class CLauscher1 extends WindowAdapter
		{
		public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		}	
		// Event.Handeling für Schalter anlegen											
		class CActionLauscher implements ActionListener
		{											
		public void actionPerformed(ActionEvent e)
			{
				String label;
				
				label = e.getActionCommand();
						
					if (label.equals("Punktfolge eingeben ..."))
					{
					        
						auswahl = 1;	                      // verweis auf Punkteingabe			
					}										
			}
		}
											
		// Listener-Objekte anlegen
	
		Bu7.addActionListener(new CActionLauscher());	
		addWindowListener(new CLauscher1());  
	}
       // Zeichenfläche----------------------------------------------------------
	
	class CFlaeche2 extends Canvas
	{	
		int i= 0;
			
		// Innerere Klasse von CFlaeche 2 zum Abfangen der Mausklicks   
		class CMeinMausAdapter extends MouseAdapter
		{
			public void mousePressed(MouseEvent e)
			{		
				        // Die aktuelle Position der Maus merken und im Array für Punktkoordinaten abspeichern	
					
						m_Xpos[i+1] = e.getX();
						m_Ypos[i+1] = e.getY();
				
						// Malfläche aktualisieren
						repaint();

						//Kontrolle 	
						System.out.println("X:" + m_Xpos[i+1] );
						System.out.println("Y:" + m_Ypos[i+1] );
						
					       // ArraY hinzufügen
					       int [] xPoints = {m_Xpos[i],m_Xpos[i+1]};
					       int [] yPoints = {m_Ypos[i],m_Ypos[i+1]};
			}			
		}
	       //Konstruktor der Zeichenfläche
	        CFlaeche2()
	        {
		setBackground(Color.white);
		setForeground(Color.green);
		addMouseListener(new CMeinMausAdapter());
		}	
		
               //Paint-Methode------------------------------------------------------------------------------	
		public void paint(Graphics g)
		{
				//g.drawLine(10,10,100,100);
				
				if (auswahl == 1)
				        {	
					//Punkt bzw Pixel zeichnen
					g.setColor(Color.blue);
					// Koordinaten x,y ; Briete/Hühe; Durchmesser
					g.drawRoundRect(m_Xpos[i+1], m_Ypos[i+1], 10, 10, 10, 10 );
					g.fillRoundRect(m_Xpos[i+1], m_Ypos[i+1], 10, 10, 10 ,10);
					}
			
					g.drawPolyline(xPoints, yPoints,10);
					//g.drawPolyline(m_Xpos, m_Ypos,10);
		
								
	        }
			    
		// Fenstergrössen	
		public void update(Graphics g)
			{
        		paint(g);
			}		
		public Dimension getMinimumSize()
		{
		return new Dimension(400,400);
		}	
		public Dimension getPreferredSize()
		{
			return getMinimumSize();
		}
	}	
	
}


Edit von L-ectron-X: Codetags eingefügt.
 
Im Moment weißt du alle Punkte i+1 zu, weil i=0 ist, werden alle Punkte 1 zugeordnet, überschreiben also den vorhergegangenen.

Falls es das nicht ist:

Weiße die Punkte einem Point-Array zu. Die draw sieht dann so aus:
Code:
public void paint(Graphics g) {
                        //Zeichenfläche säubern, nicht unbedingt erforderlich
			g.clearRect(0, 0, this.getWidth(), this.getHeight());
			//farbe einstellen
                        g.setColor(Color.blue);
			for (int t = 0; t <= p.length - 1; t++) { //Für jeden Punkt
				if (p[t] != null) { //nur wenn ein punkt vorhanden ist
					System.out.println("X: "+t.getX()+"/"+t.getY()); //Koordinaten ausgeben
					g.drawOval((int)p[t].getX(), (int)p[t].getY(), 10, 10); //Oval malen
				}
				if(p[t]!=null && p[t+1]!=null){ // nur wenn ein nachfolger, zu dem eine linie führen muss, vorhanden ist
					g.drawLine((int) p[t].getX(), (int) p[t].getY(),
							(int) p[t + 1].getX(), (int) p[t + 1].getY()); //Linie zum Nachfolger
				}
			}
}

Wie die definition des arrays und die mouseClicked-methode aussehen, musste u selber rauskriegen, wir sind hier schließlich nicht da, um aufgaben für andere zu lösen...

Der Konstrukter von Point:

Code:
Point(double x, double y)

EDIT:

sry, mein erster Code warf ne Nullpointerexception, deshalb hab ich ihn nochmal geändert angepasst
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben