我知道我可以用画布的arc
函数绘制弧线,但是当我增加弧线的大小时,它会改变它的起点和终点x,y点。所以我在考虑是否可以通过其他方式绘制弧线来保持其起点终点固定,同时增加它的大小。
修改
下面是显示我正在寻找的图像。第一张图片显示一个矩形。当它的侧面被拉伸时,它变为圆形(第2个图像)。当侧面进一步拉伸时,它变成了大圆圈。在所有图像中,您可以看到圆的端点连接到矩形的角。这就是我想要做的。
第一张图片
第二张图片
第3张图片
或者你可以看到this video来了解我的目标。
我做了什么
这fiddle
显示了我工作的结果
要绘制矩形,只需单击并拖动鼠标即可。
答案 0 :(得分:4)
我相信你正在寻找这样的东西:
draw(0);
$('#range').on('change', function(){
range = parseInt($(this).val());
draw(range)
})
function draw(val){
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d'),
x = 100,
y = 50,
d;
context.clearRect(0, 0, canvas.width, canvas.height);
d = Math.sqrt(Math.pow(val,2) + Math.pow(50,2));
context.beginPath();
context.lineWidth = 1;
context.arc(x,y+val,d,0,2*Math.PI);
// line color
context.strokeStyle = 'black';
context.stroke();
// Cut off the top of the circle.
context.clearRect(0, 0, canvas.width, y);
// This stuff's just to show some dots
context.fillStyle = 'red';
context.fillRect(x-1,y-1,2,2); // Middle
context.fillRect(x-52,y-2,4,4);//Target point 1
context.fillRect(x+48,y-2,4,4);// Target point 2
context.fillRect(x-2,y+d+val-2,4,4); // Point on circle
context.fillStyle = 'black';
}
<强> Working sample 强>
这有一些缺点是它越接近圆圈就越“慢”,因为圆圈在隐藏部分中呈指数级变大(滑块控制它的大小),并且它不起作用对于现在的对角线。
除此之外,它的效果与预期的一样。
答案 1 :(得分:2)
请检查:http://jsfiddle.net/KZBzq/4/
使用 bezierCurveTo
更新了答案<强> HTML 强>
<label>Range :</label>
<input type="range" name="points" value="0" min="0" step="1" max="100" id="range">
<canvas id="myCanvas" width="578" height="250"></canvas>
<强> JS 强>
draw(100);
$('#range').on('change', function(){
range = parseInt($(this).val());
draw(100-range)
})
function draw(val){
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d'),
x = 100,
y = 100,
cp1x = x/2,
cp2x = y/2,
cp1y = val,
cp2y = val;
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.lineWidth = 1;
context.moveTo(25 , x);
context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);
// line color
context.strokeStyle = 'black';
context.stroke();
}
现在x和Y是固定的。这是你的要求吗?