如何更改以下代码以强制HTML5画布从弧的左上角而不是从中心绘制。
我目前有:
function drawCircle(e) {
var oe = e.originalEvent || e;
ctx.beginPath();
ctx.arc(start.x, start.y + 10, oe.pageX - start.x - offset.left, 0, 2 * Math.PI, false);
ctx.stroke();
ctx.closePath();
}
我有以下小提琴(为方便起见,下面的代码) - 如果你开始绘制它,那么圆圈被绘制得很好但它从你放置鼠标的中心向外绘制:http://jsfiddle.net/g4zxp/
我想从左上角向下拖动圆圈,但我无法弄清楚要做的数学!我知道我需要计算并不断改变中心点。
有什么想法吗?
由于
代码如下:
HTML :
<canvas width="200" height="200"></canvas>
的JavaScript / jQuery的:
$(function () {
var $canvas = $('canvas'),
canvas = $canvas.get(0),
offset = $canvas.offset(),
ctx,
drawing = false,
start = {
x: null,
y: null
};
function init() {
if (canvas.getContext) {
ctx = canvas.getContext('2d');
ctx.lineJoin = 'round';
ctx.lineCap = 'round';
ctx.strokeStyle = '#000000';
ctx.lineWidth = 5;
}
}
function startDrawing(e) {
var oe = e.originalEvent || e;
e.preventDefault();
drawing = true;
start.x = Math.floor(oe.pageX - offset.left);
start.y = Math.floor(oe.pageX - offset.left);
}
function continueDrawing(e) {
e.preventDefault();
if (!drawing) {
return;
}
clearCanvas();
drawCircle(e);
}
function endDrawing(e) {
e.preventDefault();
drawing = false;
}
function clearCanvas() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function drawCircle(e) {
var oe = e.originalEvent || e;
ctx.beginPath();
ctx.arc(start.x, start.y + 10, oe.pageX - start.x - offset.left, 0, 2 * Math.PI, false);
ctx.stroke();
ctx.closePath();
}
$canvas.on('touchstart mousedown', function (e) {
startDrawing(e);
});
$canvas.on('touchmove mousemove', function (e) {
continueDrawing(e);
});
$canvas.on('touchend mouseup', function (e) {
endDrawing(e);
});
init();
});
答案 0 :(得分:2)
我假设“弧的左上角”是下图中线条的交点。在这种情况下,距离圆心的距离是sqrt(2 * r^2)
距离“左上角”的距离
但是,由于画布中的圆圈无论如何都使用x和y定位,我们可以使用它。从中心到垂直线上最近点的距离是r,从中心到水平线上最近点的距离也是如此
这意味着(因为(0,0)在左上角)“左上角”的x位置是center's x position - r
而“左上角”的y位置是center's y position - r
或{{1简而言之
您可以使用代码(例如(cX - r, cY - r)
)在画布中手动计算此内容,以便:
oe.pageX - start.x - offset.left = r
Demo。这很好用。
但是,如果要在前端使用相同的格式,则可以创建一个功能。它看起来像这样
var r = oe.pageX - start.x - offset.left;
ctx.arc(start.x + r, start.y + 10 + r, r, 0, 2 * Math.PI, false);
希望它有所帮助!
答案 1 :(得分:0)
好的,所以有一种非常简单的方法可以做到这一点,而你的ctx.arc()
电话中只有一个错误,那就是全部:
ctx.arc(oe.layerX, oe.layerY, Math.abs(oe.pageX - start.x - offset.left), 0, 2 * Math.PI, false);
我还将半径设置为绝对值,以便您可以在负方向绘制圆圈而不会使应用程序崩溃。希望我能早点得到你,我想你以前会想要这个非常简单的答案。
顺便说一下,here is your fiddle所有人都已经修好并完全按照你的意愿行事。对不起,我没早见到你!