2013-04-07 15 views
8

के माध्यम से लाइन वक्र कैसे बनाएं I कई बिंदुओं के माध्यम से लाइन वक्र बनाने का एक तरीका ढूंढ रहे हैं। यह 3 बिंदुओं का उपयोग करना बेहतर होगा हालांकि मैंने माना है कि एक बिंदु में प्रवेश करने वाले रेखा के कोण को संदर्भ देने के लिए वक्र को संदर्भ देने के लिए संदर्भ की आवश्यकता हो सकती है।अंक

आम तौर पर एक प्रारंभ बिंदु पी 1, एक नियंत्रण बिंदु पी 2 और एक अंत बिंदु पी 3, रेखा पी 1 से पी 2 और फिर पी 2 से पी 3 तक वक्र होना चाहिए।

वास्तव में यहाँ प्रभाव का एक आदर्श उदाहरण है मैं प्राप्त करने के लिए करना चाहते हैं:

Irwin Hall Spline

मैं यह कर सकता है मैं वास्तव में सदा आभारी होंगे!

जावा में अब तक, मैं चीजों को इस तरह के रूप QuadCurve2D.Double, Cub icCurve2D.Double और भी Path2D.Double (Path2D.Double साथ curveTo का प्रयोग करके) के साथ प्रयोग करना की कोशिश की है, लेकिन कोई लाभ नहीं हुआ - घटता जो चित्रित कर रहे हैं यहां तक ​​कि के माध्यम से गुजर के करीब नहीं हैं नियंत्रण बिंदु निर्दिष्ट। यहाँ

enter image description here

और कोड मैं अंक और छवि में घटता उत्पन्न करने के लिए प्रयोग किया जाता है:

यहाँ तरीकों मैं अब तक की कोशिश की है की एक छवि है

Graphics2D g = (Graphics2D) window.getGraphics(); 
    g.setColor(Color.blue); 
    int d = 4; 

    // P0 
    int x0 = window.getWidth()/8; 
    int y0 = 250; 
    g.drawString("P0", x0, y0 + 4*d); 
    g.fillRect(x0, y0, d, d); 

    // P1 
    int x1 = (window.getWidth()/7)*2; 
    int y1 = 235; 
    g.drawString("P1", x1, y1 + 4*d); 
    g.fillRect(x1, y1, d, d); 

    // P2 
    int x2 = (window.getWidth()/2); 
    int y2 = 200; 
    g.drawString("P2", x2, y2 - 2*d); 
    g.fillRect(x2, y2, d, d); 

    // P3 
    int x3 = (window.getWidth()/7)*5; 
    int y3 = 235; 
    g.drawString("P3", x3, y3 + 4*d); 
    g.fillRect(x3, y3, d, d); 

      // P4 
    int x4 = (window.getWidth()/8)*7; 
    int y4 = 250; 
    g.drawString("P4", x4, y4 + 4*d); 
    g.fillRect(x4, y4, d, d); 

    g.setColor(Color.cyan); 
    QuadCurve2D quadCurve = new QuadCurve2D.Double(x0, y0, x2, y2, x4, y4); 
    g.draw(quadCurve); 


    g.setColor(Color.YELLOW); 
    CubicCurve2D.Double cubicCurve = new CubicCurve2D.Double((double)x0, (double)y0, 
                  (double)x1, (double)y1, 
                  (double)x2, (double)y2, 
                  (double)x4, (double)y4); 
    g.draw(cubicCurve); 


    g.setColor(Color.red);  
    Path2D.Double path1 = new Path2D.Double(); 
    path1.moveTo(x1, y1); 
    path1.curveTo(x0, y0, x2, y2, x4, y4); 
    g.draw(path1); 

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

मैं किसी भी मदद की पेशकश के लिए वास्तव में आभारी रहूंगा - अग्रिम धन्यवाद।

+0

मुझे स्पष्टीकरण दे सकते हैं कि आप अंक की एक सरणी के माध्यम से वक्र खींचने में सक्षम होने के लिए कह रहे हैं? –

+0

हां, इसलिए मान लें कि इरविन-हॉल स्पलीन पर प्रत्येक बिंदु सरणी में एक तत्व है। –

उत्तर

9

मुझे लगता है कि आपको नियंत्रण बिंदु क्या है इसका विचार याद आ रहा है। नियंत्रण बिंदु आम तौर पर पथ पर नहीं होते हैं। इसके बजाए वे नियंत्रित करते हैं कि पथ के वक्र को अंक के बीच कैसे आकार दिया जाता है। पूर्ण विवरण के लिए spline tutorial देखें।

अब हाथ की समस्या के लिए, आपके पास वक्र पर अंक हैं लेकिन वास्तविक नियंत्रण बिंदु नहीं हैं। नियंत्रण बिंदु प्राप्त करने के लिए कार्डिनल स्पलाइन जैसी कुछ तकनीकें हैं, फिर आपके द्वारा उल्लिखित वक्र ड्राइंग एपीआई में से एक को पास करने के लिए। आप शायद Path2D.Double विकल्प चाहते हैं ताकि आप आसानी से व्यक्तिगत घटता को एकसाथ स्ट्रिंग कर सकें।

तो पी 3 के लिए P2 करने के लिए पी 1 से ड्राइंग के लिए

, बजाय

Path2D.Double path1 = new Path2D.Double(); 
path1.moveTo(x1, y1); 
path1.curveTo(x0, y0, x2, y2, x4, y4); 
g.draw(path1); 

आप

Path2D.Double path1 = new Path2D.Double(); 
path1.moveTo(x1, y1); 
path1.curveTo(cx1a, cy1a, cx1b, cy1b, x2, y2); 
path1.curveTo(cx2a, cy2a, cx2b, cy2b, x3, y3); 
g.draw(path1); 

जहां cx और cy निर्देशांक अपने व्युत्पन्न नियंत्रण बिंदुओं, घन पट्टी प्रति दो नियंत्रण अंक हैं चाहते हैं खंड। संभवतः,

cx1a = x1 + (x2 - x1)/3; 
cy1a = y1 + (y2 - y1)/3; 
cx1b = x2 - (x3 - x1)/3; 
cy1b = y2 - (y3 - y1)/3; 
cx2a = x2 + (x3 - x1)/3; 
cy2a = y2 + (y3 - y1)/3; 
cx2b = x3 - (x3 - x2)/3; 
cy2b = y3 - (y3 - y2)/3; 

पैटर्न यहाँ है कि इंटीरियर अंक (केवल इस मामले में P2) से पहले और उसके बाद नियंत्रण अंक (c1b और c2a) के लिए पहले और अंक के बीच की रेखा के ढलान की भरपाई कर रहे हैं इसके बाद (पी 1 और पी 3)। किनारे के बिंदुओं के लिए, नियंत्रण बिंदु उस बिंदु और अगले निकटतम बिंदु के बीच ढलान पर आधारित होते हैं।

यदि आपके पास डोमेन-विशिष्ट जानकारी है तो आप विभिन्न नियंत्रण बिंदु चुन सकते हैं। उदाहरण के लिए, आप अंत बिंदुओं पर ढलानों को 0.

+0

बहुत यकीन है कि cx1b और cy1b को डुप्लिकेट नहीं किया जाना चाहिए? क्या वे cx1a cy1a cx1b cy1b नहीं होना चाहिए? –

+0

धन्यवाद @ जेम्ससी। अब तय – xan

+0

यदि यह बहुत अधिक परेशानी नहीं है तो क्या आप कुछ बिंदुओं को छोड़ सकते हैं कि आप नियंत्रण बिंदु बनाने के लिए ऐसे एक्स और वाई मान क्यों चुनते हैं? नियंत्रण बिंदुओं की अंतिम जोड़ी के अलावा सभी x1, y1 का उपयोग क्यों करते हैं? दूसरी जोड़ी सीएक्स 1 बी और साइ 1 बी में वे वक्र के करीब आने के बाद बिंदु की स्थिति पर निर्भर प्रतीत होते हैं, लेकिन आखिरी जोड़ी में आप स्पष्ट रूप से उस अतिरिक्त चरण को नहीं ले सकते हैं क्योंकि आप उस अंतिम बिंदु पर पहुंच रहे हैं। तो मुझे लगता है कि आप भविष्य के बिंदु x3, y3 का उपयोग दूसरे बिंदु पर आने वाले वक्र के कोण को न्यायसंगत बनाने के लिए कर सकते हैं क्योंकि इसे आसानी से भविष्य के बिंदु पर जाने की आवश्यकता होगी? –

2

अच्छी तरह से हो सकता है यह मदद कर सकता है: पी

Catmull-रोम उदाहरण के द्वारा इसी सिद्धांत अलग लैंग घटता ... http://schepers.cc/svg/path/dotty.svg

+0

कैटमूल-रोम स्प्लिंस वक्र खींचे जाने के तरीके में इरविन-हॉल स्प्लिंस से अलग है। इस संसाधन को जांचें और कुछ बिंदु बनाएं, http://blog.ivank.net/interpolation-with-cubic-splines.html –

+0

लिंक जॉबन के लिए धन्यवाद, हालांकि यदि आप [इस उदाहरण] पर विचार करते हैं (http://postimg.org/ छवि/izjajqfw7 /) जिसे मैंने आपके द्वारा प्रदान किए गए लिंक पर बनाया है, आप वक्र (कम से कम मेरे मामले में) को गलत तरीके से इंप्रेशन दे सकते हैं कि अंतिम बिंदुओं के बीच बहुत अधिक मूल्य मौजूद थे। Catmull-Rom उदाहरण से जुड़ा हुआ तैरना स्वीकार्य है हालांकि कार्यान्वयन स्पष्ट नहीं है - कोई विचार तैरता है? –

+0

ठीक है, तो आप एक catmull-rom spline तो चाहते हैं, हम्म कि शायद थोड़ा आसान होना चाहिए। –

2

मूल रूप से क्या आप पूछ रहे हैं के लिए है घन तख़्ता है अंतर्वेशन, मैं था इस कार्यक्रम को ऑनलाइन Interp2.java ढूंढने में सक्षम। इसमें वास्तव में एक बहुपद स्पलीन और क्यूबिक स्पलीन शामिल है।

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