Newsgroup: it.comp.java
Titolo: imagemapping

Scusate se riposto una domanda che ho fatto la settimana scorsa, ma non
riseco a trovare una soluzione:
voglio realizzare risiko in java e quindi ho scannerizzato il planisfero.
Adesso vorrei suddividere l'immagine in modo da assegnare una sorta di
JButton ad ogni stato (oppure fare in modo che il click su ogni stato mi
generi un evento diverso) per poter selezionare lo stato da cui attaccare e
quello da attaccare direttamente dalla cartina.
Basta solo che mi diciate il nome di una classe, il collegamento a qualche
tutorial oppure come si chiama questa azione in java (io in google ho
cercato imagemapping, mappatura immagine, suddivisione immagine, ecc.)
Grazie a tutti.
Cendo

Ciao, scusa, questa non è una risposta, ma volevo sapere se tu per tuo
problema avevi risolto in qualche modo perchè dovrei fare una cosa simile.
Grazie.
Delvy


Io non ho mai fatto niente del genere, e non sono nemmeno un bravo
programmatore java, quinid dirai: che mi rispondi a fare? :-)
Ti rispondio perchè ho una vaga idea che mi gira per la testa, ma bisogna
studiarci su. Potresti procedere più o meno così, appoggiandoti alle java2D:
- carichi la tua immagine
- registri un mouselistener al componenete che contine l'immagine
- crei delle forme dal pacchetto java.awt.geom, che corrispondano alle zone
sensibili
- quando si genera un evento di click sull'immagine, ricavi dall'evento le
coordinate del click e ci crei un Point2D.
- usando il metodo "Contains()" delle forme geometriche di java2d e ciclando
su tutte quelle che hai definito verifichi se il punto è contenuto o meno in
una di esse, e ti comporti di conseguenza
detto coì non va nemmeno a pagarlo, però magari è un buon punto di partenza
per lavorarci sopra. Di più, mi dispiace, non so dirti...
Ciao
Giacomo


Grazie Gicomo,
ci avevo pensato anch'io, ma il problema di Cendo ed anche il mio č che
abbiamo a che fare con una cartina geografiche, per cui le aree sensibili
hanno le forme piů strane...
Delvy

 hanno le forme più strane...
Capisco, ma qualunque sistema tu pensi o speri di dover adottare, dovrai
comunque "preventivare" un metodo per descrivere queste aree: se le aree
sono complicate, lo sarà anche la descrizione. Può darsi che sbagli, ma
questa mi sembra un'osservazioni comunque valida a prescindere dagli
espedienti che uno trova per implementare ciò che vi serve.
Ciò detto, il metodo da me suggerito è applicabilissimo: difficoltà tecniche
nel descrivere arre complesse non ce ne sono (col java 2d disegni
praticamente quel che ti pare), e la complicazioni di tale disegno non crodo
sia molto maggiore di quella minima che comunque dovrai affrntare con
qualisasi metodo...
O c'è qualcosa che non ho capito?  ;-)
Ciao
Giacomo

studiarci su. Potresti procedere piů o meno cosě, appoggiandoti alle java2D:
[CUT]
Mi aggancio al tuo post per... completarlo. ;-)
Quella che descrivi č IMHO una via buona per risolvere il problema di Cendo 
e Delvy.
Sotto copio un abbozzo di codice (funzionante) che fa quello che descrivi.
Per quanto riguarda la generazione delle "forme" suggerirei di usare 
strumenti come Adobe ImageReady e simili che permettono di disegnare mappe 
HTML.
Basta usare le coordinate generate per costruire le Shape (l'esempio č 
stato fatto cosě), ma non č difficle costruirsi un piccolo parser per il 
tag MAP... ;-)
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class ImageMap extends JLabel {
    private Color areaColor = new Color(150, 150, 150, 100);
    private java.util.List areas = new ArrayList();
    private Shape shapeOver = null;
    public ImageMap(Image image) {
        super(new ImageIcon(image));
        setListener();
        addTestShapes();
    }
    private void addTestShapes() {
        areas.add(buildCircle(new int[] {158, 35, 22}));
        areas.add(buildRect(new int[] {2, 1, 115, 132}));
        areas.add(buildPoly(new int[] {
            82, 243, 114, 140, 200, 229, 185, 109, 211, 249, 102, 248
        }));
    }
    protected void setListener() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                for (Iterator iter = areas.iterator();
                     iter.hasNext();) {
                    Shape s = (Shape)iter.next();
                    if (s.contains(e.getPoint())) {
                        shapeOver = s;
                        repaint();
                        break;
                    }
                }
            }
            public void mouseReleased(MouseEvent e) {
                shapeOver = null;
                repaint();
            }
        });
    }
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (shapeOver != null) {
            Graphics2D g2 = (Graphics2D)g;
            g2.draw(shapeOver);
            g2.setColor(areaColor);
            g2.fill(shapeOver);
        }
    }
    protected Rectangle buildRect(int[] coord) {
        if (coord.length != 4) {
            return null;
        }
        return new Rectangle(coord[0], coord[1], coord[2], coord[3]);
    }
    protected Polygon buildPoly(int[] coord) {
        if ((coord.length % 2) != 0) {
            return null;
        }
        Polygon poly = new Polygon();
        for (int i = 0; i < coord.length; i += 2) {
            poly.addPoint(coord[i], coord[i + 1]);
        }
        return poly;
    }
    protected Ellipse2D buildCircle(int[] coord) {
        if (coord.length != 3) {
            return null;
        }
        float x = coord[0] - coord[2];
        float y = coord[1] - coord[2];
        float w = 2 * coord[2];
        return new Ellipse2D.Float(x, y, w, w);
    }
    public static void main(String[] args) {
        JFrame frame = new JFrame("ImageMap Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());
        Image im = Toolkit.getDefaultToolkit()
                          .getImage(<l'immagine che vuoi>);
        frame.getContentPane()
             .add(new ImageMap(im), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }
}
HTH
-- 
Ciao
	Fabrizio C.