2010-05-24 13 views
10

के साथ ड्राइंग आर्क मुझे ग्राफिक्सपाथ का उपयोग करके एक चाप खींचने और प्रारंभिक, औसत और अंतिम अंक रखने की आवश्यकता है। चाप उन्हें पास करना है।सी # 3 अंक

मैंने कोशिश की। ड्राक्यूर्वे और ड्रॉबेज़ियर लेकिन परिणाम बिल्कुल एक चाप नहीं है।

मैं क्या कर सकता हूं?

समाधान:

double d = 2 * (a.X - c.X) * (c.Y - b.Y) + 2 * (b.X - c.X) * (a.Y - c.Y); 
double m1 = (Math.Pow(a.X, 2) - Math.Pow(c.X, 2) + Math.Pow(a.Y, 2) - Math.Pow(c.Y, 2)); 
double m2 = (Math.Pow(c.X, 2) - Math.Pow(b.X, 2) + Math.Pow(c.Y, 2) - Math.Pow(b.Y, 2)); 
double nx = m1 * (c.Y - b.Y) + m2 * (c.Y - a.Y); 
double ny = m1 * (b.X - c.X) + m2 * (a.X - c.X); 
double cx = nx/d; 
double cy = ny/d; 
double dx = cx - a.X; 
double dy = cy - a.Y; 
double distance = Math.Sqrt(dx * dx + dy * dy); 
Vector va = new Vector(a.X - cx, a.Y - cy); 
Vector vb = new Vector(b.X - cx, b.Y - cy); 
Vector vc = new Vector(c.X - cx, c.Y - cy); 
Vector xaxis = new Vector(1, 0); 
float startAngle = (float)Vector.AngleBetween(xaxis, va); 
float sweepAngle = (float)(Vector.AngleBetween(va, vb) + Vector.AngleBetween(vb, vc)); 
path.AddArc(
    (float)(cx - distance), (float)(cy - distance), 
    (float)(distance * 2), (float)(distance * 2), 
    startAngle, sweepAngle); 
:

मैं आकर्षित करने के लिए क्या मैं इस एल्गोरिथ्म के साथ करना चाहता था प्रबंधित कोड लिखने के कुछ घंटों के बाद (3 प्वाइंट एक, ख, ग और एक GraphicsPath पथ दे)

+1

क्या आपका मतलब गोलाकार चाप है, या कोई चाप करेगा? –

+0

परिपत्र, मैं – Keeper

उत्तर

6

मैं DrawArc() का उपयोग के रूप में ANC_Michael ने सुझाव दिया जाएगा। 3 अंकों से गुज़रने वाली चाप को खोजने के लिए आप अंक द्वारा गठित त्रिभुज के circumcircle की गणना करना चाहते हैं।

एक बार जब आपके पास circumcircle सर्कल के लिए एक बाउंडिंग बॉक्स की गणना करता है तो न्यूनतम/अधिकतम आयामों (केंद्र +/- त्रिज्या) का उपयोग करके DrawArc के साथ उपयोग करने के लिए। अब बिंदुओं का अनुवाद करके अपनी शुरुआत की गणना करें और कोणों को रोकें ताकि circumcircle उत्पत्ति पर केंद्रित हो (अनुवाद -circumcenter द्वारा अनुवाद) और एक्स-अक्ष के साथ सामान्यीकृत प्रारंभ और अंत वैक्टर के डॉट-उत्पाद को लें:

double startAngle = Math.Acos(VectorToLeftPoint.Dot(XAxis)); 
double stopAngle = Math.Acos(VectorToRightPoint.Dot(XAxis)); 

ध्यान दें कि DrawArc एक्स-अक्ष से घड़ी के कोण की अपेक्षा करता है ताकि गणना की गई वेक्टर एक्स-अक्ष से ऊपर हो तो Math.PI जोड़ना चाहिए। यह DrawArc() पर कॉल करने के लिए पर्याप्त जानकारी होनी चाहिए।

संपादित करें: इस विधि को सर्कुलर आर्क मिलेगा और आपके अपेक्षित एंडपॉइंट व्यवहार के आधार पर आवश्यक 'सर्वश्रेष्ठ फिट' आर्क नहीं होगा।

0

क्या आपने DrawArc विधि को आजमाया है और देख रहा है कि क्या आप किसी भी तरह अपने 3 अंकों का उपयोग कर सकते हैं?

शायद

Pen blackPen= new Pen(Color.Black, 3); 
// Create rectangle to bound ellipse. 
Rectangle rect = new Rectangle(initial x, initial y, final x, median y); 
// Create start and sweep angles on ellipse. 
float startAngle = 0F; 
float sweepAngle = 270.0F; 
// Draw arc to screen. 
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle); 

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc%28VS.71%29.aspx

+0

जोड़ने के लिए भूल गया था मेरे पास कोण नहीं हैं और मुझे नहीं पता कि उन्हें कैसे गणना करें और अंक किसी भी स्थान पर हो सकते हैं (उन्हें ओरेकल के अंदर एफडीओ में ऑटोमैप 3 डी से निर्यात किया जाता है) – Keeper