Neuzeichnen

Status
Nicht offen für weitere Antworten.
J

Java-Noob003

Gast
Hallo,
habe ein kleines Programm zum Zeichnen von B-Spline-Kurven. Nun möchte ich noch, dass man bei Klick auf den Button neu zeichnen kann, d.h. die zuvor gezeichnete Kurve komplett gelöscht wird.

Hier der Quelltext:
Code:
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.applet.*;
import java.awt.Point;


public class BSpline extends Applet implements MouseListener, MouseMotionListener {
    Image buffer;
    Graphics bg;
    
    /*int var1 = 5;
    int var2 = 7;
    int var3 = 10;
    */
    int M;
    int maxM;
    
    Point P[];
    int drag = 0;
    
    public void init() {
        addMouseListener(this);
        addMouseMotionListener(this);
        setBackground(Color.white);
        Choice auswahl = new Choice(); 
        auswahl.add("5");
        auswahl.add("7"); 
        auswahl.add("10");
        add(auswahl); 
        auswahl.addItemListener (new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                 maxM = Integer.parseInt((String)e.getItem());
            }
        });
        Button button = new Button("neu zeichnen");
        add(button);
        button.addActionListener (new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                start();
            }
        });
   
        setCursor(Cursor.getPredefinedCursor(java.awt.Cursor.CROSSHAIR_CURSOR));        
        this.setBounds(0, 0, 640, 480); 
       
        Dimension d = getSize();
        buffer = createImage(d.width, d.height);
    }
    
    public void start() { 
        M = 0;
        
        P = new Point[100]; 
    }
    
    public void update(Graphics g) {
        paint(g);
    }
    
    public void paint(Graphics g) {
        double x, y;
        final int numberOfDivision = 100;
        double dt = 1.0 / (double)numberOfDivision;
        double c;
        int k;
        
        if(bg == null)
            bg = buffer.getGraphics();
        
        Dimension d = getSize();
        bg.setColor(Color.yellow);
        bg.fillRect(0, 0, d.width, d.height);
        
        if(M >= 1) {
            for(double t = -1.0; t < M; t += dt)
            {
                x = 0;
                y = 0;
                for(int j = -2; j <= M+2; j++) {
                    k = j;
                    if(k < 1)
                        k = 1;
                    if(k > M)
                        k = M;
                    c = coefficent(t - j);
                    x += (double)P[k].x * c;
                    y += (double)P[k].y * c;
                }
                
                bg.setColor(Color.red);
                bg.drawLine((int)x, (int)y, (int)x, (int)y);
            }
        }
        
        for(int i = 1; i <= M; i++) {
            if(drag == i)
                bg.setColor(Color.red);
            else
                bg.setColor(Color.blue);
            
            bg.fillOval(P[i].x-2, P[i].y-2, 5, 5);
            
            if(i != M) {
                bg.setColor(Color.blue);
                bg.drawLine(P[i].x, P[i].y, P[i+1].x, P[i+1].y);
            }
        }
        g.drawImage(buffer, 0, 0 ,this);
    }
    
    private double coefficent(double t) {
        double r;
        
        if(t < 0.0)
            t = -t;
        
        if(t < 1.0)
            r = (3.0 * t * t * t -6.0 * t * t + 4.0) / 6.0;
        
        else if(t < 2.0)
            r = -1.0 * (t - 2.0) * (t - 2.0) * (t - 2.0) / 6.0;
     
        else
            r = 0.0;
        
        return r; 
    }
    
    public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        drag = 0;
        
        for(int i = 1; i <= M; i++) {
            if(p.x <= P[i].x +3 && p.x >= P[i].x -3 && 
                    p.y <= P[i].y +3 && p.y >= P[i].y -3)drag = i;
        }
        
        repaint();
    }
    
    public void mouseClicked(MouseEvent e)
  {
     if(M < maxM)
     {
	M++;
	P[M] = e.getPoint();
     }

  }
  
  public void mouseReleased(MouseEvent e) {
      drag = 0;
      repaint();
  }
  
  public void mouseDragged(MouseEvent e) {
      Point p = e.getPoint();
      if(drag != 0)
          P[drag] = p;
      
      repaint();
  }

  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
  public void mouseMoved(MouseEvent e) {}
  

}
 

L-ectron-X

Gesperrter Benutzer
Mit clearRect() aus Graphics kannst du einen bestimmten Bereich "löschen", in dem der spezifizierte Bereich mit der Hintergrundfarbe gefüllt wird..
 
J

Java-Noob003

Gast
Erst mal danke für deine Antwort. Habe Folgendes dem Quelltext hinzugefügt, ohne Erfolg - leider.

Code:
...
import java.awt.Graphics2D.*;
...

...
        Button button = new Button("neu zeichnen");
        add(button);
        button.addActionListener (new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bg.clearRect(0, 0, size().width, size().height);
            }
        });

...
 

L-ectron-X

Gesperrter Benutzer
Ich würde dir ja gerne weiterhelfen, aber der Test deines Applets verlief negativ.
Es zeigt zwar die Components und den gelben Hintergrund an, aber offensichtlich tut sich sonst nichts auf der Appletfläche. Um etwas zu löschen, müsste ja erst mal etwas gezeichnet werden können...
 
J

Java-Noob003

Gast
Hmh, das ist merkwürdig. Bei mir läuft alles einwandfrei. Trotzdem danke, vielleicht postet mir ja nochjemand.
 
G

Guest

Gast
habe bei mir das Applet getestet. man kann erst zeichnen wenn man vorher was in combobox ausgewählt hat. dadurch wird die variable maxM eine wert zugewiesen. sonst ist sie am anfang 0

zum löschen des inhalt des Fensters:
mit bg.clearRect.... löscht du nur das Bild (Image) und nicht das Fenster selbst
versuch stattdessen das hier:
Code:
public void start() { 
        M = 0; 
        
        P = new Point[100];
       this.getGraphics().clearRect(0, 0, getSize().width, getSize().height);// inhalt des Fensters löschen
        // die Methode size() ist deprecated
       }

ich hoffe das hilft

Gruss
Youssef
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben