2013-10-19 5 views
5

मैं एक जावास्क्रिप्ट चर/सरणी के लिए एक विशिष्ट पथ कैसे सहेज सकता हूं, और बाद में एचटीएमएल 5 कैनवास का उपयोग करते समय इसे कुशलतापूर्वक उपयोग कर सकता हूं? यहाँ मैं अब तक क्या कर रहा है: मैं क्या जरूरत है,एचटीएमएल 5 कैनवास: व्यक्तिगत पथों का उपयोग करना

    ctx.beginPath(); 
         ctx.moveTo(lastX,lastY); 
         ctx.lineTo(x,y); 
         ctx.lineWidth = s*2; 
         ctx.stroke(); 
        ctx.closePath(); 

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

+0

हो सकता है कि एक समारोह में उन कार्यों को बचाने के? तो आपके पास कार्यों की एक सरणी होगी। – Cristy

+0

जब भी आपको इस तरह की कार्यक्षमता की आवश्यकता होती है, तो एसवीजी का उपयोग करने पर विचार करें। – slebetman

उत्तर

0

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

0

संक्षिप्त उत्तर सेट अप कर सकते हैं: आप नहीं कर सकते। यह कैनवास 2 डी एपीआई के लिए अगले मसौदे में है (http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas/#path-objects देखें), लेकिन अभी तक समर्थित नहीं है।

लंबा उत्तर: आप नहीं कर सकते, लेकिन आप एक ऑब्जेक्ट लिख सकते हैं जो पथ का प्रतिनिधित्व करता है, और इसे draw(canvas) फ़ंक्शन देता है ताकि वह अपने चुने हुए रंगों के साथ कैनवास पर आ जाए और गुणों को भर सके। उदाहरण के लिए:

var Path = function() { 
    this.instructions = []; 
} 
Path.prototype = { 
    instructions: [], 
    moveTo: function(x,y) { 
    instructions.push({ 
     type: "moveTo", 
     arguments: [x,y] 
    }); 
    } 
    ... 
    draw: function(canvas) { 
    var ctx = canvas.getContext("2d"); 
    ctx.beginPath(); 
    this.instructions.forEach(function(i) { 
     ctx[i.type].apply(i.arguments); 
    }); 
    ctx.closePath(); 
    } 
} 
+0

यह काम करता है, मैं इसके बारे में बिल्कुल कैसे जा सकता हूं? –

+0

उत्तर का उत्तर देने के लिए संपादित किया गया। –

+0

ऑब्जेक्ट 'पथ' को कॉल करने के लिए सावधान रहें क्योंकि यह भविष्य के पथ के लिए आरक्षित है। – K3N

2

आप सभी डेटा एक जावास्क्रिप्ट वस्तु में एक पथ आकर्षित करने के लिए की जरूरत को क्रमानुसार कर सकते हैं

javascript ऑब्जेक्ट का उपयोग करने का लाभ यह है कि आप आगे JSON करने के लिए वस्तु को क्रमानुसार सकते हैं यदि आप स्थानांतरित करने की आवश्यकता है आपके पथ एक अलग स्थान पर (जैसे सर्वर पर वापस)।

var path1={ 
    lineWidth:1, 
    stroke:"blue", 
    points:[{x:10,y:10},{x:100,y:50},{x:30,y:200}] 
}; 

तो फिर तुम उस वस्तु का उपयोग कर सकते आकर्षित करने के लिए/उस पथ

function draw(path){ 

     // beginPath 
     ctx.beginPath(); 

     // move to the beginning point of this path 
     ctx.moveTo(path.points[0].x,path.points[0].y); 

     // draw lines to each point on the path 
     for(pt=1;pt<path.points.length;pt++){ 
      var point=path.points[pt]; 
      ctx.lineTo(point.x,point.y); 
     } 

     // set the path styles (color & linewidth) 
     ctx.strokeStyle=path.stroke; 
     ctx.lineWidth=path.lineWidth; 

     // stroke this path 
     ctx.stroke(); 
    } 

रास्तों में से रंग बदलने के लिए पुनः बनाने, तुम बस वस्तु के स्ट्रोक संपत्ति बदल सकते हैं और आकर्षित कॉल करनी होगी() फिर से: http://jsfiddle.net/m1erickson/McZrH/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; } 
    #canvas{border:1px solid red;} 
</style> 

<script> 
$(function(){ 

    // get references to canvas and context 
    var canvas=document.getElementById("canvas"); 
    var ctx=canvas.getContext("2d"); 

    // serialize paths to a javascript objects 
    var path1={lineWidth:1, stroke:"blue", points:[]}; 
    var path2={lineWidth:4, stroke:"red", points:[]}; 

    // save the paths to an array 
    var paths=[]; 
    paths.push(path1); 
    paths.push(path2); 


    // build test path1 
    newPoint(25,25,path1); 
    newPoint(100,50,path1); 
    newPoint(50,75,path1); 
    newPoint(25,25,path1); 

    // build test path2 
    newPoint(200,100,path2); 
    newPoint(250,100,path2); 
    newPoint(250,200,path2); 
    newPoint(200,200,path2); 
    newPoint(200,100,path2); 

    // draw the paths defined in the paths array 
    draw(); 

    // add a new point to a path 
    function newPoint(x,y,path){ 
     path.points.push({x:x,y:y}); 
    } 


    function draw(){ 

     ctx.clearRect(0,0,canvas.width,canvas.height); 

     for(p=0;p<paths.length;p++){ 

      // get a path definition 
      var path=paths[p]; 

      // beginPath 
      ctx.beginPath(); 

      // move to the beginning point of this path 
      ctx.moveTo(path.points[0].x,path.points[0].y); 

      // draw lines to each point on the path 
      for(pt=1;pt<path.points.length;pt++){ 
       var point=path.points[pt]; 
       ctx.lineTo(point.x,point.y); 
      } 

      // set the path styles (color & linewidth) 
      ctx.strokeStyle=path.stroke; 
      ctx.lineWidth=path.lineWidth; 

      // stroke this path 
      ctx.stroke(); 

     } 

    } 

    // test 
    // change the stroke color on each path 
    $("#recolor").click(function(){ 
     paths[0].stroke="orange"; 
     paths[1].stroke="green"; 
     draw(); 
    }); 

}); // end $(function(){}); 
</script> 

</head> 

<body> 
    <button id="recolor">Recolor</button><br> 
    <canvas id="canvas" width=300 height=300></canvas> 
</body> 
</html> 
012:

paths[0].stroke="orange"; 
    paths[1].stroke="green"; 
    draw(); 

यहाँ कोड है और एक फिडल है

2

ऐसा लगता है कि अब यह path2D ऑब्जेक्ट के साथ संभव है।

नया पथ 2 डी एपीआई (फ़ायरफ़ॉक्स 31+ से उपलब्ध) आपको पथों को स्टोर करने देता है, जो आपके कैनवास ड्राइंग कोड को सरल बनाता है और इसे तेज़ी से चलाता है।

new Path2D();  // empty path object 
new Path2D(path); // copy from another path 
new Path2D(d); // path from from SVG path data 

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

var p = new Path2D("M10 10 h 80 v 80 h -80 Z"); 

सूचना Mozilla official site से लिया जाता है।

+0

धन्यवाद, यह बहुत अच्छा काम करता है! –

0

यह मदद कर सकता है:

http://www.rgraph.net/blog/2015/september/svg-style-paths-for-canvas-with-the-rgraph-path-function.html

यह एक समारोह है कि आप एक स्ट्रिंग है, अक्षर और अंक जो तब इस समारोह से व्याख्या कर रहे हैं और कार्रवाई किए गए होते हैं का उपयोग करने की अनुमति देता है। तो अब आपका पथ एक स्ट्रिंग हो सकता है - बस एसवीजी पथ की तरह - और वे डेटाबेस में पास और/या स्टोर करने के लिए कहीं अधिक आसान हैं।

तो एक आयत आकर्षित करने के लिए एक रास्ता इस प्रकार दिखाई देंगे:

ख आर 5 में से 5 100 100 च लाल

इसका मतलब है कि:

b: beginPath() 
r: rect() 
f: fill() 
संबंधित मुद्दे