我正在努力将代表太阳能电池板的矩形放置在给定房屋的屋顶上。用户可以旋转矩形以使其与屋顶对齐。代码工作正常,直到添加相邻矩形而不旋转所选面板。但是,我在正确计算与旋转矩形相邻的新矩形的位置时面临问题。这是代码:
<!DOCTYPE html>
<html>
<head>
<title>Panel Positioner</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var solar_panel = {"width": 57, "height": 94}; // Default pixles on 5M zoom
var offset = 58;
var rads = 0;
var position = {};
var id = 1;
$('#add-panel').click(function() {
addPanel();
});
function addPanel() {
if (id === 1) {
canvas = new fabric.Canvas('c1');
canvas.on("after:render", function() {
canvas.calcOffset();
});
canvas.on('object:moving', function(e) {
var activeObject = e.target;
position.x = activeObject.get('left');
position.y = activeObject.get('top');
});
canvas.on('object:rotating', function(e) {
var activeObject = e.target;
var angle = activeObject.get('angle');
rads = (activeObject.get('angle') * Math.PI / 180.0);
});
}
var markerPt2 = position;
markerPt2.x += offset * Math.cos(-rads);
markerPt2.y -= offset * Math.sin(-rads);
rect = new fabric.Rect({
id: id,
left: markerPt2.x,
top: markerPt2.y,
fill: 'grey',
width: solar_panel.width,
height: solar_panel.height,
borderColor: 'black',
stroke: '#000',
lockScalingX: true,
lockScalingY: true,
hasRotatingPoint: true,
});
rect.set('angle', rads * 180.0 / Math.PI);
id++;
canvas.add(rect);
canvas.renderAll();
}
});
</script>
</head>
<body>
<canvas id="c1" width="800" height="600" style="z-index:1000; border: 2px solid black;" ></canvas>
<input type="button" id="add-panel" name="add-panel" value="Add Panel" />
</body>
</html>
最佳答案
好吧,经过一些工作后,我发现我自己的脚本出了什么问题。 其中涉及两件重要的事情:
当对象旋转时,只有弧度发生变化(而不是 x,y 位置)。因此,在旋转一个对象之后,我们只需计算它的弧度即可找出下一个相邻对象将放置的位置。所以,在我的代码中,我做错的是,在对象移动或旋转之后,我重新计算新对象的 x,y 坐标。因此,需要做的是一个 bool 标志来决定对象是否旋转。如果是,则不要重新计算新相邻对象的 x,y 位置。只需重新计算弧度(这已经在“object:rotating” block 中实现)。所以代码应该如下所示:
if(rotated == false) { markerPt2.x += offset * Math.cos(-rads); markerPt2.y -= offset * Math.sin(-rads); } else { rotated = false; }
另外另一个令我烦恼的事实是,当在 Fabric.js 中渲染或移动对象时,其 x,y 位置是周围矩形的左上角,但是当对象旋转时,Fabric .js 返回对象的中心点作为其 x,y 位置。因此,在这种情况下,当对象旋转时,Fabric.js 平移点会跳转到矩形的中心点。因此,在实现“object:rotating”时,仅应使用最后记录的(旋转之前)x,y。
关于javascript - Fabric.js 如何添加与旋转矩形相邻的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599873/