C#创建对齐网格功能

Nat*_*han 13 c# runtime winforms

我正在尝试创建一些在运行时使用的对齐网格功能,但我遇到了捕捉部分的问题.我已成功在面板上绘制了一个虚线网格,但是当我向面板添加标签控件时,如何将标签的左上角捕捉到最近的点?

谢谢

Ped*_*ery 16

pos.x - pos.x % gridWidth 应该这样做.


num*_*ati 16

我不认为接受的答案是正确的.原因如下:

如果gridwidth = 3,x上的a点4应该映射到3但是x = 5应该映射到6.使用Pedery的答案它们都将映射到3.

为了得到正确的结果,你需要像这样舍入(如果点是分数,你可以使用float):

//让我们说.

int gridCubeWidth  = 3;
int gridCubeHeight = 3;

int newX = Math.Round(oldX / gridCubeWidth)  * gridCubeWidth;
int newY = Math.Round(oldY / gridCubeHeight) * gridCubeHeight;
Run Code Online (Sandbox Code Playgroud)


sil*_*oon 5

这个对我来说效果更好,因为它根据它与下一个或上一个网格点的接近程度来移动点:

            if (pt.X % gridWidth < gridWidth/2)
                pt.X = pt.X - pt.X % gridWidth;
            else
                pt.X = pt.X + (gridWidth - pt.X % gridWidth);

            if (pt.Y % gridHeight < gridHeight / 2)
                pt.Y = pt.Y - pt.Y % gridHeight;
            else
                pt.Y = pt.Y + (gridHeight - pt.Y % gridHeight);
Run Code Online (Sandbox Code Playgroud)