Javascript 将点阵列作为形状围绕其中心垂直或水平翻转
我有一个web应用程序,它接收一些点数组,我需要在画布上绘制它们。不幸的是,我得到的数据集不是我想要的方式。我需要将形状旋转180度。考虑下面的图表: 最初我得到了绿色矩形的点。举例: (1,1)、(3,1)、(2,3) 数据集中出现的点的顺序可能不同…最后是绘制形状的路径 现在我需要垂直翻转它的中心,以红色三角形结束。坐标为: (3,1)、(3,3)、(2,1) 请参见代码段中的示例。我创建了这个Javascript 将点阵列作为形状围绕其中心垂直或水平翻转,javascript,html,html5-canvas,2d,Javascript,Html,Html5 Canvas,2d,我有一个web应用程序,它接收一些点数组,我需要在画布上绘制它们。不幸的是,我得到的数据集不是我想要的方式。我需要将形状旋转180度。考虑下面的图表: 最初我得到了绿色矩形的点。举例: (1,1)、(3,1)、(2,3) 数据集中出现的点的顺序可能不同…最后是绘制形状的路径 现在我需要垂直翻转它的中心,以红色三角形结束。坐标为: (3,1)、(3,3)、(2,1) 请参见代码段中的示例。我创建了这个flipVertical函数,但它会产生负数。我认为我的公式适用于carthesian坐标,但不
flipVertical
函数,但它会产生负数。我认为我的公式适用于carthesian坐标,但不适用于2D画布,因为x,y总是正的
我可能会得到很多点的复杂形状…这个三角形只是一个例子。什么是好的解决方案
//主模板形状
设shape=[{x:10,y:10},{x:30,y:10},{x:20,y:30}];
让canvas={};//画布
设ctx={};//画布的上下文
//初始元素
$(文档).ready(函数(){
canvas=document.getElementById(“myCanvas”);
ctx=canvas.getContext(“2d”);
drawShape();
});
//绘制模板
函数drawShape(){
//原形
ctx.save();
ctx.beginPath();
ctx.strokeStyle='绿色';
ctx.fillStyle='绿色';
对于(让点的形状){
ctx.lineTo(点x,点y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
ctx.restore();
//翻转形状
ctx.save();
让flippedShape=FlippedVertical(形状);
ctx.beginPath();
ctx.strokeStyle=‘红色’;
ctx.fillStyle='红色';
对于(让翻转形状的点){
ctx.lineTo(点x,点y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
ctx.restore();
}
功能翻转垂直(点){
设ret=[];
用于(点对点){
设flipped={x:point.x,y:-1*point.y};
控制台日志(翻转);
后推(翻转);
}
返回ret;
}
帮助我!
您在图片中所做的不仅仅是翻转坐标。它翻转它们,然后任意重新定位它们
以下是要点:
//主模板形状
设shape=[{x:10,y:10},{x:30,y:10},{x:20,y:30}];
让canvas={};//画布
设ctx={};//画布的上下文
//初始元素
$(文档).ready(函数(){
canvas=document.getElementById(“myCanvas”);
ctx=canvas.getContext(“2d”);
drawShape();
});
//绘制模板
函数drawShape(){
//原形
ctx.save();
ctx.beginPath();
ctx.strokeStyle='绿色';
ctx.fillStyle='绿色';
对于(让点的形状){
ctx.lineTo(点x,点y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
ctx.restore();
//翻转形状
ctx.save();
让flippedShape=FlippedVertical(形状);
ctx.beginPath();
ctx.strokeStyle=‘红色’;
ctx.fillStyle='红色';
对于(让翻转形状的点){
ctx.lineTo(点x,点y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
ctx.restore();
}
功能翻转垂直(点){
设ret=[];
var min_x,min_y;
用于(点对点){
设flipped={x:canvas.width-point.x,y:canvas.width-point.y};
后推(翻转);
}
返回ret;
}
要找到中点,请执行以下操作:
let shape=[{x:10,y:10},{x:30,y:10},{x:20,y:30}];
函数getMinMax({min,max},shape){
如果(shape.ymax){max=shape.y;}
返回{min,max}
}
var initValues={min:Infinity,max:-Infinity};
var{min,max}=shape.reduce(getMinMax,initValues);
日志(“最小y:+min+”,最大y:+max)你试过像:y:40-point.y这样的东西吗?在您的示例中,y值10、10、30变为30、30、10。40将是中间点y值的两倍-在这种情况下,(30-10)*2@ATD好吧,这是一个很好的提示…但是我如何计算具有更多点的更复杂形状的中点呢?您需要在形状数组中循环,并找到y值的最高值和最低值。我假设翻转需要在这两者之间的中点附近,因此简单的(max-min)*2会给出中点。嗯,红色的trinagle会在canvase的右下角结束:(正确。如果你在图像的上角拍摄一个三角形并翻转它,就会发生这种情况。这就是翻转坐标,就像你问的那样。我的意思是我希望三角形本身围绕它自己的中心翻转:)让x=max+min;也会得到同样的结果