Javascript 缩放到HTML5画布上的特定坐标(Fabric js)

Javascript 缩放到HTML5画布上的特定坐标(Fabric js),javascript,canvas,html5-canvas,fabricjs,Javascript,Canvas,Html5 Canvas,Fabricjs,我需要缩放到布料js中画布上的特定坐标Y 我知道将调用两个函数 1.缩放x倍 2.将图像移动到某个x、y位置,使图像显示在该坐标处 我还需要,一旦放大,我指定一些其他坐标,它应该缩放到新的坐标。任何提示您都可以定义自己是一台相机 你有一个绝对坐标系,你想把东西从这个坐标系投射到屏幕上。这是由摄影机对象完成的。 相机在绝对坐标系中的某个位置具有缩放因子和旋转角度。toScreen函数获取绝对坐标并将其转换为屏幕上的坐标。fromScreen则相反。moveBy是相对移动,即在屏幕坐标而非绝对坐标中

我需要缩放到布料js中画布上的特定坐标Y

我知道将调用两个函数 1.缩放x倍 2.将图像移动到某个x、y位置,使图像显示在该坐标处


我还需要,一旦放大,我指定一些其他坐标,它应该缩放到新的坐标。任何提示

您都可以定义自己是一台相机

你有一个绝对坐标系,你想把东西从这个坐标系投射到屏幕上。这是由摄影机对象完成的。 相机在绝对坐标系中的某个位置具有缩放因子和旋转角度。toScreen函数获取绝对坐标并将其转换为屏幕上的坐标。fromScreen则相反。moveBy是相对移动,即在屏幕坐标而非绝对坐标中移动。例如,如果您有一个图像,并且希望它跟随您的鼠标指针,因为鼠标指针坐标是屏幕坐标,那么这非常有用。所以你只需计算指针移动了多少,然后用这些数字的负数调用相机上的moveBy。负数,因为如果相机向左移动,它生成的图像将在屏幕上向右移动 或者,假设您单击屏幕上的一个点,然后希望相机缩放到该点。然后你只需说camera.moveBypointX,pointY,其中pointX/Y是鼠标相对于屏幕中心的位置,即相机的位置,因为在屏幕坐标中,相机始终处于位置0,0,如果需要,请更改缩放因子。顺便说一句,这里的屏幕当然是你的画布。屏幕坐标中的位置0,0应该是画布的中心。因此,我要强调的是,画布不是你的绝对坐标系,而是相机投影图像的屏幕

function Camera() {
  this.x = 0;
  this.y = 0;
  this.zoom = 1;
  this.angle = 0;
}

Camera.prototype.moveTo = function(x, y) {
  this.x = x; this.y = y;
};
Camera.prototype.moveBy = function(x, y) {
  var xy = this.fromScreen(x, y);
  this.moveTo(xy.x, xy.y);
};
Camera.prototype.rotateTo = function(angle) {
  while(angle < 0) angle += 360;
  angle %= 360;
  this.angle = angle;
};
Camera.prototype.rotateBy = function(angle) {
  this.rotateTo(this.angle + angle);
};
Camera.prototype.zoomTo = function(zoom) {
  this.zoom = zoom;
};
Camera.prototype.zoomBy = function(zoom) {
  this.zoom *= zoom;
};
Camera.prototype.toScreen = function(x, y) {
  x -= this.x; y -= this.y;
  if(this.angle !== 0) {
    var rad = Math.PI * this.angle / 180;
    rad = 2 * Math.PI - rad;
    var _x = x * Math.cos(rad) - y * Math.sin(rad),
        _y = x * Math.sin(rad) + y * Math.cos(rad);
    x = _x; y = _y;
  }
  return {x: x * this.zoom,
          y: y * this.zoom}
};
Camera.prototype.fromScreen = function(x, y) {
  x /= this.zoom;
  y /= this.zoom;
  if(this.angle !== 0) {
    var rad = Math.PI * this.angle / 180;
    var _x = x * Math.cos(rad) - y * Math.sin(rad),
        _y = x * Math.sin(rad) + y * Math.cos(rad);
    x = _x; y = _y;
  }
  x += this.x; y += this.y;
  return {x: x,
          y: y};
};