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:
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) {}
}