Javascript 多边形在旋转时会收缩

Javascript 多边形在旋转时会收缩,javascript,html,canvas,rotation,Javascript,Html,Canvas,Rotation,所以我的问题是这样的。 我使用javascript在画布中绘制多边形。我还尝试使用sin/cos基于任何给定点旋转这些多边形。我避免平移和画布旋转。鼠标移动时发生旋转 问题是结果很奇怪。由于某种原因,我的多边形有收缩的趋势,我不知道为什么 我猜可能是数学动作sin/cos的某个地方,再加上矩阵的坐标是如何设置的?也许我应该舍入值还是?我不确定,也太困惑了 下面的代码是功能性的。如果你能运行代码,你就能明白我的意思 如果您能提供任何帮助或解释为什么会发生这种情况,我们将不胜感激。 干杯 变量集=

所以我的问题是这样的。 我使用javascript在画布中绘制多边形。我还尝试使用sin/cos基于任何给定点旋转这些多边形。我避免平移和画布旋转。鼠标移动时发生旋转

问题是结果很奇怪。由于某种原因,我的多边形有收缩的趋势,我不知道为什么

我猜可能是数学动作sin/cos的某个地方,再加上矩阵的坐标是如何设置的?也许我应该舍入值还是?我不确定,也太困惑了

下面的代码是功能性的。如果你能运行代码,你就能明白我的意思 如果您能提供任何帮助或解释为什么会发生这种情况,我们将不胜感激。 干杯


变量集=
{
画布:'画布',
fps:1000/60
}
var gObjects=[];
函数deg2rads(deg){return deg*Math.PI/180;}
函数drawPoly(对象)
{
if(object.vertexPoints)
{
var ctx=document.getElementById(set.canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(object.vertexPoints[0][0],object.vertexPoints[0][1]);
ctx.fillStyle='#f00';

对于(i=1;i你的数学很好。罪魁祸首隐藏在以下两行中:

object.vertexPoints[i][0] = Math.cos(rads) * (vPoint[i][0] - pX) - Math.sin(rads) * (vPoint[i][1]-pY) + pX;
object.vertexPoints[i][1] = Math.sin(rads) * (vPoint[i][0] - pX) + Math.cos(rads) * (vPoint[i][1]-pY) + pY;
第二行使用了
vPoint[i][0]
,第一行已经对其进行了修改(
vPoint
对象。顶点指向同一数组。)

用以下材料替换这两条线可防止收缩:

var point = [ vPoint[i][0], vPoint[i][1] ];
object.vertexPoints[i][0] = Math.cos(rads) * (point[0] - pX) - Math.sin(rads) * (point[1]-pY) + pX;
object.vertexPoints[i][1] = Math.sin(rads) * (point[0] - pX) + Math.cos(rads) * (point[1]-pY) + pY;

首先感谢您的回答:) 昨天,经过几个小时的头部撞击,我终于找到了答案。我注意到这一切都发生在我的阵列上。我想这也是一个常见的错误

无论如何,我用以下内容替换了我的旋转功能:

function rotate(object,degrees) {
    if (object.vertexPoints)
        {
        var rads = deg2rads(degrees);
        var Point = new Array(object.vertexPoints.length);
        for (i=0;i<Point.length;i++) { Point[i] = new Array(2); }
        for (i=0;i<object.vertexPoints.length;i++)
            {
            pX= 300;
            pY= 540;
            Point[i][0] = Math.cos(rads) * (object.vertexPoints[i][0] - pX) - Math.sin(rads) * (object.vertexPoints[i][1]-pY) + pX;
            Point[i][1] = Math.sin(rads) * (object.vertexPoints[i][0] - pX) + Math.cos(rads) * (object.vertexPoints[i][1]-pY) + pY;
            }
        return Point;
        }
}

function mouseCoords(e) {

    if ((e||event).clientY<set.cursorY)
        {
        set.cursorY=(e||event).clientY;
        gObjects[0].vertexPoints = rotate(gObjects[0],-1);
        }
}
函数旋转(对象,度){
if(object.vertexPoints)
{
var rads=deg2rads(度);
var Point=新数组(object.vertexPoints.length);

对于(i=0;iis)来说,这也可能是因为javascript数学模型缺乏精确性造成的?我正在深入研究这一问题,事情变得很可怕。
function rotate(object,degrees) {
    if (object.vertexPoints)
        {
        var rads = deg2rads(degrees);
        var Point = new Array(object.vertexPoints.length);
        for (i=0;i<Point.length;i++) { Point[i] = new Array(2); }
        for (i=0;i<object.vertexPoints.length;i++)
            {
            pX= 300;
            pY= 540;
            Point[i][0] = Math.cos(rads) * (object.vertexPoints[i][0] - pX) - Math.sin(rads) * (object.vertexPoints[i][1]-pY) + pX;
            Point[i][1] = Math.sin(rads) * (object.vertexPoints[i][0] - pX) + Math.cos(rads) * (object.vertexPoints[i][1]-pY) + pY;
            }
        return Point;
        }
}

function mouseCoords(e) {

    if ((e||event).clientY<set.cursorY)
        {
        set.cursorY=(e||event).clientY;
        gObjects[0].vertexPoints = rotate(gObjects[0],-1);
        }
}