2010-08-25 5 views
5

2 डी कैनवास संदर्भ कार्यों द्वारा खींची गई रेखाएं bezierCurveTo, quadraticCurveTo या arcTo, मैं उन पंक्तियों के साथ बिंदु कैसे प्राप्त कर सकता हूं?एचटीएमएल 5 2 डी कैनवास संदर्भ में वक्रों पर अंक ढूंढना

मेरा इरादा एक वक्र के मध्य बिंदु पर ऑब्जेक्ट खींचना है। एसवीजी डोम का उपयोग करके, मैं इसे getPointAtLength & getTotalLength विधियों के साथ कर सकता हूं, लेकिन मैं HTML कैनवास में समकक्ष नहीं देख सकता।

उत्तर

10

आप उन्हें मुश्किल तरीके :(

वहाँ एचटीएमएल कैनवास में एक समान नहीं है। आप सादे पुराने गणित के साथ मध्य बिन्दुओं खुद खोजने के लिए लगता है।

मैं कैसे इस बात का एक उदाहरण किया आप के लिए बेज़ियर घटता के मध्य। यह jsFiddle here में रहते हैं देखें। जावास्क्रिप्ट की एक प्रति नीचे चिपकाया जाता है।

रियल वक्र लाल है, मध्य छोटे हरे रंग की आयत है। बाकी सब कुछ सिर्फ एक दृश्य सहायता है।

var ctx = $("#test")[0].getContext("2d") 
function mid(a,b) { 
return (a+b)/2; 
} 


var cp1x = 100; 
var cp1y = 150; 
var cp2x = 175; 
var cp2y = 175; 
var x = 200; 
var y = 0; 

ctx.lineWidth = 4; 
ctx.strokeStyle = "red"; 
ctx.fillStyle = "rgba(0,0,0,0.6)"; 

ctx.beginPath(); 
ctx.moveTo(0, 0); 
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); 
ctx.stroke(); 

//line goes from start to control point 1 
ctx.strokeStyle = "rgba(0,0,200,0.4)"; 
ctx.beginPath(); 
ctx.moveTo(0, 0); 
ctx.lineTo(cp1x , cp1y); 
ctx.stroke(); 

//line goes from end to control point 2 
ctx.beginPath(); 
ctx.moveTo(x, y); 
ctx.lineTo(cp2x , cp2y); 
ctx.stroke(); 

//line goes from control point to control point 
ctx.strokeStyle = "rgba(200,0,200,0.4)"; 
ctx.beginPath(); 
ctx.moveTo(cp1x, cp1y); 
ctx.lineTo(cp2x , cp2y); 
ctx.stroke(); 

// now find the midpoint of each of those 3 lines 
var ax = mid(cp1x,0); 
var bx = mid(cp2x,x) 
var cx = mid(cp1x,cp2x) 

var ay = mid(cp1y,0)  
var by = mid(cp2y,y)  
var cy = mid(cp1y,cp2y) 


// draw midpoints for visual aid 
// not gonna look exact 'cause square 
// will be drawn from top-right instead of center 
ctx.fillRect(ax, ay, 4, 4); 
ctx.fillRect(bx, by, 4, 4); 
ctx.fillRect(cx, cy, 4, 4); 


//now draw lines between those three points. These are green 
ctx.strokeStyle = "rgba(0,200,0,0.4)"; 
ctx.beginPath(); 
ctx.moveTo(ax, ay); 
ctx.lineTo(cx , cy); 
ctx.stroke(); 

ctx.beginPath(); 
ctx.moveTo(bx, by); 
ctx.lineTo(cx , cy); 
ctx.stroke(); 

//now the midpoint of the green lines: 
// so g1 and g2 are the green line midpoints 
var g1x = mid(ax,cx); 
var g2x = mid(bx,cx); 

var g1y = mid(ay,cy); 
var g2y = mid(by,cy); 

//draw them to make sure: 
ctx.fillRect(g1x , g1y, 4, 4); 
ctx.fillRect(g2x , g2y, 4, 4); 

//now one final line, in gray 
ctx.strokeStyle = "rgba(20,20,20,0.4)"; 
ctx.beginPath(); 
ctx.moveTo(g1x , g1y); 
ctx.lineTo(g2x , g2y); 
ctx.stroke(); 

//whew! We made it! 
var FinallyTheMidpointx = mid(g1x,g2x); 
var FinallyTheMidpointy = mid(g1y,g2y); 

//draw something at the midpoint to celebrate 
ctx.fillStyle = "rgba(0,255,0,1)"; 
ctx.fillRect(FinallyTheMidpointx, FinallyTheMidpointy, 4, 4); 

+0

वाह! यह सहायक से परे रास्ता है। मैं जिस चीज की तलाश कर रहा था वह किसी के लिए आसान तरीके से अस्तित्व या अनुपस्थिति की पुष्टि करने के लिए था, इससे पहले कि मैं क्रैक करूँ और इसे कठिन तरीके से करूँ। –

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