2011-09-22 18 views
14

मैंने हर जगह खोज की है और मुझे अभी जवाब नहीं मिल रहा है।
मैं जावा में एक आयताकार कैसे घुमा सकता हूं?जावा ग्राफिक्स 2 डी आयताकार घुमाएं?

यहाँ है मेरी कोड के कुछ:

package net.chrypthic.Space; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Space extends JPanel implements ActionListener{ 
    Timer time; 
    public Space() 
    { 
     setVisible(true); 
     setFocusable(true); 
     addMouseMotionListener(new ML()); 
     addMouseListener(new ML()); 
     addKeyListener(new AL()); 
     time=new Timer(5, this); 
     time.start(); 
    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setColor(Color.WHITE); 
     Rectangle rect2 = new Rectangle(100, 100, 20, 20); 

     g2d.draw(rect2); 
     g2d.fill(rect2); 
    } 
    public void actionPerformed(ActionEvent ae) { 
     repaint(); 
    } 
    public class AL extends KeyAdapter 
    { 
     public void keyPressed(KeyEvent e) { 
     } 

     public void keyReleased(KeyEvent e) { 
     } 
    } 
    public class ML extends MouseAdapter 
    { 
     public void mouseMoved(MouseEvent e) { 
     } 

     public void mousePressed(MouseEvent e){ 
     } 
    } 
} 

मैं g2d.rotate (100D) की कोशिश की, लेकिन यह काम नहीं किया। अग्रिम धन्यवाद।

package net.chrypthic.Space; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Space extends JPanel implements ActionListener{ 
    Timer time; 
    public Space() 
    { 
     setVisible(true); 
     setFocusable(true); 
     setSize(640, 480); 
     setBackground(Color.BLACK); 
     time=new Timer(5, this); 
     time.start(); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D)g; 
     Rectangle rect1 = new Rectangle(100, 100, 20, 20); 
     g2d.setColor(Color.WHITE); 
     g2d.translate(rect1.x+(rect1.width/2), rect1.y+(rect1.height/2)); 
     g2d.rotate(Math.toRadians(90)); 
     g2d.draw(rect1); 
     g2d.fill(rect1); 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     repaint(); 
    } 
} 
+0

इस तरह से आप पहली बार रेक्ट अनुवाद कर रहे हैं और उसके बाद। यह समकक्ष है: नया आयताकार (110,110,20,20); जी 2 डी.रोटेट (गणित। ट्राडियन (45)); – Heisenbug

उत्तर

11

छवियों आप रिश्तेदार AffineTransform साथ Graphics2D की drawImage विधि का उपयोग करने के लिए है के लिए:

यहाँ मेरी संपादित कोड है।

आकार के लिए आप Graphics2D ही बारी बारी से कर सकते हैं:

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.setColor(Color.WHITE); 
    Rectangle rect2 = new Rectangle(100, 100, 20, 20); 

    g2d.rotate(Math.toRadians(45)); 
    g2d.draw(rect2); 
    g2d.fill(rect2); 
} 

और btw, आप paintComponent विधि के बजाय रंग ओवरराइड करना चाहिए।

हवाला देते हुए JComponent के एपीआई:

घुमाओ द्वारा लाया घटकों आकर्षित करने के लिए। अनुप्रयोगों को सीधे पेंट नहीं करना चाहिए, लेकिन इसके बजाय शेड्यूल करने के लिए घटक शेड्यूल करने के लिए पुनर्विचार विधि का उपयोग करना चाहिए।

यह विधि वास्तव में चित्रकला के काम को तीन संरक्षित तरीकों से प्रस्तुत करती है: paintComponent, paintBorder, और paintChildren। उन्हें यह सुनिश्चित करने के लिए सूचीबद्ध क्रम में बुलाया जाता है कि बच्चे घटक के शीर्ष पर दिखाई देते हैं। आम तौर पर, घटक और उसके बच्चों को सीमा पर आवंटित इन्सटेट क्षेत्र में पेंट नहीं करना चाहिए। सबक्लास बस इस विधि को हमेशा ओवरराइड कर सकते हैं। एक उपclass कि सिर्फ यूआई (देखो और महसूस) प्रतिनिधि को पेंट विधि को विशेषज्ञ बनाना चाहता है, बस पेंट कॉम्पोनेंट को ओवरराइड करना चाहिए।

जब आप एक घूर्णन की तरह एक एफ़िन रूपांतरण करते हैं, तब भी याद रखें, वस्तु स्पष्ट रूप से धुरी मूल के चारों ओर घूमती है। तो यदि आपका इरादा इसे मनमाने ढंग से बिंदु के चारों ओर घूमना है, तो आपको इसे मूल पर वापस अनुवाद करने से पहले, इसे घुमाने, और फिर वांछित बिंदु पर फिर से ट्रास्लेट करना चाहिए।

+0

धन्यवाद बीमार कोशिश करें, पेंटकंपोनेंट के बारे में क्या बेहतर है? – chrypthic

+0

के, मैंने कोशिश की। अब मेरे आयत को बाएं कोने में लपेटा गया है, हालांकि मैंने एक्स स्थिति को 100 पर सेट किया है। यह क्यों हो रहा है? (स्क्रीनी: http://cl.ly/AM8c) – chrypthic

+0

"जब आप एक रोटेशन की तरह एफ़िन रूपांतरण करते हैं, तब भी याद रखें, ऑब्जेक्ट स्पष्ट रूप से धुरी मूल के चारों ओर घुमाया जाता है। इसलिए यदि आपका इरादा इसे मनमाने ढंग से घूमना है बिंदु, आपको इसे मूल पर वापस अनुवाद करने से पहले, इसे घुमाएं, और उसके बाद वांछित बिंदु पर फिर से traslating करना चाहिए। " मैंने यह कैसे किया? – chrypthic

10
public void draw(Graphics2D g) { 
    Graphics2D gg = (Graphics2D) g.create(); 
    gg.rotate(angle, rect.x + rect.width/2, rect.y + rect.height/2); 
    gg.drawRect(rect.x, rect.y, rect.width, rect.height); 
    gg.dispose(); 

    gg = (Graphics2D) g.create(); 
    ... other stuff 
} 

Graphics.create() और Graphics.dispose() आप वर्तमान परिवर्तन मानकों (साथ ही वर्तमान फ़ॉन्ट, स्ट्रोक, रंग, आदि) को बचाने के लिए, और उन्हें बाद में बहाल करने के लिए अनुमति देते हैं। यह Open12L में glPushMatrix() और glPopMatrix() के बराबर है।

एक बार जब आप आयत को वापस लेते हैं तो परिवर्तन मैट्रिक्स को अपने प्रारंभिक स्थिति में वापस करने के लिए एक उलटा रोटेशन भी लागू कर सकते हैं। हालांकि, घटकों के दौरान फ्लोटिंग पॉइंट अनुमानों का झूठा परिणाम हो सकता है।

+0

जेकंपोनेंट – Heisenbug

+0

के लिए ड्रॉ विधि मौजूद नहीं है बेशक, मुझे आशा है कि ओप को जेपीनल पर आकर्षित करने के बारे में पता चल जाएगा, यह सिर्फ एक कोड स्निपेट है :) –

+0

+1 _other_ ['rotate()'] के लिए +1 (http://download.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#rotate%28double,%20double,%20double%29)। – trashgod

-1

g2d.rotate के साथ एकमात्र समस्या यह है कि यह इसे किसी विशिष्ट बिंदु के चारों ओर घुमाता नहीं है। यह अधिकतर गड़बड़ कर देगा जहां आप अपनी छवि चाहते हैं और फिर आपको छवि के एक्स और वाई निर्देशांक को स्थानांतरित करने के लिए मजबूर करेंगे। मैं विशेष रूप से एक खेल के लिए इसका उपयोग नहीं करता। आपको जावा में एक बिंदु घूर्णन करना चाहिए।

6

एक और तरीका है Path2D उपयोग करते हुए, इसके साथ आप पथ बारी बारी से कर सकते हैं के द्वारा होता है केवल और नहीं पूरे ग्राफिक्स वस्तु: यह घूर्णन

Rectangle r = new Rectangle(x, y, width, height); 
Path2D.Double path = new Path2D.Double(); 
path.append(r, false); 

AffineTransform t = new AffineTransform(); 
t.rotate(angle); 
path.transform(t); 
g2.draw(path); 
+1

Path2D Java2D की एक शानदार विशेषता है जिसे मैं नहीं जानता था ... – Jose

संबंधित मुद्दे