|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Bezier extends Applet implements MouseListener, ActionListener {
int i=0,k=0,u=0;
double x[]=new double[42]; //Kontrollpunkte
double y[]=new double[42];
double BezierKurveX[]=new double[101]; //Punkte auf aktueller Kurve
double BezierKurveY[]=new double[101];
double alleKurvenX[]=new double[1010]; //Punkte auf Bezier-Spline
double alleKurvenY[]=new double[1010];
Button resetbutton = new Button("Reset");
public void init(){
setSize(1380,920);
for(int i=0;i<42;i++) {
x[i]=-10;
y[i]=-10;
}
addMouseListener(this);
resetbutton.addActionListener(this);
resetbutton.setActionCommand("reset");
add(resetbutton);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("reset")) {
i=0;
k=0;
u=0;
for(int i=0;i<42;i++){
x[i]=-10;
y[i]=-10;
}
repaint();
}
}
public void mousePressed (MouseEvent e)
{
if (e.getButton()==1){ //linke Maustaste
if (i<=40){
x[i]=e.getX();
y[i]=e.getY();
i++;
}
if(i%4==0) {
kurvenberechnung();
punktberechnung1(x,y);
}
}
if (e.getButton()==3){ //rechte Maustaste
if (i<40&&i%2==0&&i>3){
punktberechnung2(x,y);
x[i]=e.getX();
y[i]=e.getY();
i++;
kurvenberechnung();
punktberechnung1(x,y);
}
}
repaint();
}
public void mouseReleased (MouseEvent e)
{
}
public void mouseClicked (MouseEvent e)
{
}
public void mouseEntered (MouseEvent e)
{
}
public void mouseExited (MouseEvent e)
{
}
public void mouseDragged (MouseEvent e)
{
}
void punktberechnung1 (double x[], double y[]) { //Berechnung zweier Kontrollpunkte um C1-Stetigkeit zu erreichen
x[i]=x[i-1];
y[i]=y[i-1];
i++;
x[i]=2*x[i-2]-x[i-3];
y[i]=2*y[i-2]-y[i-3];
i++;
}
void punktberechnung2 (double x[], double y[]) { //Berechnung eines weiternen Kontrollpunktes um C2-Stetigkeit zu erreichen
x[i]=2*x[i-2]-x[i-5];
y[i]=2*y[i-2]-y[i-5];
i++;
}
void kurvenberechnung (){ //Berechnung der aktuellen Kurve
double delta=1.0/100;
double t=0.0;
for(int j=0; j<=100;j++,u++){
BezierKurveX[j]=(int)((1-t)*(1-t)*(1-t)*x[k]+3*t*(1-t)*(1-t)*x[k+1]
+3*t*t*(1-t)*x[k+2]+t*t*t*x[k+3]);
alleKurvenX[u]=BezierKurveX[j];
BezierKurveY[j]=(int)((1-t)*(1-t)*(1-t)*y[k]+3*t*(1-t)*(1-t)*y[k+1]
+3*t*t*(1-t)*y[k+2]+t*t*t*y[k+3]);
alleKurvenY[u]=BezierKurveY[j];
t=t+delta;
}
k+=4;
}
public void paint(Graphics g){ // Grafik
g.setColor(Color.red);
for(int j=0;j<40;j++) {
g.fillOval((int)x[j]-3,(int)y[j]-3,7,7);
}
for(int j=0; j<u-1; j++) {
g.drawLine((int)alleKurvenX[j], (int)alleKurvenY[j], (int)alleKurvenX[j+1], (int)alleKurvenY[j+1]);
}
}
}
|
Wir haben folgendes Problem:
Der obige Quellcode ist unsere Projektarbeit in Computergrafik. Das ganze ist ein Applet, das Bezier-Splines berechnen und zeichnen soll. Der erste und zweite Kontrollpunkt der 2ten Kurve wird jeweils berechnet um Stetigkeit zu gewährleisten. Im Moment ist es so, dass die berechneten Kontrollpunkte sofort nach dem setzten des letzten Kontrollpunktes der ersten Kurve gezeichnet werden. Er soll die berechneten Kontrollpunkte aber erst zeichnen, wenn ein weiterer Kontrollpunkt für die Kurve gesetzt wird. Hat jemand ne Idee, wie man das realieren kann? Das Problem ist, dass nach jedem Mausklick ein repaint aufgerufen wird, und da die ersten beiden Kontrollpunkte der 2ten Kurve gleich nachdem alle Kontrollpunkte der ersten Kurve gesetzt wurden berechnet werden, werden sie natürlich auch gleich gezeichnet. Und wir kommen nicht drauf, wie verhindert werden kann, dass er die Punkte gleich zeichnet.