• 25.05.2024, 00:16
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Java Problem bei Punktzeichnung

Dienstag, 5. Juli 2005, 17:23

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.

Re: Java Problem bei Punktzeichnung

Dienstag, 5. Juli 2005, 17:46

du könntest zum beispiel eine boolean-instanzvariable einführen, die du beim berechnen setzt und in der paint-methode abfragst.