Avatar billede htx98i17 Professor
09. januar 2010 - 09:30 Der er 10 kommentarer og
1 løsning

lave punktet x om i denne applet

Hej

Denne applet skal fremvise fotos af runde objekter med dekorationer rundt i kanten. Eksempelvis en porcelænstallerken.
Den roterer fotoet når man klikker på knapperne.

Jeg vil gerne have punktet X som der roteres om ændret, således at der man klikker på billedet centreres i appletten. Midten af appletten er også der som der skal roteres om. På den måde får men en "lige" rotering om det man skal kunne se på fotoet.

Kan nogen lave denne ændring? :)



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ImageFunApplet extends JApplet {
    private double v;
    private int x;
    private int y;
    private String imgnam;
    private JLabel imgicn;
    public void init() {
        v = 0;
        x = getWidth()/2;
        y = getHeight()/2;
        imgnam = null;
        imgicn = null;
        getContentPane().setLayout(new BorderLayout());
        JPanel rot = new JPanel();
        rot.setLayout(new GridLayout(1, 4));
        JButton clockfast = new JButton("Rotate ++");
        clockfast.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v += 5;
                update();
            }
        });
        rot.add(clockfast);
        JButton clock = new JButton("Rotate +");
        clock.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v += 1;
                update();
            }
        });
        rot.add(clock);
        JButton cclock = new JButton("Rotate -");
        cclock.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v -= 1;
                update();
            }
        });
        rot.add(cclock);
        JButton cclockfast = new JButton("Rotate --");
        cclockfast.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v -= 5;
                update();
            }
        });
        rot.add(cclockfast);
        JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v = 0;
                x = getWidth()/2;
                y = getHeight()/2;
                update();
            }
        });
        rot.add(reset);
        getContentPane().add(rot, BorderLayout.SOUTH);
        update();
    }
    public void setImage(String imgnam) {
        this.imgnam = imgnam;
        v = 0;
        x = getWidth()/2;
        y = getHeight()/2;
        update();
    }
    private void update() {
        if(imgicn != null) {
            getContentPane().remove(imgicn);
        }
        if(imgnam == null) {
            imgicn = new JLabel(getBlankIcon());
        } else {
            imgicn = new JLabel(getIcon());
        }
        imgicn.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent ev) {
                x = ev.getPoint().x;
                y = ev.getPoint().y;
                update();
            }
            public void mouseEntered(MouseEvent ev) {
            }
            public void mouseExited(MouseEvent ev) {
            }
            public void mousePressed(MouseEvent ev) {
            }
            public void mouseReleased(MouseEvent ev) {
            }
        });
        getContentPane().add(imgicn, BorderLayout.CENTER);
        invalidate();
        validate();
        getContentPane().repaint();
    }
    private ImageIcon getIcon() {
        ImageIcon imgicn = new ImageIcon(getClass().getClassLoader().getResource(imgnam));
        BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = bi.createGraphics(); 
        AffineTransform at = new AffineTransform();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        at.translate(x - imgicn.getIconWidth()/2, y);
        at.rotate(Math.toRadians(v), bi.getWidth()/2 - x + imgicn.getIconWidth()/2, bi.getHeight()/2 - y + imgicn.getIconHeight()/2);
        g2.drawImage(imgicn.getImage(), at, this); 
        g2.transform(at);
        g2.dispose(); 
        return new ImageIcon(bi);
    }
    private ImageIcon getBlankIcon() {
        BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = bi.createGraphics(); 
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        g2.dispose(); 
        return new ImageIcon(bi);
    }
}
Avatar billede htx98i17 Professor
15. april 2010 - 17:42 #1
Hva så, ingen bud? :)
Avatar billede arne_v Ekspert
17. april 2010 - 22:01 #2
Jeg har jo kigget på det en gang uden at kunne ramme præcist den effekt du ønsker.
Avatar billede htx98i17 Professor
18. april 2010 - 07:14 #3
yes, men er det fordi at jeg ikke kunne forklare mig ordentligt, eller er det pga., det for mig meget utænkelige, at du ikke ved hvordan man gør? :)
Avatar billede arne_v Ekspert
19. april 2010 - 02:52 #4
Jeg forstod ikke præcis hvilken effekt du ville have.

Om jeg kan lave den effekt står indtil videre hen i det uvisse.

Kunne du eventuelt lave en illustration i et tegneprogram ?

Vi har udgangs billede, så klikker man i punkt (x,y) og roterer v grader og så har man et slut billede?

Det var langt nemmere hvis du selv kunne muntre dig med AffineTransform !
Avatar billede htx98i17 Professor
19. april 2010 - 07:49 #5
http://upload.klipper.dk/Applet.jpg

Jeg håber denne forklare :)
Avatar billede htx98i17 Professor
19. april 2010 - 07:54 #6
1. Midten af appletten er omdrejningspunkt.
2. Der man klikker på billedet bliver til punktet X.
3. Når man klikker, rykkes billedet således at punktet X ligger i omdrejningspunktet.
4. Når man klikker på knappen ROTER, så forbliver punktet X i omdrejningspunktet.

Således at kanten af tallerkenen kan studeres samme sted i appletten. Altså er det tallerkenens midtpunkt der roteres omkring.
Avatar billede arne_v Ekspert
19. april 2010 - 20:47 #7
Jeg maa proeve. Det lyder faktisk ikke saa svaert.
Avatar billede htx98i17 Professor
07. august 2011 - 16:39 #8
Hva så arne, er det en opgave for dig stadigvæk?
Avatar billede arne_v Ekspert
08. august 2011 - 03:01 #9
Hvordan virker:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ImageFunApplet extends JApplet {
    private double v;
    private int dx;
    private int dy;
    private String imgnam;
    private JLabel imgicn;
    public void init() {
        v = 0;
        dx = 0;
        dy = 0;
        imgnam = null;
        imgicn = null;
        getContentPane().setLayout(new BorderLayout());
        JPanel rot = new JPanel();
        rot.setLayout(new GridLayout(1, 4));
        JButton clockfast = new JButton("Rotate ++");
        clockfast.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v += 5;
                update();
            }
        });
        rot.add(clockfast);
        JButton clock = new JButton("Rotate +");
        clock.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v += 1;
                update();
            }
        });
        rot.add(clock);
        JButton cclock = new JButton("Rotate -");
        cclock.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v -= 1;
                update();
            }
        });
        rot.add(cclock);
        JButton cclockfast = new JButton("Rotate --");
        cclockfast.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v -= 5;
                update();
            }
        });
        rot.add(cclockfast);
        JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                v = 0;
                dx = 0;
                dy = 0;
                update();
            }
        });
        rot.add(reset);
        getContentPane().add(rot, BorderLayout.SOUTH);
        update();
    }
    public void setImage(String imgnam) {
        this.imgnam = imgnam;
        update();
    }
    private void update() {
        if(imgicn != null) {
            getContentPane().remove(imgicn);
        }
        if(imgnam == null) {
            imgicn = new JLabel(getBlankIcon());
        } else {
            imgicn = new JLabel(getIcon());
        }
        imgicn.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent ev) {
                dx = getWidth()/2 - ev.getPoint().x;
                dy = getHeight()/2 - ev.getPoint().y;
                update();
            }
            public void mouseEntered(MouseEvent ev) {
            }
            public void mouseExited(MouseEvent ev) {
            }
            public void mousePressed(MouseEvent ev) {
            }
            public void mouseReleased(MouseEvent ev) {
            }
        });
        getContentPane().add(imgicn, BorderLayout.CENTER);
        invalidate();
        validate();
        getContentPane().repaint();
    }
    private ImageIcon getIcon() {
        ImageIcon imgicn = new ImageIcon(getClass().getClassLoader().getResource(imgnam));
        BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bi.createGraphics();
        AffineTransform at = new AffineTransform();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        at.translate(dx, dy);
        at.rotate(Math.toRadians(v), getWidth()/2 - dx, getHeight()/2 - dy);
        g2.drawImage(imgicn.getImage(), at, this);
        g2.transform(at);
        g2.dispose();
        return new ImageIcon(bi);
    }
    private ImageIcon getBlankIcon() {
        BufferedImage bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bi.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        g2.dispose();
        return new ImageIcon(bi);
    }
}
Avatar billede htx98i17 Professor
07. april 2013 - 09:33 #10
hej arne, tusind tak for din tid og hjælp, du skal have point
Avatar billede htx98i17 Professor
20. april 2013 - 10:08 #11
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester