gpt4 book ai didi

c# - 实现对齐 Canvas 网格线

转载 作者:行者123 更新时间:2023-12-04 04:50:11 33 4
gpt4 key购买 nike

我对此有点困惑,但我有一个问题,就是试图让我的头脑围绕鼠标捕捉到网格。目前我正在通过覆盖 OnRender 来绘制网格像这样;

 protected override void OnRender(DrawingContext drawingContext)
{

int numberOfVerticalLines = 8;
int numberOfHorizontalLines = 8;

CellHeight = this.ActualHeight / numberOfVerticalLines;
CellWidth = this.ActualWidth / numberOfHorizontalLines;

double verticalOffset = 0;
double horizontalOffset = 0;

Pen pen = new Pen(Stroke, StrokeThickness);

pen.DashStyle = DashStyle;

for (int i = 0; i <= numberOfHorizontalLines; i++)
{
for (int j = 0; j <= numberOfVerticalLines; j++)
{

drawingContext.DrawLine(pen, new Point(horizontalOffset, verticalOffset), new Point(horizontalOffset, CellHeight + verticalOffset));

verticalOffset += CellHeight;
}

horizontalOffset += CellWidth;
verticalOffset = 0;
}

horizontalOffset = 0;
verticalOffset = 0;

for (int i = 0; i <= numberOfVerticalLines; i++)
{
for (int j = 0; j <= numberOfHorizontalLines; j++)
{
drawingContext.DrawLine(pen, new Point(horizontalOffset, verticalOffset), new Point(CellWidth + horizontalOffset, verticalOffset));

horizontalOffset += CellWidth;
}

verticalOffset += CellHeight;
horizontalOffset = 0;
}
}

这给出了以下结果;

grid example

但是,我在考虑将鼠标捕捉到最近的网格交叉点(水平线与垂直线交汇处)的路线时有点卡住了。显然,当我使用绘图上下文来绘制线条时,我在绘制这些线条后没有引用这些线条。

所以我想基本上我的问题是,我怎样才能实现鼠标捕捉到网格?这更像是一个数学问题而不是一个面向对象的控制问题吗?我已经通读了几乎所有我发现相关的堆栈溢出问题,但还没有得出任何现实的想法。

注意:虽然目前我已经硬编码了一个 8x8 网格,但这最终将由用户定义。

最佳答案

一种基本方法是通过以下方式将鼠标的 (x,y) 与十字架进行比较:
1.计算鼠标所在单元格的宽度和高度的起点和终点;和
2. 将这两个间隔(宽度和高度)与实际鼠标 (x,y) 进行比较以找到最近的单元格点。

下面是一些快速拼凑的示例代码来演示捕捉:

/// <summary>
/// When left shift key is pressed we snap the mouse to the closest
/// intersection
/// </summary>
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftShift)
{
var p = GetSnappingPoint(Mouse.GetPosition(this), new Size(200, 200));
SetCursorPos((int)p.X, (int)p.Y+20);
}

}

[DllImport("User32.dll")]
private static extern bool SetCursorPos(int x, int y);

/// <summary>
/// Get snapping point by
/// </summary>
Point GetSnappingPoint(Point mouse,Size cellSize)
{
//Get x interval based on cell width
var xInterval = GetInterval(mouse.X, cellSize.Width);

//Get y interal based in cell height
var yInterval = GetInterval(mouse.Y, cellSize.Height);

// return the point on cell grid closest to the mouseposition
return new Point()
{
X = Math.Abs(xInterval.Lower - mouse.X) > Math.Abs(xInterval.Upper - mouse.X) ? xInterval.Upper : xInterval.Lower,
Y = Math.Abs(yInterval.Lower - mouse.Y) > Math.Abs(yInterval.Upper - mouse.Y) ? yInterval.Upper : yInterval.Lower,
};
}

/// <summary>
/// Find an interval of the celsize based on mouse position and size
/// </summary>
Interval GetInterval(double mousePos,double size)
{
return new Interval()
{
Lower = ((int)(mousePos / size)) * size,
Upper = ((int)(mousePos / size)) * size + size
};
}

/// <summary>
/// Basic interval class
/// </summary>
class Interval
{
public double Lower { get; set; }
public double Upper { get; set; }
}

关于c# - 实现对齐 Canvas 网格线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573850/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com