gpt4 book ai didi

javascript - 旋转/平移和恢复后在 Canvas 上定位

转载 作者:搜寻专家 更新时间:2023-10-31 08:36:45 25 4
gpt4 key购买 nike

好吧,这越来越复杂了......

给定情况:
我有一个尺寸为 800x600 的 Canvas 。
我的鼠标位于 Canvas 位置 100x200(例如)。

我保存我的 Canvas 状态。
现在我旋转和平移 Canvas ,画一个正方形。
我恢复我的 Canvas 状态。

有什么方法可以判断我的鼠标是否在正方形上?
我想我也必须平移/旋转我的鼠标位置 - 在相反的方向,但我该怎么做?

最佳答案

您可以通过递归地应用此公式来获取对象世界位置/旋转:

worldX = parentX + x * Math.cos( parentR ) - y * Math.sin( parentR );
worldY = parentY + x * Math.sin( parentR ) + y * Math.cos( parentR );
worldR = parentR + r;

JavaScript 实现将是:

var deg2rad, rad2deg, getXYR;

deg2rad = function ( d ) { return d * Math.PI / 180 };
rad2deg = function ( r ) { return r / Math.PI * 180 };

getXYR = function ( node ) {
var x, y, r,
parentXYR, pX, pY, pR,
nX, nY;

x = y = r = 0;

if ( node ) {
parentXYR = getXYR( node.parent );
pX = parentXYR.x;
pY = parentXYR.y;
pR = deg2rad( parentXYR.r );
nX = node.x;
nY = node.y;

x = pX + nX * Math.cos( pR ) - nY * Math.sin( pR );
y = pY + nX * Math.sin( pR ) + nY * Math.cos( pR );
r = rad2deg( pR + deg2rad( node.r ) );
}

return { x:x, y:y, r:r };
};

尝试使用这些对象:

el1 = {x:3,y:0,r:45};
el2 = {x:0,y:0,r:45};
el1.parent = el2;
getXYR(el1);

用不了多久你要计算两个物体之间的最短 Angular ,如果你得到两个物体之间的deltaX(x2-x1)和deltaY(y2-y1)你可以用这个函数得到 Angular :

var getAngle = function ( dx, dy ) {
var r = Math.atan2( dy, dx ) * 180 / Math.PI;
return ( r > 180 ) ? r-360 :
( r < -180 ) ? r+360 :
r;
}

从长远来看,最好改用矩阵来学习。获得世界 pos/rot 的等价物是一个世界矩阵。这里有一些关于矩阵的好信息(在 SVG 文档中,但它不相关):http://www.w3.org/TR/SVG/coords.html#NestedTransformations

这就是你如何处理矩阵(和 gl-matrix 库 https://github.com/toji/gl-matrix ):

var getWorldMatrix = function ( node ) {
var parentMatrix;

if ( !node )
return mat4.identity();

parentMatrix = getWorldMatrix( node.parent );
return mat4.multiply( parentMatrix, node.matrix );
};

哦,我忘了,现在要最终注册一次点击,您只需获取鼠标的屏幕坐标并将它们与对象位置 + Canvas 视口(viewport)偏移量进行比较。

关于javascript - 旋转/平移和恢复后在 Canvas 上定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com