Random driehoeken

Status
Niet open voor verdere reacties.

Passenger

Gebruiker
Lid geworden
19 nov 2007
Berichten
8
Oké nieuw opt forum, hoop dat jullie me wat kunnen helpen met men java oef.
Ik moet een een progje schrijven dat random driehoeken vertoont (random grootte en kleur) en deze blijft over elkaar zetten zoals bv een screensaver dat zou doen.

Nu 1 random driehoek met 1 random kleur is me gelukt, ik vind echter geen manier om dit ergens fatsoenlijk in een loop te zetten oid..

Men code van het panel:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import javax.swing.JPanel;
import java.util.Random;

public class Oef9Panel extends JPanel {

	public void paintComponent( Graphics g )
	{
        super.paintComponent( g ); 
        Random random = new Random(); 

        int xPoints[] = { random.nextInt(500), random.nextInt(500), random.nextInt(500) };
        int yPoints[] = { random.nextInt(500), random.nextInt(500), random.nextInt(500) }; 

        Graphics2D g2d = ( Graphics2D ) g;
        GeneralPath triangle = new GeneralPath(); 

        triangle.moveTo( xPoints[ 0 ], yPoints[ 0 ] );       

        for ( int count = 1 ; count < xPoints.length; count++ )
        	triangle.lineTo( xPoints[ count ], yPoints[ count ] );

        triangle.closePath(); 

        for ( int count = 1 ; count <= 20; count++ ) 
        {
           g2d.setColor( new Color( random.nextInt( 256 ),
              random.nextInt( 256 ), random.nextInt( 256 ) ) );

           g2d.fill( triangle ); 
        } 
     } 


}

Hoe los ik dit best op?
 
Ik weet van school dat je een herhaling in Java moet aanbrengen met een while-lus.
Het ziet er dan zo uit:

PHP:
int voorbeeld;
voorbeeld = 0;
while ( voorbeeld < 2)
{
   // hier komt te staan wat moet worden gedaan zolang voorbeeld kleiner is dan 2.
   bijvoorbeeld:
   voorbeeld = voorbeeld + 1;
}

Op deze pagina kan je daar nog meer over lezen. :)
 
Laatst bewerkt:
Code:
int voorbeeld = 0
while ( voorbeeld < 2)
{
   // hier komt te staan wat moet worden gedaan zolang voorbeeld kleiner is dan 2.
   //bijvoorbeeld:
   voorbeeld++;
}

Code even wat ingekort :)
Wat je dan nog kan toevoegen om een echte screensaver te maken is:

Code:
int voorbeeld = 0
int waarde = 10
while ( voorbeeld < 10)
{
   // hier komt te staan wat moet worden gedaan zolang voorbeeld kleiner is dan 2.
   //bijvoorbeeld:
   if(voorbeeld == waarde -1){
   voorbeeld = 0;
   } else{
   voorbeeld++;
  } 
}

Er wel om denken. Je maakt zo een infinite loop(een loop zonder einde), dus je kan een stackoverflow kijgen als je geheugen het niet kan verwerken :)
Als je dat wil doen, dan zou je een 'wachtfunctie' in de loop kunnen zetten.

Uitleg over de wait methode van Java: http://www.janeg.ca/scjp/threads/wait.html
 
Offtopic:
Die infinite loop is wat omslachtig Killer :p
Code:
while (true) {
//Hier je code.
}
 
Werkt ook :p ik doe meestal naderhand nog aan optimizing, dan vis ik die er wel weer uit :p

De reden waarom ik het zo neer heb gezet, was dat je dan weer naar de originele grootte van de driehoek gaat..
 
Laatst bewerkt:
Oke, ehm bijkomend probleem is dat ik niet goed weet hoe ik die punten opnieuw moet laten initializen :confused:

Die declaraties in een loop steken gaat niet, dan wou ik eens proberen van een met een for loopje ze opnieuw er in te zetten dus zoeits:

Code:
for (int i = 0; i < 3; i++){
  xPoints[i] = random.NextInt(500);
  ..
}

Werkt ook weer niet voor een of andere reden.. wordt er langzaam zot van :P

Nog iets, wat doet de method Repaint(); exact?
Als ik die gewoon erbij zet blijft 'm ook driehoeken tekenen maar dan repaint die het hele panel zeker? en dat zal de bedoeling wel niet zijn.
 
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import javax.swing.JPanel;
import java.util.Random;

public class Oef9Panel extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g); 
        Random random = new Random(); 

        while (true) {
            int xPoints[] = {random.nextInt(500), random.nextInt(500), random.nextInt(500)};
            int yPoints[] = {random.nextInt(500), random.nextInt(500), random.nextInt(500)}; 

            Graphics2D g2d = (Graphics2D) g;
            GeneralPath triangle = new GeneralPath(); 

            triangle.moveTo( xPoints[0], yPoints[0]);       

            for (int i= 0; i < xPoints.length; i ++) {
            	triangle.lineTo(xPoints[i], yPoints[i]);
            }

            triangle.closePath(); 

            g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            g2d.fill(triangle); 
            //Misschien nog iets van een wait of thread.sleep erin...
        }
    } 
}

Heb je hier wat aan? Is niet getest, heb jouw stukje code aangepast.

[edit] Hm ik weet niet zeker of die while-lus in de paintComponent goed gaat, aangezien die functie ook al vaak wordt aangeroepen.
Anders de lus eruit en wellicht de repaint() of invalidaterect() aanroepen? :)
 
Laatst bewerkt:
Ehm dat werkt niet, want als je dit stuk in een while loop zet:

Code:
        while (true) {
            int xPoints[] = {random.nextInt(500), random.nextInt(500), random.nextInt(500)};
            int yPoints[] = {random.nextInt(500), random.nextInt(500), random.nextInt(500)}; 

            Graphics2D g2d = (Graphics2D) g;
            GeneralPath triangle = new GeneralPath(); 

            triangle.moveTo( xPoints[0], yPoints[0]);       

            for (int i= 0; i < xPoints.length; i ++) {
            	triangle.lineTo(xPoints[i], yPoints[i]);
            }

Dan herkent dit stuk:

Code:
           g2d.setColor( new Color( random.nextInt( 256 ),
              random.nextInt( 256 ), random.nextInt( 256 ) ) );

           g2d.fill( triangle );

Die "g2d" en die "triangle" niet meer, die zijn dan wsl enkel beschikbaar binnen de while lus ?


En ja, als ik gewoon repaint(); vanonder in de paintComponent methode bijzet, dan blijft hij driehoeken tekenen maar dit gaat supersnel en volges mij wordt telkens de achtergrond ook gereset dus de driehoeken worden niet over elkaar getekend..
 
Dan herkent dit stuk:

Code:
           g2d.setColor( new Color( random.nextInt( 256 ),
              random.nextInt( 256 ), random.nextInt( 256 ) ) );

           g2d.fill( triangle );

Die "g2d" en die "triangle" niet meer, die zijn dan wsl enkel beschikbaar binnen de while lus ?

Moet je nog even goed kijken wáár ik mijn while-lus afsluit ;)

Edit: de accolade-sluiten op de regel na mijn toegevoegde commentaar over de "wait / sleep" is die van de while.. :)
 
Je hebt alleen een paneel hè?
Want wat je dan kan doen:
JFrame aanmaken.
Op deze JFrame een Oef9Panel zetten.
Daardoor krijg je het wel weergegeven.

Voorbeeld hiervan:
Code:
public class GUI extends javax.swing.JFrame{
//height en width zal je dan zelf waarden aan dienen te geven wat jou het beste uitkomt.
  public GUI() {
     initcomponents();
     Oef9Panel _paneel = new Oef9Panel();
     this.setsize(height, width);
     _paneel.setBounds(0,0, height, width);
     add(_paneel);
     _paneel.setVisible(true);
   }

  public static void main(String args[]) {
    java.awt.Eventqueue.invokeLater(new Runnable() {
      public void run() {
        new GUI().setVisible(true);
      }
    });
  }
}
 
Je vergeet alleen te zeggen dat je er ook direct een Thread (Runnable iig) bij opzet :p (wat m.i. niet nodig is?)
 
Passenger, wat is je mainclass?
Want je Oef9Panel heeft geen main methode

deze:

Code:
import java.awt.Color;
import javax.swing.JFrame;

public class DrawOef9 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame frame = new JFrame( "Drawing Triangles" );
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		Oef9Panel2 trianglesJPanel = new Oef9Panel2(); 
		trianglesJPanel.setBackground(Color.BLACK);
		frame.add( trianglesJPanel );
		frame.setSize( 500, 500 );
		frame.setVisible( true ); 

	}

}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan