2012-12-18 12 views
9

मैं कई अंक हैं, और मैं इसकई बिंदुओं से बेजियर वक्र कैसे आकर्षित करें?

  • 1,2,3 अंक की तरह लग रहे

    PathFigure pf = new PathFigure(points.From, ps, false); //ps - list of Bezier segments 
        PathFigureCollection pfc = new PathFigureCollection(); 
        pfc.Add(pf); 
        var pge = new PathGeometry(); 
        pge.Figures = pfc; 
        Path p = new Path(); 
        p.Data = pge; 
        p.Stroke = new SolidColorBrush(Color.FromRgb(244, 111, 011)); 
    

    मेरे बेज़ियर खंडों नीचे कोड का उपयोग कर बेज़ियर वक्र आकर्षित करने के लिए प्रयास करें - प्रथम खंड

  • 3, 4,5 अंक - दूसरे
  • 5,6,7 .. ..

लेकिन मैं यह अजीब वक्र मिला (- तीन अंक के प्रत्येक समूह के लिए एक

enter image description here

+0

मुझे लगता है कि यह आंकड़ा रखना स्वाभाविक है, क्या आप वांछित वक्र के साथ एक लिंक पोस्ट कर सकते हैं? –

+0

या, शायद, आप 7 नियंत्रण बिंदुओं वाला एक सेगमेंट बनाना चाहते हैं? –

उत्तर

18

लाइन आप हो रही है तीन अलग बेज़ियर घटता का मिलन है: यहां 3 बड़ा (नोड्स) और 7 छोटे अंडाकार (है मेरी अंक)) है। (प्रत्येक "बेजियर सेगमेंट" के लिए एक?)

यदि आप एक चिकनी वक्र चाहते हैं, तो आपको अंक (एकल "बेजियर सेगमेंट") के एक संग्रह के रूप में अपने 9 (या अधिक) अंक पारित करने की आवश्यकता है, जैसा कि नहीं तीन बिंदुओं के समूह।

संपादित करें: स्पष्ट रूप से BezierSegment केवल तीन अंक का समर्थन करता है, इसलिए कोई आश्चर्य नहीं कि यह काम नहीं करता है। यहां तक ​​कि 'PolyBezierSegment' सिर्फ एक चिकनी बेजियर की बजाय बेजियर सेगमेंट का संग्रह देता है ...

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

PolyLineSegment GetBezierApproximation(Point[] controlPoints, int outputSegmentCount) 
{ 
    Point[] points = new Point[outputSegmentCount + 1]; 
    for (int i = 0; i <= outputSegmentCount; i++) 
    { 
     double t = (double)i/outputSegmentCount; 
     points[i] = GetBezierPoint(t, controlPoints, 0, controlPoints.Length); 
    } 
    return new PolyLineSegment(points, true); 
} 

Point GetBezierPoint(double t, Point[] controlPoints, int index, int count) 
{ 
    if (count == 1) 
     return controlPoints[index]; 
    var P0 = GetBezierPoint(t, controlPoints, index, count - 1); 
    var P1 = GetBezierPoint(t, controlPoints, index + 1, count - 1); 
    return new Point((1 - t) * P0.X + t * P1.X, (1 - t) * P0.Y + t * P1.Y); 
} 

इस का उपयोग करना,

private void Grid_Loaded(object sender, RoutedEventArgs e) 
{ 
    Point[] points = new[] { 
      new Point(0, 200), 
      new Point(0, 0), 
      new Point(300, 0), 
      new Point(350, 200), 
      new Point(400, 0) 
     }; 
    var b = GetBezierApproximation(points, 256); 
    PathFigure pf = new PathFigure(b.Points[0], new[] { b }, false); 
    PathFigureCollection pfc = new PathFigureCollection(); 
    pfc.Add(pf); 
    var pge = new PathGeometry(); 
    pge.Figures = pfc; 
    Path p = new Path(); 
    p.Data = pge; 
    p.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0)); 
    ((Grid)sender).Children.Add(p); 
} 

enter image description here

+0

यह सुपर कोल है! मुझे बहुत मदद की! धन्यवाद! – Gilad

+0

गलत अनुमान, सर्कल होने के लिए नियंत्रण पथ बनाया गया और यह एक elipsoid आकर्षित करता है। आपको सन्निकटन गणित पर पुनर्विचार करने की आवश्यकता हो सकती है। – SoLaR

+2

@ सोलार [बेजियर का उपयोग करके एक सर्कल बनाना असंभव है] (http://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%C3%A9zier-curves)। आपको एक सर्कल को आकर्षित करने के बारे में पुनर्विचार करने की आवश्यकता हो सकती है? – Rawling

12

देता है के बाद से आपके प्रत्येक घटता में एक नियंत्रण बिंदु होता है (एक बिंदु जो वक्र को प्रभावित करता है लेकिन वक्र पर जरूरी नहीं है), आप चतुर्भुज बेजियर वक्र का उपयोग कर रहे हैं।

यदि आप एक दो बिंदुओं को साझा करने वाले दो वर्गिक घटता को आकर्षित करना चाहते हैं, और आप संयुक्त को चिकनी दिखाना चाहते हैं, तो साझा अंतराल के प्रत्येक पक्ष पर नियंत्रण बिंदु समापन बिंदु के साथ कॉललाइनर होना चाहिए। यही है, उनके बीच दो नियंत्रण बिंदु और अंतराल सभी एक सीधी रेखा पर झूठ बोलना चाहिए। उदाहरण:

quadratics with smooth joints

ठोस काला डिस्क अंतिमबिंदुओं हैं। खोखले सर्कल नियंत्रण बिंदु हैं। ठोस काला रेखा वक्र है। बिंदीदार रेखाएं बताती हैं कि प्रत्येक एंडपॉइंट किसी भी तरफ नियंत्रण बिंदु को कॉललाइनर (सीधी रेखा पर) होता है।

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