2009-03-23 23 views
35

मुझे कल्पना है कि यह एक साधारण सवाल है, लेकिन मुझे अपने वर्तमान कोड के साथ कुछ अजीब परिणाम मिल रहे हैं और मेरे पास पूरी तरह समझने के लिए गणित पृष्ठभूमि नहीं है। मेरा लक्ष्य सरल है, जैसा कि शीर्षक में बताया गया है: मैं बस बिंदु बिंदु से कुछ दूरी और कोण पर बिंदु ढूंढना चाहता हूं।सी # में कोण से सर्कल की परिधि पर बिंदु की गणना करना?

मेरे वर्तमान कोड:

Point centerPoint = new Point (0, 0); 
Point result  = new Point (0, 0); 
double angle  = 0.5; //between 0 and 2 * PI, angle is in radians 
int distance  = 1000; 

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 
result.X = centerPoint.X + (int)Math.Round(distance * Math.Cos(angle)); 

सामान्य तौर पर, यह काफी हद काम करने के लिए लगता है, लेकिन मैं विभिन्न स्थानों पर समस्याओं मिलता है, सबसे विशेष रूप से कोण में नकारात्मक x और y अक्ष अंक से मेल खाती है जब। स्पष्ट रूप से मैं कुछ गलत कर रहा हूं - क्या विचार है?

अपडेट: यह मेरी गलती थी, यह कोड ठीक काम करता है - कुछ आउटलाइजर्स जो काम नहीं कर रहे थे वास्तव में एक बग के कारण थे कि कैसे 1.5 पीआई के कोण को गणना की जा रही थी। मैंने सोचा कि मैंने काफी अच्छी तरह से जांच की है, लेकिन स्पष्ट रूप से नहीं था। उनके समय के लिए सभी को धन्यवाद, उम्मीद है कि उपर्युक्त कामकाजी कोड किसी और के लिए सहायक साबित होगा।

+0

आपका क्या मतलब है "मैं विभिन्न स्थानों पर समस्याओं मिल"? –

+0

जानबूझकर अप्रयुक्त उपयोग केंद्र है? सेंटरपॉइंट.एक्स और .Y को परिणाम में जोड़ा जाना चाहिए? – spender

+0

क्या आप किसी समस्या का उदाहरण प्रदान कर सकते हैं? –

उत्तर

29

आप केंद्र बिंदु जोड़ने के लिए भूल गया:

result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle)); 
result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle)); 

बाकी ठीक होना चाहिए ... (क्या अजीब परिणाम आप मिल रहे थे आप दे सकते हैं एक सटीक इनपुट?)

+0

आह, यह केंद्र बिंदु के बारे में एक अच्छा बिंदु है - इस मामले में इसका उपयोग नहीं किया जाता है। वर्तमान बिंदु जो मैं वर्तमान में काम कर रहा हूं 0,0 के केंद्र बिंदु के साथ है, इसलिए यह उस मामले में अप्रासंगिक है, लेकिन अन्य मामलों में यह निश्चित रूप से एक फर्क पड़ता है। मैंने इसे सही तरीके से शामिल करने के लिए उदाहरण अपडेट किया है। – x4000

6

सबसे पहले, जब से तुम रेडियन में कर रहे हैं यह शायद फायदेमंद जैसे अपने कोण को परिभाषित करने के लिए:

double angle = (Math.PI/3); // 60 degrees... 

कार्यों के लिए खुद को ठीक काम कर रहे हैं। राउंडिंग केवल आपके उत्तर को प्रभावित करेगी यदि आपकी दूरी पर्याप्त रूप से पर्याप्त है। इसके अलावा, जवाब ठीक से बाहर आना चाहिए।

यदि यह गोलाई है आप के बारे में चिंतित हैं, तो याद रखें कि डिफ़ॉल्ट रूप से, .NET banker's rounding करता है, और आप कर सकते हैं:

result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero); 
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero); 
बजाय

साथ ही, प्रश्न में आपका दूरी एक्स और कोण चाहते वाई ... मैं आप से संबंधित नहीं कर रहे हैं कि मान बिंदु (X,Y) है, क्योंकि है कि पूरी तरह से अलग है।

दूरी सूत्र है:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2); 
+0

जॉन, मछली के लिए धन्यवाद। मैं खुशी से अनजान था कि सी # डबल गणना को गोल कर रहा था, अकेले अकेले रहने दें (आईएमएचओ)। – corlettk

1

सटीक त्रुटियों के बारे में अधिक जानकारी के बिना यह कहना मुश्किल है कि क्या गलत है। समीकरण सही दिखते हैं और काम करना चाहिए। क्या आप सुनिश्चित हैं कि आपके द्वारा गुजरने वाले कोण कोणों के लिए सही हैं> 90 डिग्री? एकमात्र अन्य चीज जो मैं सोच सकता था वह यह होगा कि आप Math.sin (डबल) के परिणाम से दूरी (एक int) गुणा कर रहे हैं लेकिन यह वास्तव में कोई मुद्दा नहीं होना चाहिए।

+0

आप बिल्कुल सही हैं, कोण इनपुट वास्तव में बंद था। – x4000

0

मैं C# पता नहीं है, वैसे भी अगर आप तथ्य यह है कि तो अपने पाप तत्व होना चाहिए स्क्रीन के ऊपर से नीचे तक Y अक्ष क्रीज, विचार करने के लिए है कहीं अंक आकर्षित करने के लिए कोशिश कर रहे हैं -sin (...) और + पाप (...)

तो

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 

हो जाना चाहिए:

result.Y = centerPoint.Y - (int)Math.Round(distance * Math.Sin(angle)); 

आप उन्हें आकर्षित करने के लिए मैं कल्पना नहीं कर सकता कि समस्या क्या है कोशिश नहीं कर रहे हैं, तो आप कुछ उदाहरण दे सकते हैं?

+0

परिणाम.Y को इस लिंक को जांचने के लिए पाप नहीं करना चाहिए http://www.webdeveloper.com/forum/showthread.php?t=190439 – RVN

1
-(NSMutableArray *)GetPointsForCircle 
    { 
     NSMutableArray *Points = [[NSMutableArray alloc] init]; 
     CGPoint CenterPoint = CGPointMake(160, 230); 
     CGPoint Point; 
     for (float Angel = 0; Angel <= 360; Angel+= 60) 
     { 
      Point.x = CenterPoint.x + 100 * cos(Angel); 
      Point.y = CenterPoint.y + 100 * sin(Angel); 
      [Points addObject:[NSValue valueWithCGPoint:Point]]; 
     } 
     return Points; 
    } 

    - (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints 
    { 
        CGPoint centerPoint = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); 
        float radius = 100.0; 
        float angle = (2 * M_PI/(float)totalPoints) * (float)thisPoint; 
        CGPoint newPoint; 
     newPoint.x = (centerPoint.x) + (radius * cosf(angle)); 
     newPoint.y = (centerPoint.y) + (radius * sinf(angle)); 
        return newPoint;   
    } 
+0

त्रिज्या 100 के एक चक्र के लिए 6 अंक लौटें। एक सर्कल के लिए पैरामीट्रिक समीकरण है एक्स = सीएक्स + आर * कॉस (ए) वाई = सी + आर * पाप (ए) जहां आर त्रिज्या, सीएक्स, मूल उत्पत्ति, और 0..2 पीआई रेडियंस या 0..360 डिग्री से कोण है । – Waseem

2

एक Swift3 संस्करण

func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint { 
    let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi/180))) 
    let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi/180))) 

    return CGPoint(x: x, y: y) 
}