2010-08-25 26 views
5

Cho các đường được vẽ bằng chức năng ngữ cảnh canvas 2d bezierCurveTo, quadraticCurveTo hoặc arcTo, làm cách nào để tìm điểm dọc theo các đường đó?Tìm điểm trên đường cong trong HTML 5 2d Ngữ cảnh canvas

Mục đích của tôi là vẽ một đối tượng tại điểm giữa của đường cong. Sử dụng SVG DOM, tôi có thể làm điều này với các phương pháp getPointAtLength & getTotalLength, nhưng tôi không thể thấy tương đương trong canvas HTML.

Trả lời

10

Bạn tìm thấy chúng một cách khó khăn :(

Có không phải là một tương đương trong HTML canvas. Bạn phải tìm trung điểm cho mình với toán cũ đồng bằng.

tôi đã làm một ví dụ về cách tìm điểm giữa của đường cong bezier cho bạn. Xem nó sống ở jsFiddle here. một bản sao của javascript được dán bên dưới.

Bất đường cong màu đỏ, điểm giữa là hình chữ nhật màu xanh lá cây nhỏ xíu. Mọi thứ khác chỉ là một viện trợ thị giác.

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

Wow! Đó là cách vượt ra ngoài hữu ích. Tất cả những gì tôi đang tìm kiếm là để ai đó xác nhận sự tồn tại hoặc vắng mặt của một cách dễ dàng, trước khi tôi bẻ khóa và làm điều đó một cách khó khăn. –

Các vấn đề liên quan