मैं स्विंग के साथ ज़ूम करने योग्य मानचित्र बनाने की कोशिश कर रहा हूं। नक्शा जेएसक्रोलपैन में एक जेपीनल है। जब ज़ूम इन किया जाता है, तो नक्शा आकार बदलता है और पेंट() तत्वों को एक अलग स्थिति में चित्रित करता है। यह सब महान काम करता है।केंद्र को स्थानांतरित किए बिना जेपीनेल में ज़ूम इन करने के लिए कैसे करें: गणित या स्विंग?
हालांकि, छवि आकार को बढ़ाने के दौरान स्क्रॉलपैन ने व्यूपोर्ट नहीं बदला, ताकि ज़ूमिंग उन तत्वों को हमेशा स्थानांतरित कर दे जो मैं स्क्रीन से बाहर देख रहा था। मैंने scrollRectToVisible()
के साथ इसे हल करने का प्रयास किया, लेकिन मैं आयताकार के लिए सही निर्देशांक प्राप्त करने का प्रबंधन नहीं करता, या तो क्योंकि मैं ज्यामिति करने में विफल रहता हूं या क्योंकि मुझे यह सब ठीक से स्विंग नहीं समझा जाता है।
public class MapPanel extends JPanel {
[...]
public void setZoom(double zoom) {
// get the current viewport rectangle and its center in the scaled coordinate system
JViewport vp = (JViewport) this.getParent();
Rectangle rect = vp.getViewRect();
Point middle = getMiddle(rect);
Dimension dim = rect.getSize();
// zoom in
scaler.setZoom(zoom);
setPreferredSize(scaler.transform(dim));
this.revalidate();
// calculate the full size of the scaled coordinate system
Dimension fullDim = scaler.transform(dim);
// calculate the non-scaled center of the viewport
Point nMiddle = new Point((int) ((double) (middle.x)/fullDim.width*dim.width),(int) ((double) (middle.y)/fullDim.height*dim.height));
// this should do the trick, but is always a bit off towards the origin
scrollRectToVisible(getRectangleAroundPoint(nMiddle));
// the below alternative always zooms in perfectly to the center of the map
// scrollRectToVisible(getRectangleAroundPoint(new Point(400,300)));
}
private Rectangle getRectangleAroundPoint(Point p){
Point newP = scaler.transform(p);
Dimension d = railMap.getDimension();
Point corner = new Point(newP.x-d.width/2,newP.y-d.height/2);
return new Rectangle(corner,d);
}
private Point getMiddle(Rectangle r){
return new Point(r.x+r.width/2,r.y+r.height/2);
}
}
और यहाँ Scaler वर्ग (जो कुछ नहीं करता है बहुत ही आश्चर्य की, मुझे लगता है) है::
public class Scaler {
private double zoom = 1;
public void setZoom(double zoom) {
this.zoom = zoom;
}
public Point transform(Point2D p){
return new Point((int) (p.getX()*zoom), (int) (p.getY()*zoom));
}
public Dimension transform(Dimension d){
return new Dimension((int) (d.width*zoom), (int) (d.height*zoom));
}
}
कौन मुझे बता सकते हैं जहां कोई बात बिगड़ जा रहे हैं
यहाँ मैं क्या किया है? यह मैं नक्शा की वर्तमान केंद्र का एक मान्य गणना किया था, और एक निश्चित जूम बिंदु यह काम करता है के साथ मुझे लगता है ...
संपादित करें: इसलिए यहाँ कठिन बात नई व्यूपोर्ट आयत बनाने के लिए है आधारित पुराने व्यूपोर्ट आयत पर।
रेलमैप? आप जेएमआरआई जैसे कुछ पर काम नहीं करेंगे? ;-) – geowar