2009-03-27 14 views
6

मैं AffineTransform का उपयोग कर अपने केंद्र से एक आयताकार स्केल करने की कोशिश कर रहा हूं। मुझे यकीन है कि समाधान स्पष्ट है लेकिन मैं इसे काम नहीं कर सकता! यहां मैंने अभी तक परीक्षण किया है ...AffineTransform: अपने केंद्र से एक आकार स्केलिंग

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.geom.AffineTransform; 

import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class Test extends JPanel { 
    Test() 
     { 
     super(null); 
     setOpaque(true); 
     setBackground(Color.WHITE); 
     setPreferredSize(new Dimension(200,200)); 
     } 
    @Override 
    protected void paintComponent(Graphics g1) { 
     super.paintComponent(g1); 
     Rectangle r= new Rectangle(5,5,getWidth()-10,getHeight()-10); 
     double cx= r.getCenterX(); 
     double cy= r.getCenterY(); 
     Graphics2D g=(Graphics2D)g1; 
     g.setColor(Color.BLACK); 
     AffineTransform old= g.getTransform(); 
     for(double zoom=0.9; zoom>=0.5; zoom-=0.1) 
      { 
      AffineTransform tr2= new AffineTransform(old); 
      tr2.translate(-cx, -cy); 
      tr2.scale(zoom, zoom); 
      tr2.translate(cx/zoom,cy/zoom); 
      g.setTransform(tr2); 
      g.draw(r); 
      g.setTransform(old); 
      } 
     } 


    public static void main(String[] args) { 
     JOptionPane.showMessageDialog(null, new Test()); 
     } 
    } 

लेकिन यह काम नहीं करता .... कोई सुझाव?

+0

मैं तुम्हें गाढ़ा/आंतरिक आयतों को ट्रैक करने की कोशिश कर रहे मान? – basszero

उत्तर

5

मैं देखता हूं कि जब आप आयत से निपट रहे हैं तो आपका क्या मतलब है। इसका कारण यह है कि अनुवाद के लिए प्रारंभिक गणना ने कंटेनर ऑब्जेक्ट के आकार को ध्यान में नहीं रखा।

उपयोग इस बजाय:

tr2.translate(
    (this.getWidth()/2) - (r.getWidth()*(zoom))/2, 
    (this.getHeight()/2) - (r.getHeight()*(zoom))/2 
); 
tr2.scale(zoom,zoom); 
g.setTransform(tr2); 

क्या यह क्या कर रहा है यह स्केलिंग से पहले पैनल के केंद्र के लिए आयत का अनुवाद है। मेरे परीक्षणों में यह ठीक काम करता है।

5

मानते हुए स्केलिंग आयताकार के शीर्ष लेफ्टैंड कोने का स्थान तय करता है (जो मुझे लगता है कि यह सही है लेकिन जावा में ग्राफिक्स करने के बाद से यह काफी समय हो गया है), आपको आयत के विपरीत दिशा में अनुवाद करना होगा स्केलिंग

tr2.translate(
    r.getWidth()*(1-zoom)/2, 
    r.getHeight()*(1-zoom)/2 
); 
tr2.scale(zoom,zoom); 
g.setTransform(tr2); 

तो आप चौड़ाई और ऊंचाई में परिवर्तन के आधे भाग को ऊपर और ऊपर ले जाते हैं।

+0

काम नहीं लग रहा है। –

+0

आपका समाधान काम नहीं करता है लेकिन यह मुझे कुछ नए विचार देता है, धन्यवाद – Pierre

+0

@mmyers: आपको क्या परिणाम मिल रहा है? मेरे पास काम पर जावा आईडीई तक पहुंच नहीं है इसलिए मैं इसे स्वयं परीक्षण नहीं कर सकता। मैं काफी हद तक स्मृति से काम कर रहा हूँ। – Welbog

0

इसमें एक ट्रांसफॉर्म को संयोजित करने वाली प्रक्रिया शामिल है।

एस स्केलिंग आप क्या करना चाहते है, और टी परिवर्तन उस समय अपने स्केलिंग के केंद्र होने के लिए है कि इंगित (0,0) लेता है, तो बदलने कि काम करता है

है

टी (एस (उलटा (टी))

0

(बाद में) यहां एक समाधान है जो पैनल के आयाम के पूर्व ज्ञान के बिना काम कर रहा है।

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Ellipse2D; 

import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class Test extends JPanel 
    { 
    private static final long serialVersionUID = 1L; 
    private Test() 
     { 
     super(null); 
     setOpaque(true); 
     setBackground(Color.WHITE); 
     setPreferredSize(new Dimension(600,600)); 
     } 

    @Override 
    protected void paintComponent(Graphics g1) { 
     super.paintComponent(g1); 
     Shape r= new Ellipse2D.Double(5,380,400,200); 
     double cx= r.getBounds2D().getCenterX(); 
     double cy= r.getBounds2D().getCenterY(); 
     Graphics2D g=(Graphics2D)g1; 
     g.setColor(Color.BLACK); 
     AffineTransform old= g.getTransform(); 
     g.drawLine((int)cx-10, (int)cy, (int)cx+10, (int)cy); 
     g.drawLine((int)cx, (int)cy-10, (int)cx, (int)cy+10); 
     for(double zoom=1; zoom>=0.1; zoom-=0.1) 
       { 


       AffineTransform tr2 =AffineTransform.getTranslateInstance(-cx, -cy); 
       AffineTransform tr= AffineTransform.getScaleInstance(zoom,zoom); 
       tr.concatenate(tr2); tr2=tr; 
       tr =AffineTransform.getTranslateInstance(cx, cy); 
       tr.concatenate(tr2); tr2=tr; 

       tr= new AffineTransform(old); 
       tr.concatenate(tr2); tr2=tr; 

       g.setTransform(tr2); 



       g.draw(r); 
       g.setTransform(old); 
       } 
     } 


    public static void main(String[] args) { 
     JOptionPane.showMessageDialog(null, new Test()); 
     } 
    } 
0

मैं सिर्फ एक डेस्कटॉप अनुप्रयोग पर काम कर रहा था ब्रिटनी स्पीयर के चेहरे (DAY) फसल आयत इसके केंद्र बिंदु के आसपास पैमाने पर करने के लिए किया था कांट-छांट करना:

import javafx.scene.Cursor; 
import javafx.scene.Group; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.input.ScrollEvent; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.Paint; 
import javafx.scene.shape.Rectangle; 

class ResizableRectangle extends Rectangle { 

ResizableRectangle(double x, double y, double width, double height, Group group) { 

    super(x, y, width, height); 

    // Set scroll listener for crop selection 
    group.addEventHandler(ScrollEvent.SCROLL, event -> { 
    double zoomFactor = 1.10; 
    double deltaY = event.getDeltaY(); 
    if (deltaY > 0) { 
    zoomFactor = 2.0 - zoomFactor; 
    } 

    super.setX(getX() + (super.getWidth() * (1 - zoomFactor)/2)); // Set new X position 
    super.setWidth(getWidth() * zoomFactor); // Set new Width 

    super.setY(getY() + (super.getHeight() * (1 - zoomFactor)/2)); // Set new Y position 
    super.setHeight(getHeight() * zoomFactor); // Set new Height 

    event.consume(); 
    }); 
}); 
} 

सामान्य में, एल्गोरिथ्म इस तरह काम करता है:

  • अनुवाद आयत एक्स-मूल्यों के साथ: x + (width * (1 - zoomFactor)/2)
  • अनुवाद के साथ y- मानों: y + (height * (1 - zoomFactor)/2)width * zoomFactor
  • नई ऊंचाई सेट करने के लिए:
  • करने के लिए नए चौड़ाई सेट करें height * zoomFactor
संबंधित मुद्दे