2012-09-26 12 views
7

के WPF लाइन सेगमेंट को कैसे सुगम बनाना है नीचे दिया गया एंड्रॉइड कोड है।पथ चित्र

path.moveTo(xx, yy); 
for (...) { 
    path.lineTo(xx, yy); 
} 
canvas.drawPath(this.path, paint); 

enter image description here

तेज कोने को निकालने के लिए, मैं

final CornerPathEffect cornerPathEffect = new CornerPathEffect(50); 
paint.setPathEffect(cornerPathEffect); 

enter image description here

उपयोग कर रहा हूँ जब आता है WPF करने के लिए, मैं निम्नलिखित कोड का उपयोग कर रहा ।

PathFigure pathFigure = new PathFigure(); 
pathFigure.StartPoint = new Point(xx, yy); 
for (...) { 
    LineSegment lineSegment = new LineSegment(new Point(xx, yy), true); 
    lineSegment.IsSmoothJoin = true; 
    pathFigure.Segments.Add(lineSegment); 
} 
PathGeometry pathGeometry = new PathGeometry(new PathFigure[] { pathFigure }); 
drawingContext.DrawGeometry(null, new Pen(Brushes.White, 3), pathGeometry); 

मुझे निम्न प्रभाव मिल रहा है।

enter image description here

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

क्या मैं WPF में जानता हूं, मैं लाइन सेगमेंट को कैसे सुगम बना सकता हूं? हालांकि मैंने lineSegment.IsSmoothJoin = true; का उपयोग किया है, फिर भी मैं तेज कोने देख सकता हूं। क्या मेरे पास Android के CornerPathEffect के बराबर कुछ हो सकता है?

उत्तर

0

मुझे पता है, ज़ोंबी थ्रेड पोस्ट। आप शायद पहले से ही इस समस्या का समाधान है, लेकिन यहां इस तथ्य के बाद अपने विचारों को साल रहे हैं ...


समरेखण के बाद से लाइन मुझे लगता है कि यह एक चौरसाई एल्गोरिथ्म है कि लग रहा है खोजने के लिए काफी मुश्किल हो जाएगा में कई बिंदुओं पर निर्भर है अग्रणी किनारे में कुछ अस्थिरता पैदा किए बिना उचित। आप अस्थिरता के दायरे को कम कर सकते हैं, लेकिन केवल एक बहुत ही अजीब दिखने वाले निशान का उत्पादन करने के जोखिम पर।

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

वैकल्पिक रूप से आप बिंदुओं को गुणा करने के लिए प्रारंभिक स्पलीन गणना के माध्यम से वास्तविक डेटा बिंदु चला सकते हैं, फिर दूसरी बार स्पलीन अलगो के माध्यम से उन बिंदुओं को चलाएं। आपको अभी भी सबसे हालिया 2m अंक अपडेट करना होगा (जहां m पहले पास का गुणक है) या आउटपुट विकृत दिखाई देगा।

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

ओह, एक और ... अंतिम वक्र खंड को ग्राफ़ न करें। यदि आप पी एन-1 पर अपना वक्र समाप्त कर देते हैं तो वक्र स्थिर रहना चाहिए। अंतिम खंड को एक अलग शैली में बनाएं यदि आपको इसे बिल्कुल दिखाना चाहिए। चूंकि सी-आर स्प्लिंस को केवल इंटरपोलेशन से +/- 2 ज्ञात बिंदुओं की आवश्यकता होती है, सेगमेंट पी एन --P एन -पर्याप्त स्थिर होना चाहिए।

यदि आपके पास सी-आर एल्गोरिदम के लिए कोड नहीं है तो आप मूल रूप से सिंथेटिक बेज़ीयर नियंत्रण बिंदुओं के साथ एक ही चीज़ कर सकते हैं। प्रक्रिया का वर्णन करने के प्रयास के बजाय, this blog post देखें जो प्रक्रिया का काफी अच्छा टूटना देता है। This article में कोड संलग्न है जो उपयोगी हो सकता है।

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