var ctx = c.getContext("2d"),
line = [116,34,116,37,116,39,116,49,119,71,126,103,140,141,160,181,190,224,226,263,263,
293,312,316,363,327,416,328,458,322,491,313,515,295,537,272,557,244,570,
224,580,208,586,196,591,188,595,182,596,178,598,176,601,174,604,172,605,171],
line2 = [], // the interpolated segments
maxSubSeg = 16, // number of sub-segements
minThick = 2, // taper thickness
maxThick = 16;
// interpolate the line to create more segments
for(var i = 0; i < line.length - 2; i += 2) {
var x1 = line[i], // get line positions
y1 = line[i+1],
x2 = line[i+2],
y2 = line[i+3];
for(var j = 0; j < maxSubSeg; j++) {
line2.push(
x1 + (x2-x1) * (j/maxSubSeg), // interpolate X
y1 + (y2-y1) * (j/maxSubSeg) // interpolate Y
)
}
}
// render new line
ctx.lineCap = "round";
for(var i = 0; i < line2.length - 2; i += 2) {
ctx.beginPath();
ctx.moveTo(line2[i], line2[i+1]);
ctx.lineTo(line2[i+2], line2[i+3]);
ctx.lineWidth = minThick + maxThick * (i/line2.length); // use length as t [0,1]
ctx.stroke();
}
<canvas id=c width=640 height=400></canvas>
這似乎是SVG/D3唯一的問題?如果是這樣,那麼帆布標籤可以被刪除,以避免不必要的「噪音」 – K3N
對不起,在另一個問題,它說,它可以用畫布完成,所以我把標籤,如果有人知道使用畫布的另一個解決方案。 – echonax
啊,在那種情況下沒問題。 – K3N