2010-02-18 15 views
7

मैं अपने एक्स वाई निर्देशांक और उनकी चौड़ाई और ऊंचाई के संदर्भ में परिभाषित आयत का उपयोग कर रहा हूं। मुझे पता चला कि निर्देशांक के संदर्भ में उन्हें कैसे घुमाया जाए (x = cos(deg) * x - sin(deg) * yy = sin(deg) * x + cos(deg) * y) लेकिन मैं ऊंचाई और चौड़ाई पर फंस गया हूं। मुझे यकीन है कि एक स्पष्ट समाधान है कि मैं याद कर रहा हूँ। यदि यह मायने रखता है, तो मैं पाइथन का उपयोग कर रहा हूं।एक आयताकार घुमाए जाने का सबसे आसान तरीका

संपादित करें भ्रमित विवरण के लिए खेद है। मेरा इरादा चौड़ाई और ऊंचाई को किसी भी कोण के कारण या तो उलट या अस्वीकार करना है। उदाहरण के लिए, 90 डिग्री रोटेशन में मान स्विच होंगे। एक 180 डिग्री रोटेशन में चौड़ाई नकारात्मक होगी। इसके अलावा, मैं केवल अपनी स्क्रिप्ट में 90 के गुणकों का उपयोग करना चाहता हूं। मैं बस if कथन का उपयोग कर सकता हूं, लेकिन मुझे लगता है कि एक और अधिक "सुरुचिपूर्ण" विधि होगी।

+0

"ऊंचाई और चौड़ाई पर अटक" से आपका क्या मतलब है? ऊंचाई और चौड़ाई के बारे में क्या? क्या आपका मतलब न्यूनतम/अधिकतम एक्स और वाई निर्देशांक है? एक आयत घूर्णन करने से इसके आयाम नहीं बदलते हैं, इसलिए शायद इसका मतलब यह नहीं है। –

+1

सावधान रहें - आप अपने साइन और कोसाइन कार्यों में "deg" का उपयोग करते रहें, लेकिन आपके द्वारा पारित संख्या में रेडियंस होने की आवश्यकता है। 180 डिग्री = पीआई रेडियंस, जहां पीआई = 3.1415 9 .... – duffymo

+0

@ डफिमो ... जो मुझे इस निष्कर्ष पर पहुंचाता है कि परिचित वाक्यविन्यास और तरीके डिग्री रेडियंस के त्रिकोणमितीय कार्यों के लिए फ़ीड करती है, ऐसा लगता है कि वह पाइथन का उपयोग कर रहा है । अच्छा, मैं इसे पायथन में लागू करने के लिए देख रहा था :) – Gustavo6046

उत्तर

1

तरह आप केवल 90 डिग्री से घूर्णन का वर्णन है, और जिस तरह से आप चौड़ाई और ऊंचाई को परिभाषित हो रहे हैं से, शायद आप

direction = 1  // counter-clockwise degrees 
// or 
direction = -1 // clockwise 90 degrees 

new_height = width * direction 
new_width = -height * direction 
width = new_width 
height = new_height 

सुनिश्चित नहीं हैं कि तुम क्यों ऋणात्मक मानों करना चाहते हैं की तरह कुछ के लिए देख रहे हैं चौड़ाई और ऊंचाई के लिए, हालांकि .. अन्यथा प्रत्येक 90 डिग्री रोटेशन प्रभावी रूप से चौड़ाई और ऊंचाई स्वैप करता है, भले ही आप किस तरह घुमाएंगे।

+0

नकारात्मक मूल्यों के लिए कोई विशेष कारण नहीं है, इसके अलावा यह सरल लगता है और जिस लाइब्रेरी का मैं इसका उपयोग कर रहा हूं उसका समर्थन करता है। – tankadillo

5

बस आपका आयत के चारों कोनों की गणना:

p1 = (x, y) 
p2 = (x + w, y) 
p3 = (x, y + h) 

और कोण से प्रत्येक बारी बारी से आप चाहते हैं:

p1 = rotate(p1, angle) 
# and so on... 

और आपका आयत प्रतिनिधित्व करने के लिए वापस परिणत:

x, y = p1 
w = dist(p1, p2) # the same as before rotation 
h = dist(p1, p3) 

जहां dist दो बिंदुओं के बीच दूरी की गणना करता है।

संपादित करें: आप फॉर्मूला लागू करने का प्रयास क्यों नहीं करते हैं आपने (width, height) जोड़ी पर लिखा है?

x1 = -y 
y2 = x 

और अगर deg == 180 वे नकार दिया जाएगा:

x1 = -x 
y2 = -y 

और इतने पर ... मुझे लगता है कि

x1 = cos(deg) * x - sin(deg) * y 
y2 = sin(deg) * x + cos(deg) * y 

यह देखना है कि अगर deg == 90 मूल्यों स्विच करेंगे आसान है यह वही है जो आप खोज रहे हैं।

EDIT2:

यहाँ तेजी से रोटेशन समारोह आता है:

def rotate_left_by_90(times, x, y): 
    return [(x, y), (-y, x), (-x, -y), (y, -x)][times % 4] 
1

उचित तरीके से परिवर्तन मैट्रिक्स का सहारा लेना होगा। इसके अलावा, आपके प्रश्न से निर्णय लेते हुए मुझे लगता है कि आप (x = 0, y = 0) के संबंध में घूमना चाहते हैं, लेकिन यदि नहीं, तो आपको इसे ध्यान में रखना होगा और पहले अपने आयत को योजना के केंद्र में अनुवाद करना होगा (और फिर घुमावदार होने पर इसे वापस अनुवाद करें)।

एम = मैट्रिक्स केंद्र आर = रोटेशन मैट्रिक्स

परिवर्तन मैट्रिक्स = एम^करने के लिए अनुवाद करने के लिए (- 1) * R * एम

लेकिन आप अपने प्रश्न के लिए एक आसान जवाब देने के लिए, बस अपने आयत के दो अन्य कोनों को ले लो और उन पर एक ही परिवर्तन लागू करें।

परिवर्तन मैट्रिक्स के बारे में अधिक जानने के लिए: http://en.wikipedia.org/wiki/Transformation_matrix

1

रोटेशन width और height परिवर्तन नहीं होना चाहिए। यदि आप deg द्वारा 0 (0, 0) के बारे में घूमना चाहते हैं तो आपका समीकरण सही है, लेकिन ध्यान दें कि अक्सर cos और sin फ़ंक्शंस डिग्री की बजाय रेडियंस में तर्क की अपेक्षा करते हैं, इसलिए आपको degpi/180 (रेडियंस) से गुणा करने की आवश्यकता हो सकती है प्रति डिग्री)।

यदि आपको घूर्णन के बाद अन्य आयताकार शिखर के अलावा (x, y) के स्थानों को खोजने की आवश्यकता है, तो आपको या तो उन्हें (x, y) के साथ स्टोर और घुमाएं या आयत के अभिविन्यास (जैसे कि डिग्री) ताकि आप उन्हें उदाहरण के रूप में पुनः संयोजित कर सकें एक्स + चौड़ाई कोस (डिग्री), वाई + ऊंचाई पाप (डिग्री)।

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