C# 将绘制的矩形相互捕捉

C# 将绘制的矩形相互捕捉,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我有一个WPF应用程序,其中我在画布中绘制矩形。我需要添加一个功能,当我绘制矩形时,如果旁边有一个矩形(例如:假设第一个矩形x坐标为236,第二个矩形坐标为235),我需要将第二个矩形x坐标捕捉到236,如图所示。 仅当距离差为10时,才会进行捕捉 为此,我编写了以下代码 private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) {

我有一个WPF应用程序,其中我在画布中绘制矩形。我需要添加一个功能,当我绘制矩形时,如果旁边有一个矩形(例如:假设第一个矩形x坐标为236,第二个矩形坐标为235),我需要将第二个矩形x坐标捕捉到236,如图所示。 仅当距离差为10时,才会进行捕捉

为此,我编写了以下代码

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
        {                        
          startPos = e.GetPosition(Canvas);
           System.Windows.Point curPosition = e.GetPosition(SectionCanvas);
           rect = new System.Windows.Shapes.Rectangle
           {
               Stroke = brushColor,
               StrokeDashArray = new DoubleCollection { 2, 2 },
               Tag = "rectangle"
           };     
        Canvas.SetLeft(rect, startPos.X);
                Canvas.SetTop(rect, startPos.X);
                SectionCanvas.Children.Add(rect);
         }

 private void Canvas_MouseMove(object sender, MouseEventArgs e)
        {

                currentPos = e.GetPosition(SectionCanvas);

                var x = Math.Min(currentPos.X, startPos.X);
                var y = Math.Min(currentPos.Y, startPos.Y);

                var w = Math.Max(currentPos.X, startPos.X) - x;
                var h = Math.Max(currentPos.Y, startPos.Y) - y;

                rect.Width = w;
                rect.Height = h;

                Canvas.SetLeft(rect, x);
                Canvas.SetTop(rect, y);

        }

   private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
        {                                   
              if(rect == null)
              {
                  MessageBox.Show("Could not capture section, Please try again");
                  return;
              }
              endPos = e.GetPosition(SectionCanvas);
              IEnumerable<Rect> coordinates = rectCollection.Select(r => new Rect(Canvas.GetLeft(r), Canvas.GetTop(r), r.Width, r.Height));
              Rect newCordinates = new Rect(Canvas.GetLeft(rect), Canvas.GetTop(rect), rect.Width, rect.Height);                   
              if (coordinates.Any(c => c.IntersectsWith(newCordinates)))))
              {
                  MessageBox.Show("New Rectangle intersects with existing rectangle");
                  Canvas.Children.Remove(rect);
                  return;
              }
              rectCollection.Add(rect);
              rect = null;    

              foreach(Point p in tempCollection)
                    {
                        if((startPos.X <= (p.X + 10) && startPos.X >= (p.X -10)))
                        {
                            startPos.X = p.X;
                        }
                        if(endPos.X <= (p.X + 10) && endPos.X >= (p.X - 10))
                        {
                            var x1 = Math.Max(endPos.X,p.X) - Math.Min(endPos.X, p.X);
                            var w1 = startPos.X - x1;
                            endPos.X = p.X;
                            startPos.X = w1;
                        }
                        if ((startPos.Y <= (p.Y + 10) && startPos.Y >= (p.Y - 10)))
                        {
                            startPos.Y = p.Y;
                        }

                        if (endPos.Y <= (p.Y + 10) && endPos.Y >= (p.Y - 10))
                        {
                            var x1 = Math.Max(endPos.Y, p.Y) - Math.Min(endPos.Y, p.Y);
                            var w1 = startPos.Y - x1;
                            endPos.Y = p.Y;
                        }
                    }
                    var x = Math.Min(currentPos.X, startPos.X);
                    var y = Math.Min(currentPos.Y, startPos.Y);

                    var w = Math.Max(currentPos.X, startPos.X) - x;
                    var h = Math.Max(currentPos.Y, startPos.Y) - y;

                    rect.Width = w;
                    rect.Height = h;

                    rect.Stroke = Brushes.Coral;

                    Canvas.SetLeft(rect, x);
                    Canvas.SetTop(rect, y);
                    rect = null;
                    tempCollection.Add(startPos);
                    tempCollection.Add(endPos);
            }
private void Canvas\u MouseDown(对象发送器,MouseButtonEventArgs e)
{                        
startPos=e.GetPosition(画布);
System.Windows.Point curPosition=e.GetPosition(SectionCanvas);
rect=new System.Windows.Shapes.Rectangle
{
笔划=画笔颜色,
StrokeDashArray=新的DoubleCollection{2,2},
Tag=“矩形”
};     
SetLeft(rect,startPos.X);
SetTop(rect,startPos.X);
SectionCanvas.Children.Add(rect);
}
私有void Canvas_MouseMove(对象发送方,MouseEventArgs e)
{
currentPos=e.GetPosition(截面画布);
var x=数学最小值(currentPos.x,startPos.x);
变量y=数学最小值(当前位置y,起始位置y);
var w=数学最大值(当前位置X,起始位置X)-X;
var h=数学最大值(当前位置Y,起始位置Y)-Y;
矩形宽度=w;
直线高度=h;
Canvas.SetLeft(rect,x);
Canvas.SetTop(rect,y);
}
私有void Canvas_MouseUp(对象发送器,MouseButtonEventArgs e)
{                                   
if(rect==null)
{
Show(“无法捕获节,请重试”);
返回;
}
endPos=e.GetPosition(截面画布);
IEnumerable coordinates=rectCollection.Select(r=>newrect(Canvas.GetLeft(r)、Canvas.GetTop(r)、r.Width、r.Height));
Rect newCordinates=new Rect(Canvas.GetLeft(Rect)、Canvas.GetTop(Rect)、Rect.Width、Rect.Height);
if(坐标.Any(c=>c.IntersectsWith(newCordinatesщщ)'))
{
Show(“新矩形与现有矩形相交”);
Canvas.Children.Remove(rect);
返回;
}
rectCollection.Add(rect);
rect=null;
foreach(tempCollection中的点p)
{
如果((startPos.X=(p.X-10)))
{
startPos.X=p.X;
}
如果(endPos.X=(p.X-10))
{
var x1=数学最大值(endPos.X,p.X)-数学最小值(endPos.X,p.X);
var w1=startPos.X-x1;
endPos.X=p.X;
startPos.X=w1;
}
如果((startPos.Y=(p.Y-10)))
{
startPos.Y=p.Y;
}
如果(结束位置Y=(p.Y-10))
{
var x1=数学最大值(endPos.Y,p.Y)-数学最小值(endPos.Y,p.Y);
var w1=startPos.Y-x1;
endPos.Y=p.Y;
}
}
var x=数学最小值(currentPos.x,startPos.x);
变量y=数学最小值(当前位置y,起始位置y);
var w=数学最大值(当前位置X,起始位置X)-X;
var h=数学最大值(当前位置Y,起始位置Y)-Y;
矩形宽度=w;
直线高度=h;
笔划=画笔。珊瑚;
Canvas.SetLeft(rect,x);
Canvas.SetTop(rect,y);
rect=null;
tempCollection.Add(startPos);
tempCollection.Add(endPos);
}

当我更改端点值时,上面的代码不起作用。在调试过程中,我可以看到端点值发生了变化,但绘制的矩形没有变化。我无法找出我做错了什么。

我找到了答案,从我那一刻起,这是一个愚蠢的错误

在计算捕捉后的宽度和高度时,我使用的是currentPos,而应该使用endPos

 var x = Math.Min(endPos.X, startPos.X);
 var y = Math.Min(endPos.Y, startPos.Y);

 var w = Math.Max(endPos.X, startPos.X) - x;
 var h = Math.Max(endPos.Y, startPos.Y) - y;

我发誓我昨天在这里看到了一个像这样的问题。这是微软的面试问题还是什么?@McGarnagle:你看到这样的问题没问题。这个问题得到回答了吗??如果是,链接在哪里?为什么这个问题被否决??如果这是一个已经存在的问题,则粘贴链接。答案将对OP和其他人有用。在没有证据的情况下不要否决投票。