【问题标题】:How to change the origin of the canvas to the center?如何将画布的原点更改为中心?
【发布时间】:2014-04-30 04:14:14
【问题描述】:

我是 html 和 JavaScript 的新手,我正在编写一个处理坐标系中的点和线的程序,但是你知道 html5 的画布的原点在上角,我想建立一个坐标系统的原点位于画布的中心,我尝试了 translate 方法并使用以下方法打印鼠标的位置(理想情况下,当鼠标位于画布的中心时,我希望它显示 0 : 0) ,但它似乎不起作用:

var mousePos = getMousePos(canvas1, evt);
mouseX = mousePos.x;
mouseY = mousePos.y;
var message = 'Mouse position: ' + mousePos.x + ',' + mousePos.y;
writeMessage(document.getElementById("canvas_prime_coor"), message);

function writeMessage(canvas, message) {
    var context = canvas.getContext('2d');
    context.clearRect(0, 0, canvas.width, canvas.height);
    context.font = '18pt Calibri';
    context.fillStyle = 'red';
    context.fillText(message, 10, 25);
}

function getMousePos(canvas, evt) {
    var rect = canvas.getBoundingClientRect();
    return {
        x: evt.clientX - rect.left,
        y: evt.clientY - rect.top};
}

【问题讨论】:

标签: javascript html canvas


【解决方案1】:

要更改坐标 系统,您可以使用translate() 方法。但是,上下文的转换不会影响绑定到 元素 本身的鼠标坐标,因此您需要单独跟踪这一点。

您必须手动跟踪平移并补偿鼠标坐标:

var transX = canvas.width * 0.5,
    transY = canvas.height * 0.5;

context.translate(transX, transY);

现在的问题是你要处理两个不同的职位:

a) 相对于元素的实际鼠标位置
b) 需要的坐标对于上下文

是正确的

如果你翻译然后使用鼠标位置,你翻译到中心会发生以下情况:

假设您的鼠标坐标是 30,30。如果您在翻译后的上下文中使用此坐标,则图形最终会位于 transX + 30、transY + 30,这不是您想要的。

为了弥补这一点,您需要跟踪当前的平移并将其减去鼠标坐标:

function getMousePos(canvas, evt) {
    var rect = canvas.getBoundingClientRect();
    return {
        x: evt.clientX - rect.left - transX,
        y: evt.clientY - rect.top - transY
    };
}

FIDDLE

希望这会有所帮助!

【讨论】:

  • 非常感谢您的详细解释,它就像一个魅力!
  • 您可能想要翻转 y 轴,这样随着 context.scale(1, -1) 的增加而增加;
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多