在HTML5画布上反转X和Y坐标
Invert X and Y coordinates on HTML5 canvas
我正在开发一个有HTML5画布的界面,当你选择一个位置时,我需要反转X和Y坐标。我原以为从选定的X位置减去画布的宽度,从选定的Y位置减去画布高度会反转坐标,但这会做一些非常奇怪的事情。
在画布左上角单击时记录的X坐标和Y坐标是X:324,Y:483
,但理论上它们应该是X:650,Y:587
,在右下角单击时,记录的坐标为X:-325,Y:-103
,而理论上它们应当是X:0,Y:0
。顺便说一句,我知道当你点击时出现的点是使用倒置的坐标,这很好。
任何帮助都是感激的,尤其是当我做错了什么的时候。谢谢
JS:
window.fires.directive('fieldDirective', ['ScoutService', '$interval', function(ScoutService, $interval) {
var $scope = this;
$scope.sServ = ScoutService;
$interval(function(){
$scope.col = ScoutService.getAllianceColor();
},1);
return {
restrict: "A",
link: function(scope, element) {
element.bind('mousedown', function(event) {
var canvas = document.getElementById('field');
var context = canvas.getContext('2d');
if(event.offsetX !== undefined) {
$scope.xPos = 650 - event.offsetX;
$scope.yPos = 587 - event.offsetY;
$scope.sServ.sendLobCoords(xPos, yPos);
} else {
$scope.xPos = 650 - event.layerX - event.currentTarget.offsetLeft;
$scope.yPos = 587 - event.layerY - event.currentTarget.offsetTop;
$scope.sServ.sendLobCoords(xPos, yPos);
}
console.log('red'+$scope.xPos + ' ' + $scope.yPos);
canvas.width = canvas.width;
context.arc($scope.xPos, $scope.yPos, 12, 0, Math.PI*2);
context.fillStyle = '#FFFF00';
context.fill();
context.lineWidth = 3;
context.strokeStyle = '#B2B200';
context.stroke();
context.closePath();
});
}
};
}]);
HTML:
<canvas field-directive id="field" ng-class="{'field-red': sCtrl.fieldColor === 'red', 'field-blue': sCtrl.fieldColor === 'blue'}" width="650" height="587">Your browser does not support the HTML5 Canvas Element. Please use a supported browser such as Google Chrome 4.0+ or FireFox 2.0+.</canvas>
- 首先,通过从客户端坐标中减去元素的位置,使x和y相对于画布元素本身
- 然后从宽度中减去调整后的x,从height中减去y
- 如果您需要一个绝对位置,请添加回偏移
修改示例:
element.bind('mousedown', function(event) {
var canvas = document.getElementById('field');
var context = canvas.getContext('2d');
// get element position
var rect = canvas.getBoundingClientRect();
// get inversed coordinates: enable code after comment if abs. pos.
var ix = canvas.width - (event.clientX - rect.left); // + rect.left
var iy = canvas.height - (event.clientY - rect.top); // + rect.top
...update $scope here etc...
});
现场演示:
var canvas = document.getElementById('field');
canvas.addEventListener('mousemove', function(event) {
var canvas = document.getElementById('field');
var context = canvas.getContext('2d');
// get element position
var rect = canvas.getBoundingClientRect();
// get inversed coordinates: enable code after comment if abs. pos.
var ix = canvas.width - (event.clientX - rect.left); // + rect.left
var iy = canvas.height - (event.clientY - rect.top); // + rect.top
// draw something
context.clearRect(0, 0, 500, 180);
context.fillRect(ix - 2, iy - 2, 4, 4);
});
canvas {border: 1px solid #007}
<canvas id="field" width=500 height=180></canvas>
我认为问题的出现是因为offsetX和offsetY与单击的项目绑定。在这种情况下,不管"元素"是什么。如果点击事件直接绑定到画布上,我认为你的代码会起作用。
尝试将事件绑定到画布本身,或者使用具有单击行为的元素的位置和画布的位置来进行校正计算。
相关文章:
- 查找带有边框的HTML5 Canvas(点击)事件的坐标
- HTML5获取弧的坐标's结束
- HTML5画布坐标用铬处理
- 在HTML5画布上反转X和Y坐标
- HTML5画布绘图应用程序中的鼠标坐标漂移
- HTML5 画布鼠标侦听器坐标未定义
- 如何缩放 html5 画布以显示谷歌地图坐标
- 将 HTML5 地理坐标分配给 JavaScript 变量
- HTML5 画布鼠标坐标
- 在HTML5画布上移动时跟踪鼠标坐标的简单方法
- 使用html5中的地理位置在谷歌地图中显示坐标列表
- 是否可以在网页中使用HTML5或jquery中的坐标进行导航
- 使用Javascript鼠标事件返回HTML5画布上鼠标点击的坐标
- 为什么这个HTML5应用程序的性能在坐标加载时下降?
- 如何在Javascript/HTML5的TeeChart中获得最新绘制的点坐标
- 在Javascript HTML5 Canvas中获取鼠标点坐标
- 为HTML5画布绘制指针(鼠标坐标)
- 使用HTML5画布的鼠标坐标问题
- 通过表单提交在HTML5画布上保存框的坐标
- HTML5地理定位将当前GPS位置的长宽坐标转换为一个变量