2012-12-04 29 views
17

मेरे पास एक विशिष्ट ग्राफिक बनाने का कार्य है। इस कार्य के हिस्से के रूप में मुझे कुछ बिंदुओं को 45 डिग्री पर घुमाने की आवश्यकता है।एक और बिंदु के चारों ओर एक बिंदु घुमाएं

मैंने फ़ॉर्मूला की गणना करने की कोशिश करने में पहले से ही 2 दिन बिताए हैं, लेकिन बस इसे सही नहीं मिला। मैं इस विशेष वेबसाइट सहित सभी जगहों पर खोज कर रहा हूं, मैं बहुत करीब आ रहा हूं, लेकिन मैं अभी भी वहां नहीं हूं।

संदेश यह है: मैं 4 विभिन्न बिंदुओं

मैं वहाँ स्थिति है, जो प्रश्न के दायरे से बाहर है, लेकिन यहाँ की गणना करने के लिए एक विशेष सूत्र है आकर्षित करने की आवश्यकता है कि मैं क्या एक परिणाम के रूप हो रही है इसके बारे में:

int radius = 576; 
int diameter = radius * 2; 
Point blueA = new Point(561, 273); 
Point greenB = new Point(273, 561); 
Point yellowC = new Point (849, 561); 
Point redD = new Point (561, 849); 

result

अब मैं 45 डिग्री पर इस डॉट्स बारी बारी से करने की जरूरत है। मैं निम्नलिखित कोड का उपयोग इसे प्राप्त करने के:

double rotationAngle = 45; 
double rotationRadians = rotationAngle * (Math.PI/180); 
int center = radius;  
result.X = (int)(Math.Cos(rotationRadians) * ((double)result.X - (double)center) - (double)Math.Sin(rotationRadians) * ((double)result.Y - center) + (double)center); 
result.Y = (int)(Math.Sin(rotationRadians) * ((double)result.X - (double)center) + (double)Math.Cos(rotationRadians) * ((double)result.Y - center) + (double)center); 

लेकिन है कि मैं क्या हो रही है है:

Result

किसी भी मदद की बहुत सराहना की जाएगी

उत्तर

35

समस्या int center = radius है जो आप कर रहे हैं int radius = 576 सेटिंग। यह निश्चित रूप से समझ में नहीं आता है क्योंकि आप निश्चित रूप से उस बिंदु के बारे में घूम रहे हैं जिसमें x और y स्थान होना चाहिए।

को देखते हुए आप मूल चारों ओर परिक्रमा कर रहे हैं केंद्र x और y दोनों होना चाहिए 0 नहीं 576

तो, इसे देखते हुए, इसे आजमाएं।

/// <summary> 
/// Rotates one point around another 
/// </summary> 
/// <param name="pointToRotate">The point to rotate.</param> 
/// <param name="centerPoint">The center point of rotation.</param> 
/// <param name="angleInDegrees">The rotation angle in degrees.</param> 
/// <returns>Rotated point</returns> 
static Point RotatePoint(Point pointToRotate, Point centerPoint, double angleInDegrees) 
{ 
    double angleInRadians = angleInDegrees * (Math.PI/180); 
    double cosTheta = Math.Cos(angleInRadians); 
    double sinTheta = Math.Sin(angleInRadians); 
    return new Point 
    { 
     X = 
      (int) 
      (cosTheta * (pointToRotate.X - centerPoint.X) - 
      sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X), 
     Y = 
      (int) 
      (sinTheta * (pointToRotate.X - centerPoint.X) + 
      cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y) 
    }; 
} 

इसलिए की तरह प्रयोग करें।

Point center = new Point(0, 0); 
Point newPoint = RotatePoint(blueA, center, 45); 

जाहिर केंद्र बिंदु हमेशा है अगर 0,0 तो आप समारोह तदनुसार सरल बना सकते हैं, या फिर केंद्र बिंदु एक डिफ़ॉल्ट पैरामीटर के माध्यम से वैकल्पिक बनाने, या विधि ओवरलोडिंग से। आप शायद कुछ पुन: प्रयोज्य गणित को अन्य स्थैतिक तरीकों में भी समाहित करना चाहते हैं।

उदा

/// <summary> 
/// Converts an angle in decimal degress to radians. 
/// </summary> 
/// <param name="angleInDegrees">The angle in degrees to convert.</param> 
/// <returns>Angle in radians</returns> 
static double DegreesToRadians(double angleInDegrees) 
{ 
    return angleInDegrees * (Math.PI/180); 
} 

/// <summary> 
/// Rotates a point around the origin 
/// </summary> 
/// <param name="pointToRotate">The point to rotate.</param> 
/// <param name="angleInDegrees">The rotation angle in degrees.</param> 
/// <returns>Rotated point</returns> 
static Point RotatePoint(Point pointToRotate, double angleInDegrees) 
{ 
    return RotatePoint(pointToRotate, new Point(0, 0), angleInDegrees); 
} 

ऐसा उपयोग करें।

Point newPoint = RotatePoint(blueA, 45); 

अंत में, यदि आप GDI उपयोग कर रहे हैं तो आप भी बस एक RotateTransform कर सकते हैं। देखें: http://msdn.microsoft.com/en-us/library/a0z3f662.aspx

Graphics g = this.CreateGraphics(); 
g.TranslateTransform(blueA); 
g.RotateTransform(45); 
+0

के बाद मैं पोस्ट मैं सिर्फ इस पोस्ट को देखा। यह सूत्र काम करता है। –

+0

यह सही है! धन्यवाद। यहां वर्तमान स्क्रीनशॉट है: http://s8.postimage.org/e7r44klcl/result.png –

+1

आप सही हैं। ओएस लिब में एक योगदानकर्ता ने हाथों की प्रतिलिपि बनाई होगी क्योंकि ब्रांड्स को खराब कर दिया गया था और यूनिट परीक्षणों में यह गलत हो गया था। –

1

आप गणित मुझे अजीब लग रहा है कर रहे हैं। मुझे लगता है कि डीएक्स = आर * कोस (थेटा) और डीई = आर * पाप (थेटा)।

यहां एक छोटा सा कार्यक्रम है जो मैंने लिखा था क्योंकि यह मुझे परेशान कर रहा था, और मैंने गणित नहीं किया है वर्षों से।

Point center = new Point() { X = 576, Y = 576 }; 

Point previous = new Point() { X = 849, Y=561 }; 
double rotation = 45; 
double rotationRadians = rotation * (Math.PI/180); 

//get radius based on the previous point and r squared = a squared + b squared 
double r = Math.Sqrt(Math.Pow(previous.X - center.X, 2) + Math.Pow(previous.Y - center.Y, 2)); 
Console.WriteLine("r = " + r.ToString()); 

//calculate previous angle 
double previousAngle = Math.Atan((previous.Y - center.Y)/(previous.X - center.X)); 
Console.WriteLine("Previous angle: " + previousAngle.ToString()); 

double newAngle = previousAngle + rotationRadians; 

Point newP = new Point(); 
newP.X = center.X + r * Math.Cos(newAngle); 
newP.Y = center.Y + r * Math.Sin(newAngle); 

Console.WriteLine("(" + newP.X.ToString() + ", " + newP.Y.ToString() + ")"); 

Console.ReadLine(); 
+0

मैं कोड के विभिन्न हिस्सों में विधि का उपयोग करता हूं और कुछ स्तर पर मुझे इन निर्देशांकों के साथ "पिछला" बिंदु मिला: एक्स = 576 वाई = 20. इस मामले में मुझे "DivideByZeroException" मिल रहा है नतीजा अगर मैं "try -> catch" ब्लॉक डालता हूं: http://s10.postimage.org/azjdc7rex/exception.png –