Bezier [Rechteck/Punkt verschieben]

2

2k99

Hallo,
Ich habe ein kleines Problem..

Undzwar muss ich für die schule eine Bezierkurve erstellen, soweit kein Problem..
Nun muss man noch 4 Punkte auf verschiedenste Arten verschieben können..

Punkt1..drückt man linke maustaste irgendwo am screen soll der punkt 1 sich dort neu zeichnen
Punkt2..gleich nur mit rechter maustaste
Punkt3... gleich nur linke maustast+shift
punkt4 rechte maustaste+shift

nun so weit hab ich das auch geschafft.. (haben wir auch schon einen teil mit dem Prof. gemacht ;) )

Nun muss ich die Punkte aber auch verschieben können, d.h. ich klick auf einen Punkt und schieb ihn dann einfach wo anders hin.

Ich habe es zwar soweit geschafft, dass ich es verschieben kann, aber ich kann hinklicken wo ich will und muss nicht auf den Punkt selbst klicken um ihn zu verschieben.

Um die Punkte herum habe ich rechtecke gemacht. Nun die Punkte kann man nur verschieben wenn man die tastenkombinationen für die punkte wie oben + ALT drückt und sich in dem Rechteck befindet.
Doch dass krieg ich einfach nicht hin..

--
hier ist mal mein momentaner code


Code:
   import java.awt.*;
   import java.awt.event.*;
   import javax.swing.*;
   import javax.swing.event.*;
   
   public class BezierPanel extends JPanel {
        private Point p1, k1, p2, k2;
        private int h, w;
        private Rectangle rp1, rp2, rk1, rk2;
        private boolean dragging1=false,dragging2=false,dragging3=false,dragging4=false;
        private int eps = 10;
        // construtors
        public BezierPanel(){
            setBackground( new Color(139,188,19 ) );
            setBounds( 0, 0, 800, 600);
            w = getWidth();
            h = getHeight();
            p1 = new Point(-w/3,0);
            k1 = new Point(-w/4,h/3);
            p2 = new Point( w/3,-h/4);
            k2 = new Point( w/4,-h/4);
            
             rp1 = new Rectangle( p1.x - eps, p1.y - eps, 2*eps, 2*eps );
             rp2 = new Rectangle( p2.x - eps, p2.y - eps, 2*eps, 2*eps );
             rk1 = new Rectangle( k1.x - eps, k1.y - eps, 2*eps, 2*eps );
             rk2 = new Rectangle( k2.x - eps, k2.y - eps, 2*eps, 2*eps );
             
            addMouseMotionListener( new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e){
                    onMouseDragged( e );
                 }
            } );
            addMouseListener( new MouseAdapter(){
                public void mouseClicked( MouseEvent e ){
                    onMouseClicked( e );
                }
                public void mousePressed( MouseEvent e  ){
                    onMousePressed( e );
                }
            } );
       }
       public void paintComponent( Graphics g ){
         super.paintComponent( g );
         Graphics2D g2d = (Graphics2D) g;
         g2d.translate( w/2, h/2 );
         g2d.scale( 1, -1 );
         g2d.drawLine( -w/2,0 , w/2, 0 );
         g2d.drawLine( 0, -h/2, 0 , h/2 );
         g2d.setStroke(new BasicStroke(4));
         g2d.drawLine( p1.x, p1.y, k1.x, k1.y );
         g2d.drawLine( p2.x, p2.y, k2.x, k2.y );
         BezierPunkt bp;
         g2d.drawRect(p1.x - eps, p1.y - eps, 2*eps, 2*eps );
         g2d.drawRect(p2.x - eps, p2.y - eps, 2*eps, 2*eps );
         g2d.drawRect(k1.x - eps, k1.y - eps, 2*eps, 2*eps );
         g2d.drawRect(k2.x - eps, k2.y - eps, 2*eps, 2*eps );
         int bx, by;
         double  t = 0;
         while( t <= 1 ){
           bp= new BezierPunkt( t, p1, k1, p2, k2 );
           g2d.drawOval( bp.x, bp.y, 4,4);
           t+=0.001;
         }
       }
        //  Eventhandlingmethoden
       public void onMouseClicked( MouseEvent e ){
         int posX = e.getX();
         int posY = e.getY();
       }
       public void onMousePressed( MouseEvent e ){
         int posX = e.getX();
         int posY = e.getY();
         posX = -( w/2 - posX );
         posY = ( h/2 - posY );
         
         int moveP1   = e.BUTTON1_DOWN_MASK;
         int moveK1   = e.BUTTON1_DOWN_MASK | e.SHIFT_DOWN_MASK;
         int moveP2   = e.BUTTON3_DOWN_MASK;
         int moveK2   = e.BUTTON3_DOWN_MASK | e.SHIFT_DOWN_MASK;
         int dragP1 = e.BUTTON1_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragK1 = e.BUTTON1_DOWN_MASK | e.SHIFT_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragP2 = e.BUTTON3_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragK2 = e.BUTTON3_DOWN_MASK | e.SHIFT_DOWN_MASK | e.ALT_DOWN_MASK;
         int state   = e.getModifiersEx();
   
           if( state == moveP1 ){
             p1.move( posX, posY );
         } else if( state == moveK1 ){
             k1.move( posX, posY );
         } else if( state == moveP2 ){
             p2.move( posX, posY );
         } else if( state == moveK2 ){
             k2.move( posX, posY );
         } else if( state == dragP1){
              p1.move( posX, posY);
         } else if( state == dragK1){
             k1.move( posX, posY);
         } else if( state == dragP2){
             p2.move( posX, posY);
         } else if( state == dragK2){
             k2.move( posX, posY);
         }
         repaint();
   
            if(state==dragP1&& rp1.getBounds().contains(e.getPoint())){
            dragging1=true;
            } else if(!dragging2 && state==dragP2){
            dragging2=true;
            } else if(!dragging3 && state==dragK1){
            dragging3=true;
            }else if(!dragging4 && state==dragK2){
            dragging4=true;
            }
         
       }
        public void onMouseDragged( MouseEvent e ){
         int dragP1 = e.BUTTON1_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragK1 = e.BUTTON1_DOWN_MASK | e.SHIFT_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragP2 = e.BUTTON3_DOWN_MASK | e.ALT_DOWN_MASK;
         int dragK2 = e.BUTTON3_DOWN_MASK | e.SHIFT_DOWN_MASK | e.ALT_DOWN_MASK;
         int state   = e.getModifiersEx();
         
         int posX = e.getX();
         int posY = e.getY();
         posX = -( w/2 - posX );
         posY = ( h/2 - posY );
   
           if(dragging1 ){
             p1.setLocation(posX,posY);
         } else if(dragging2 ){
             //onMousePressed(e);
             p2.setLocation(posX,posY);
         } else if(dragging3){
             k1.setLocation(posX,posY);
         } else if(dragging4){
             k2.setLocation(posX,posY);
         }
         repaint();
       }
   }


Vielleicht kann mir ja jemand helfen, hab schon gegoogelt aber nichts gefunden und es wäre wirklich sehr wichtig..
Kenn mich noch nicht so gut aus mit Java..
Bin dankbar für jede brauchbare Antwort
 
Zuletzt bearbeitet von einem Moderator:
ahja diese zeile hier:
Code:
 if(state==dragP1&& rp1.getBounds().contains(e.getPoint())){

damit hab ich mir gedacht einfach so zu kontrollieren ob sich der mauszeiger momentan innerhalb des rechtecks befindet, aber funktioniert anscheinend nicht..
 

Neue Beiträge

Zurück