2009-11-19 26 views
7

मैं एएस 3 (शुद्ध, फ्लेक्स नहीं) में 'ब्रश' टूल बनाने की कोशिश कर रहा हूं जो हस्तलेखन को अनुकरण करता है, स्ट्रोक को कोने के बजाए चिकनी बनाने के लिए बनाता है। फिर, ट्रेस को क्यूबिक बेजियर वक्र में कम किया जाना चाहिए जिसे पहले खींचे गए पथ (जैसे चित्रकार के पेन टूल) को प्रभावित करना, खींचा और विकृत किया जा सकता है।एक्स, वाई अंक की अनियमित संख्या से एक चिकनी पथ बनाना, हस्तलेखन को अनुकरण करने के लिए

मैं पथ खींचने के लिए अंक का एक सेट प्राप्त करने के लिए माउस आंदोलन को ट्रैक कर रहा हूं। जहां तक ​​मुझे पता है, मुझे अंक के उस सेट का उपयोग करके बी-स्पलाइन पथ करना होगा। तो मुझे इसे क्यूबिक बेजियर वक्र में कम करना चाहिए (पथ में 'पेन टूल' कार्यक्षमता जोड़ना)।

मैंने पहले से ही एल्गोरिदम का उपयोग करके पेन टूल विकसित किया है जो क्यूबिक बेजियर को क्वाड्रैटिक बेजियर (और फिर फ्लैश वक्र फ़ंक्शन का उपयोग करके) को कम करता है। लेकिन मुझे नहीं पता कि बी-स्पलाइन (या एक और सरलीकरण) कैसे बनाया जाए, फिर इसे बेजियर वक्र में कम करें।

क्या आप इसे पूरा करने के किसी भी तरीके से जानते हैं?

+0

मैं वही चीज़ ढूंढ रहा हूं लेकिन जावास्क्रिप्ट, क्या आप किसी को जानते हैं? – igor

उत्तर

7

jhotdraw ड्राइंग के लिए जावा में एक ओपनसोर्स प्रोजेक्ट है। यह क्यूबिक बेजियर घटता में मुक्त हाथ चित्रों को परिवर्तित करता है। स्रोत उपलब्ध है - डाउनलोड करें और अनुवाद करें। परियोजना के आकार पर डर मत हो: आप अर्थात् वर्गों में से केवल एक जोड़े की जरूरत है: (उपयोग वैक्टर आप केवल FP10 उपयोगकर्ताओं को लक्षित कर रहे हैं) सरणी के लिए सभी संग्रह घोषणाओं बदलकर शुरू में अनुवाद के दौरान

org.jhotdraw.geom.Bezier 
org.jhotdraw.geom.BezierPath 
org.jhotdraw.geom.Geom 

। मेरे पास कुछ regexes है कि आप रूपांतरण में उपयोगी पा सकते हैं - यदि आप चाहें तो मैं उन्हें पोस्ट कर सकता हूं।


यहां रेगेक्स की एक सूची है जो आपको उपयोगी मिल सकती है। प्रत्येक जोड़ी में, पहले को खोज टेक्स्ट क्षेत्र में पेस्ट करें और दूसरे स्थान को प्रतिस्थापित करने के लिए पेस्ट करें, रेगेक्स चेक बॉक्स को चेक करें और खोजें और बदलें बटन का उपयोग करें। Replace Allका उपयोग न करें - इनमें से कोई भी मूर्खतापूर्ण होने की गारंटी नहीं है।

var name:Number

\b(double|int)\s+(\w+)\b 

var $2:Number 

के साथ सभी int/double name घोषणाओं बदलें var name:Point

\bPoint2D\.Double\s+(\w+)\b 

var $1:Point 

के साथ सभी Point2D.Double name घोषणाओं की जगह के साथ समारोह हस्ताक्षर में सभी int/double name घोषणाओं बदलें name:Number

\(([^)]*)\b(?:double|int)\s+(\w+)\b([^)]*?)\) 

($1$2:Number$3) 

विधि हस्ताक्षर बदलने से पहले name:Point

\(([^)]*)\b(?:Point2D\.Double)\s+(\w+)\b([^)]*?)\) 

($1$2:Point$3) 

साथ समारोह हस्ताक्षर में सभी Point2D.Double name घोषणाओं बदलें, सुनिश्चित करें कि सभी तरीकों स्थिर कर रहे हैं:

(public|private)\s+(?!static) 

प्रारूप के रूप में

(public|private)\s+static\s+(\w+)\s+(\w+)\s*\(([^)]*)\) 

$1 static function $3($4):$2 

लिए विधि हस्ताक्षर बदलें सरणी [अनुक्रमणिका] // के साथ ArrayList.get (अनुक्रमणिका) को बदलें // चेतावनी: list.get (सूची के लिए विफल रहता है।आकार() - 1)

(\w+)\.get\(([^)]+)\) 

$1[$2] 

//avoid the() failure 

(\w+)\.get\(([^)]*(?:\([^)]*\))[^)]*)\) 

$1[$2] 

array[index] = element // चेतावनी के साथ बदलें ArrayList.set(index, element): list.set (i, list.size())

(\w+)\.set\(([^,]+)\s*,\s*([^)]+)\) 

$1[$2] = $3 


/*the above regex successfully made the following replacement*/ 

cleaned.set(cleaned.size() - 1, digitizedPoints[digitizedPoints.size() - 1]) 

cleaned[cleaned.size() - 1] = digitizedPoints[digitizedPoints.size() - 1] 

array.push(object)

साथ arraylist.add(object) बदलें के लिए विफल रहता है
//would fail if object contains ')' 
//add(index, object) should be done with splice 

(\w+)\.add\(([^)]+)\) 

$1.push($2) 

//too many failures - fail safe version - 
//still fails for nested parenthesis list.add(new Point(a.first(), a.last())) 
//- only three such cases - the effort to match parenthesis wouldn't be worth it 
//works for list.add(new Point(3, 4)) - there were many similar cases 

(\w+)\.add\(([^)]*(?:\([^)]*\))[^)]*)\) 

$1.push($2) 

एएस प्रारूप (गैर स्थैतिक विधियों) में विधि हस्ताक्षर बदलें

(public|private)\s+(?!function)(\w+)\s+(\w+)\s*\(([^)]*)\) 

$1 function $3($4):$2 

name:type

\(([^)]*)\b(\w+)\s+(\w+)\b([^)]*?)\) 

($1$3:$2$4) 

साथ समारोह हस्ताक्षर में सभी int/double/point/boolean name घोषणाओं बदलें ब्रेसिज़ के प्रारूप के रूप में

^(\s+)(\w+)\s+(\w+)\s*=\s*(.+?)\s*;(\s*)$ 

$1var $3:$2 = $4;$5 

परिवर्तन रखने के लिए एक = के साथ अपनी स्वयं की पंक्ति में सभी चर घोषणाओं बदलें।

^(\t)(\s*)([^\n]+)\{\s*(\n)\s+ 

$1$2$3$4$1$2{$4$1$2 

परिवर्तन } else} \n else

^([ \t]+)}[ \t]*else\b([^\n]*)(\n) 

$1}$3$1else$2$3 

में अलग लाइनों में के रूप में करने के लिए एक पंक्ति में 4 चर घोषणाओं बदलें

^(\t+)(\w+)\s+(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*,\s*(\w+)\s*;[ \t]*(\n) 

$1var $3:$2;$7$1var $4:$2;$7$1var $5:$2;$7$1var $6:$2;$7 

सरणी घोषणाओं बदलें

^(\s+)\w+\[\]\s*(\w+)\b 

$1 var $2:Array 

निकालें() कास्टिंग - संकलक के रूप में पसंद नहीं है उन्हें

(?:\(\w+\)\s*)([^ ,*+;/)><=\-]) 

$1 

Math.max में बदलें अधिकतम आदि - के रूप में स्थिर आयात

(?<!Math\.)\b(max|min|abs|sqrt|PI|cos|sin|atan2)\(

Math.$1(
+0

मैंने पुस्तकालय की जांच की है और यह शानदार लग रहा है। नमूना ड्रा एप्लिकेशन बिल्कुल वही करता है जो मैं चाहता हूं। संदर्भ के लिए धन्यवाद। – yizzreel

+0

यहां रेगेक्स हैं जिनके बारे में मैं बात कर रहा था। – Amarghosh

+0

क्या एक बढ़िया काम !! मैंने जावा कोड को AS3 पर पोर्ट करना शुरू कर दिया है, यह एक कठिन काम नहीं प्रतीत होता है, लेकिन यह प्रक्रिया को तेज़ी से बढ़ाएगा। बहुत बहुत धन्यवाद। – yizzreel

1

मैं इस समारोह एक बार उपयोग नहीं है।

 

    public function multicurve(g: Graphics, args: Array, closed: Boolean): void {   
      var mid: Array = args.slice(); //make dublicate 
      var i: uint; 
      var point: Point; 
      var nextPoint: Point; 
      var numPoints: uint = mid.length; 

      if (numPoints == 2) { 
       g.moveTo(mid[0].x, mid[0].y); 
       g.lineTo(mid[1].x, mid[1].y); 
       return; 
      } 

      var Xpoint: Array = new Array(); 
      var Ypoint: Array = new Array(); 
      for (i = 1; i < numPoints - 2; i++) { 
       point = mid[i]; 
       nextPoint = mid[i+1]; 
       Xpoint[i] = 0.5*(nextPoint.x + point.x); 
       Ypoint[i] = 0.5*(nextPoint.y + point.y); 
      } 
      if (closed) { 
       Xpoint[0] = 0.5*(mid[1].x + mid[0].x); 
       Ypoint[0] = 0.5*(mid[1].y + mid[0].y); 
       Xpoint[i] = 0.5*(mid[i+1].x + mid[i].x); 
       Ypoint[i] = 0.5*(mid[i+1].y + mid[i].y); 
       Xpoint[i+1] = 0.5*(mid[i+1].x + mid[0].x); 
       Ypoint[i+1] = 0.5*(mid[i+1].y + mid[0].y); 
       mid.push(new Point(mid[0].x, mid[0].y)); 
       Xpoint[i+2] = Xpoint[0]; 
       Ypoint[i+2] = Ypoint[0]; 
      } else { 
       Xpoint[0] = mid[0].x; 
       Ypoint[0] = mid[0].y; 
       Xpoint[i] = mid[i+1].x; 
       Ypoint[i] = mid[i+1].y; 
       mid.pop(); 
       numPoints--; 
      } 
      g.moveTo(Xpoint[0], Ypoint[0]); 
      for (i = 1; i < numPoints; i++) { 
       point = mid[i]; 
       g.curveTo(point.x, point.y, Xpoint[i], Ypoint[i]); 
      } 
      if (closed) { 
       g.curveTo(mid[0].x, mid[0].y, Xpoint[i], Ypoint[i]); 
      } 
     } 

 
1

एसी पुस्तकालय में एक एल्गोरिथ्म है: http://tog.acm.org/resources/GraphicsGems/gems/FitCurves.c

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

+0

हे! धन्यवाद! यह अच्छा लग रहा है! मैं पहले से ही jHotDraw एल्गोरिदम (सरलीकृत) का उपयोग कर रहा हूं, और यह आपके द्वारा लिंक किए गए कोड की तरह बहुत काम करता है। हालांकि, मैं भी इस पर एक गहरी नजर डालेंगे। और ऐसा लगता है कि वेबसाइट में अधिक स्रोत हैं जहां फ़ाइल है। संदर्भ के लिए फिर से धन्यवाद! – yizzreel

+0

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

+0

अब लिंक करें मृत। यहाँ संग्रहित: https://web.archive.org/web/20090805204502/http://tog.acm.org/resources/GraphicsGems/gems/FitCurves.c और इस नए आधिकारिक लिंक दिखाई देता है: https://github.com/erich666/GraphicsGems/blob/master/gems/FitCurves.c /* एक "ग्राफिक्स रत्न", अकादमिक प्रेस, 1990 से स्वचालित रूप से फिटिंग डिजीटल वक्र फिलिप जे श्नाइडर द्वारा लिए एल्गोरिथ्म * / – murkle

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