2010-08-10 6 views
7

हाय मैं अपने ऐप में बहुभुज बारी बारी से करने के लिए इस सी # कोड का उपयोग कर रहा है - वे बारी बारी से करते हैं, लेकिन यह भी जिस तरह नहीं है मैं क्या चाहते हो के साथ विषम मिलता है। सभी बहुभुज, 2 डी वेक्टर के रूप में परिभाषित चारों कोनों के साथ आयताकार होतेसही पॉलीगॉन रोटेशन कैसे करें? (सी # में यह कुछ भी पर लागू होता है, हालांकि)

public Polygon GetRotated(float radians) 
    { 

     Vector origin = this.Center; 
     Polygon ret = new Polygon(); 
     for (int i = 0; i < points.Count; i++) 
     { 
      ret.Points.Add(RotatePoint(points[i], origin, radians)); 
     } 
     return ret; 
    } 

    public Vector RotatePoint(Vector point, Vector origin, float angle) 
    { 
     Vector ret = new Vector(); 
     ret.X = (float)(origin.X + ((point.X - origin.X) * Math.Cos((float)angle)) - ((point.Y - origin.Y) * Math.Sin((float)angle))); 
     ret.Y = (float)(origin.Y + ((point.X - origin.X) * Math.Sin((float)angle)) - ((point.Y - origin.Y) * Math.Cos((float)angle))); 
     return ret; 
    } 
+0

एक त्वरित जानकारी पर, मुझे ठीक लगता है। आप किस प्रकार की स्कीविंग देख रहे हैं? और क्या कोई कारण है कि आप 'डबल' के बजाय 'फ्लोट' का उपयोग कर रहे हैं? –

+0

डाइस्टर ने इसे ठीक किया था, बस इसे ठीक करने के बजाय वाई शब्द जोड़ना था। बहुत अच्छे कोड के लिए jonskeet भी धन्यवाद :) – bharling

उत्तर

7

ऐसा लगता है कि आपका रोटेशन रूपांतरण गलत है। आपको इसका उपयोग करना चाहिए:

x' = x*Cos(angle) - y*Sin(angle) 
y' = x*Sin(angle) + y*Cos(angle) 

अधिक जानकारी के लिए, इंटरनेट पर various sources देखें। :)

6

मैं क्यों यह अभी तक बढ़ा रही है के लिए किसी भी सवाल का जवाब नहीं है, लेकिन मैं कोड स्पष्ट करने के लिए एक सुझाव है :

public Vector RotatePoint(Vector point, Vector origin, float angle) 
{ 
    Vector translated = point - origin; 
    Vector rotated = new Vector 
    { 
     X = translated.X * Math.Cos(angle) - translated.Y * Math.Sin(angle), 
     Y = translated.X * Math.Sin(angle) + translated.Y * Math.Cos(angle) 
    }; 
    return rotated + origin; 
} 

(यह मानते हुए है Vector उचित +/- परिभाषित ऑपरेटरों है।)

तुम अब भी float को डाले के एक जोड़े की आवश्यकता हो सकती है, लेकिन आप अभी भी कम कोष्ठक मुश्किल होता टी के साथ खत्म हो जाएगा hings। ओह, और आप निश्चित रूप से angle को float पर डालने की आवश्यकता है, बशर्ते कि इसे पहले ही float के रूप में घोषित किया गया हो।

संपादित करें: रोटेशन मैट्रिक्स के बारे में एक नोट शामिल है - यह इस बात पर निर्भर करता है कि आप कोण को घड़ी के विपरीत या anticlockwise होने के लिए लेते हैं। मैं बिल्कुल भी पता लगाने के लिए कि मैट्रिक्स वास्तव में है क्या गलत हो (मैं इसे चेक करने की कोशिश की थी, लेकिन जाहिरा तौर पर में गड़बड़) जा रहा है आश्चर्य "अलग" जरूरी इसका मतलब यह नहीं है "गलत" नहीं होगा ... लेकिन। उम्मीद है कि मैट्रिक्स क्या गलत है, स्वीकार्य रूप से :)

+0

+1 पठनीयता सुधार का सुझाव देने के लिए। हमें अगले प्रोग्रामर के लिए कोडिंग करने वाले लोगों की आवश्यकता है जो कोड बनाए रखेंगे। – vhallac

0

बस एक जंगली अनुमान - क्या आप सुनिश्चित हैं कि आपके डेस्कटॉप रिज़ॉल्यूशन का पहलू अनुपात भौतिक स्क्रीन जैसा ही है? यही है, पिक्सल वर्ग हैं? यदि नहीं, तो अपने आयत को घुमावदार कोण में घूर्णन करके उन्हें तिरछे लग सकते हैं।

+0

ईजीए टाइम्स (640x400) के बाद से मुझे एनीसोट्रॉपिक पिक्सेल के साथ स्क्रीन नहीं मिली है - मैंने सोचा था कि उन जानवरों ने डायनासोर का रास्ता तय किया है! – Niki

+0

@nikie - जरूरी नहीं कि भौतिक पिक्सेल।आप देशी स्क्रीन res से अलग संकल्प चुन सकते हैं। इस तरह आप आयताकार "लॉजिकल" पिक्सेल प्राप्त कर सकते हैं जब आपका डेस्कटॉप भौतिक स्क्रीन क्षेत्र भरने के लिए फैलाया जाता है। वाई 'मान को छोड़कर – ysap

3

मुझे लगता है कि आपका रोटेशन मैट्रिक्स गलत है। वहाँ एक + के बजाय दूसरे समीकरण में - होना चाहिए:

+cos -sin 
+sin +cos 
1

यह मानते हुए कि मूल 0,0 है। आपके सूत्र से मैं प्राप्त करूंगा: एक्स '= (एक्स + ((एक्स - 0) * कोस (कोण)) - ((वाई - 0) * पाप (कोण))); एक्स '= एक्स + (एक्स * कोस (कोण)) - (वाई * पाप (कोण));

कौन सा प्रारंभिक सूत्र से अलग है एक्स '= एक्स * कोण क्योंकि - y * क्योंकि कोण

तो मुझे लगता है जॉन स्कीट के जवाब सही और स्पष्ट है।

+0

सुधार। - होना चाहिए +। – Txugo

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

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