Avatar billede htx98i17 Professor
13. december 2009 - 18:05 Der er 35 kommentarer og
1 løsning

Langsom billede rotation om punkt X

Jeg søger en applet som fungerer som følgende eller så tæt på som muligt:


En side hvor der er en række billeder.

Med et klik på et billede loades billedet i appletten.

Med et klik på billedet i appletten, kan billedet roterer rundt om X. X er punktet på billedet hvor man klikkede.

Der roteres langsom ved at der klikkes på en knap eller pil til højre/ventre.

Nogen der kender sådan et script eller som kan lave et?
Avatar billede arne_v Ekspert
14. december 2009 - 04:47 #1
Jeg kender ikke noget færdigt kode til det, men det kan da laves.

Kan du selv lidt Java ?
Avatar billede htx98i17 Professor
14. december 2009 - 07:06 #2
Jeg kan desværre ikke selv kode java
Avatar billede htx98i17 Professor
17. december 2009 - 19:47 #3
søøøde arne... :-)
Avatar billede htx98i17 Professor
17. december 2009 - 19:47 #4
Glædelig jul :)
Avatar billede arne_v Ekspert
17. december 2009 - 20:22 #5
Jeg overvejer staadig om jeg orker at gaa igang med det i weekenden.
Avatar billede arne_v Ekspert
20. december 2009 - 22:13 #6
Lidt kode.
Avatar billede arne_v Ekspert
20. december 2009 - 22:13 #7
<img src="redsquare.gif" onClick="document.ImageFun.setImage('redsquare.gif')">
<img src="greensquare.gif" onClick="document.ImageFun.setImage('greensquare.gif')">
<img src="bluesquare.gif" onClick="document.ImageFun.setImage('bluesquare.gif')">
<hr>
<applet name="ImageFun" codebase="." code="ImageFunApplet.class" width="400" height="400">
</applet>
Avatar billede arne_v Ekspert
20. december 2009 - 22:13 #8
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);
        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 = ev.getPoint().x - imgicn.getWidth() / 2;
                dy = ev.getPoint().y - imgicn.getHeight() / 2;
            }
            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();
        at.translate((bi.getWidth()-imgicn.getIconWidth())/2, (bi.getHeight()-imgicn.getIconHeight())/2);
        at.rotate(Math.toRadians(v), imgicn.getIconWidth()/2 + dx, imgicn.getIconHeight()/2 + dy);
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        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
21. december 2009 - 15:02 #9
Jeg er ved at hente og installere jdk

kan du poste kommandoen for at compile? og gerne step-vis... :-)
Avatar billede arne_v Ekspert
21. december 2009 - 15:09 #10
C:\hvorjavaligger\bin\javac ImageFunApplet.java
Avatar billede htx98i17 Professor
21. december 2009 - 15:28 #11
C:\Program Files\Java\jdk1.6.0_17\bin>javac ImageFunApplet.java
ImageFunApplet.java:1: illegal character: \187
´&#9559;&#9488;import java.awt.BorderLayout;
^
ImageFunApplet.java:1: illegal character: \191
´&#9559;&#9488;import java.awt.BorderLayout;
  ^
2 errors

C:\Program Files\Java\jdk1.6.0_17\bin>
Avatar billede arne_v Ekspert
21. december 2009 - 15:32 #12
Check lioge om der er kommet noget snask ind oeverst i filen.
Avatar billede htx98i17 Professor
21. december 2009 - 15:34 #13
det første tegn er et i, ingen mellemrum eller andet snask
Avatar billede arne_v Ekspert
21. december 2009 - 15:39 #14
Proev og gem filen som ANSI i.s.f. UTF-8.
Avatar billede htx98i17 Professor
21. december 2009 - 15:46 #15
ok :)

SÅDAN

yes, det er fanme smart.

Kan du gøre sådan at man kan resette på en knap
og gøre så den resetter når man loader et nyt billede ind i appleten? :))
Avatar billede htx98i17 Professor
21. december 2009 - 15:50 #16
aaahhh, kan du gøre sådan at rotationen centreres i appletten? :)) hehe

jeg kunne ikke forstå hvorfor den ikke roterede om der hvor man klikkede, men fandt ud af at det gjorde den, men den ikke centrerede billedet til midten af appletten...
Avatar billede htx98i17 Professor
21. december 2009 - 15:52 #17
altså punktet X skal gerne centreres i midten af appletten
Avatar billede arne_v Ekspert
21. december 2009 - 15:55 #18
Ah.

Klik skal ikke vare nyt omdrejnings punkt men klik punkt skal flyttes til centrum og saa roterer man igen om det.
Avatar billede arne_v Ekspert
21. december 2009 - 15:57 #19
Jeg kan foerst selv proeve senere.

Men har du mod paa selv at eksperimentere saa lav:

        at.translate((bi.getWidth()-imgicn.getIconWidth())/2, (bi.getHeight()-imgicn.getIconHeight())/2);
        at.rotate(Math.toRadians(v), imgicn.getIconWidth()/2 + dx, imgicn.getIconHeight()/2 + dy);

om til:

        at.translate((bi.getWidth()-imgicn.getIconWidth())/2 + dx, (bi.getHeight()-imgicn.getIconHeight())/2 + dy);
        at.rotate(Math.toRadians(v), imgicn.getIconWidth()/2, imgicn.getIconHeight()/2);
Avatar billede htx98i17 Professor
21. december 2009 - 16:06 #20
nemlig

Men den ændring gjorde desværre ikke nogen forskel, den roterer stadig om klik
Avatar billede arne_v Ekspert
21. december 2009 - 16:16 #21
Fik du recompilet og genstartet browseren efter aendringen ?
Avatar billede arne_v Ekspert
21. december 2009 - 16:16 #22
Hvis ja, saa maa jeg nok teste lidt selv i aften (min tid).
Avatar billede arne_v Ekspert
21. december 2009 - 16:17 #23
PS: er du god til matematik ?
Avatar billede htx98i17 Professor
21. december 2009 - 16:21 #24
ja recompilet og genstartet browser.

nej desværre er jeg ikke god til matematik :) har du en matenatik opgave du skal have lavet? hehe
Avatar billede arne_v Ekspert
21. december 2009 - 16:26 #25
AffineTransform klassen er den som laver alt det sjove.

Docs er her:

http://java.sun.com/javase/6/docs/api/java/awt/geom/AffineTransform.html

Men docs forudsaetter ligesom at man kan taenke i matrics transformeringer.
Avatar billede arne_v Ekspert
21. december 2009 - 16:27 #26
Jeg proever at kigge paa at centrere roteringen senere (om en 6-7 timer).
Avatar billede htx98i17 Professor
21. december 2009 - 16:32 #27
super, og også gerne resetknap og reset ved load af nyt billede :)

jeg tjekker igen imorgen
Avatar billede arne_v Ekspert
22. december 2009 - 00:06 #28
<img src="redsquare.gif" onClick="document.ImageFun.setImage('redsquare.gif')">
<img src="greensquare.gif" onClick="document.ImageFun.setImage('greensquare.gif')">
<img src="bluesquare.gif" onClick="document.ImageFun.setImage('bluesquare.gif')">
<hr>
<applet name="ImageFun" codebase="." code="ImageFunApplet.class" width="500" height="500">
</applet>
Avatar billede arne_v Ekspert
22. december 2009 - 00:07 #29
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
22. december 2009 - 16:50 #30
Nu har jeg fået testen den

Opfører den sig ikke lidt mærkeligt?
Når billedet loades, så bliver billedet ikke centreret i appletten. Og når jeg klikker på billedet bliver X heller ikke midtpunktet. Gør den ved dig?
Avatar billede arne_v Ekspert
22. december 2009 - 19:59 #31
Da jeg testede virkede det som at billedet kom ind i centrum.

Jeg legede lidt med det og syntes at det var alt for forvirrende at goere klik sted til centrum saa i.s.f. valgte jeg at flytte centrum af billedet til klik sted.
Avatar billede htx98i17 Professor
22. december 2009 - 20:05 #32
Centrum af billedet bliver ikke flyttet til klik sted.

Men det skal være kliksted som skal være centrum af appleten, samt omdrejningspunkt X.

Forestil dig et rundt objekt på billedet som skal dreje rundt for ikke at se det på hovedet. Eksempelvis en porcelænsmalet dyb tallerken.
Avatar billede htx98i17 Professor
22. december 2009 - 20:06 #33
man skal så klikke i midten af tallerknen for at få tallerkens midte centreret i appletten og så kan den roteres.
Avatar billede htx98i17 Professor
06. januar 2010 - 17:29 #34
arne du må ligge et svar så får du point :) jeg opretter et nyt spm så der er andre der kan give et bud på at få det sidste på plads.
Avatar billede arne_v Ekspert
08. januar 2010 - 04:20 #35
OK
Avatar billede htx98i17 Professor
08. januar 2010 - 07:14 #36
mange tak for din tid. Jeg håber nogen kan justere det sidste. Hvis du får tid på et tidspunkt igen, så hop på :)
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