如何旋转(x,y)进行网格捕捉

时间:2018-09-22 14:34:07

标签: c# wpf math geometry 2d

我已经基于一种流行的方法对普通正方形网格进行了网格捕捉

int newX = Math.Round(oldX / gridCubeWidth)  * gridCubeWidth;
int newY = Math.Round(oldY / gridCubeHeight) * gridCubeHeight;

我不直观的是,这不适用于我的对角网格。

enter image description here

我突出显示了一个红色矩形,该矩形表示我的对象在移动时将采取的模式,而紫色圆圈无法触及。 我需要将计算旋转45度,使其与下面的示例匹配,从而使我可以捕捉与对角线网格正确对齐的对象。

2 个答案:

答案 0 :(得分:1)

您可以从不同的角度看对角网格。它是2个常规栅格的叠加,偏移量为栅格大小的一半,如下图所示为蓝色和绿色栅格(绿色垂直线与左右边界匹配)。

enter image description here

所以我建议在两个网格中找到捕捉点,并选择最接近的一个。

const int SubgridWidth = 40, SubgridHeight = 28;

double newX1 = Snap(oldX, SubgridWidth);
double newY1 = Snap(oldY, SubgridHeight);

double newX2 = SnapShifted(oldX, SubgridWidth);
double newY2 = SnapShifted(oldY, SubgridHeight);

double squareDist1 = SquareDist(oldX, oldY, newX1, newY1);
double squareDist2 = SquareDist(oldX, oldY, newX2, newY2);

if (squareDist1 < squareDist2) {
    // Snap to (newX1, newY1).
} else {
    // Snap to (newX2, newY2).
}

double Snap(double x, double gridSize)
{
    return Math.Round(x / gridSize) * gridSize;
}

double SnapShifted(double x, double gridSize)
{
    return (Math.Round(x / gridSize - 0.5) + 0.5) * gridSize;
}

double SquareDist(double x1, double y1, double x2, double y2)
{
    double dx = x2 - x1;
    double dy = y2 - y1;
    return dx * dx + dy * dy;
}

答案 1 :(得分:0)

您的图片似乎没有45度角。

但是对于任何角度来说,使用垂直和水平方向上的网格节点之间的间距来进行计算都是简单的。首先,将坐标向下舍入到左下角,然后将其移至单元格的中心。

 int newX = (Math.Floor(oldX / HorizontalSpacing) + 0.5) * HorizontalSpacing;
 int newY = (Math.Floor(oldY / VerticalSpacing)  + 0.5) * VerticalSpacing;