# Neuzeichnen



## Java-Noob003 (6. Jun 2005)

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:

```
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 (6. Jun 2005)

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


----------



## Java-Noob003 (6. Jun 2005)

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


```
...
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 (6. Jun 2005)

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...


----------



## Java-Noob003 (6. Jun 2005)

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


----------



## Guest (7. Jun 2005)

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:

```
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


----------



## Java-Noob003 (7. Jun 2005)

Danke Youssef, hat prima geklappt!


----------

