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