C#矩形相交返回意外结果

时间:2019-03-10 14:00:12

标签: c#

构造函数文档指出

  

Rectangle(Int32,Int32,Int32,Int32)初始化的新实例   具有指定位置和大小的Rectangle类。

位置:

  

参数

     

x

     

Int32矩形左上角的x坐标。

     

y

     

Int32矩形左上角的y坐标。

     

宽度

     

Int32矩形的宽度。

     

高度

     

Int32矩形的高度。

请记住,这是我的几个测试矩形:

Rectangle1(25,43,11,9)

Rectangle2(35,45,9,1)

根据MS文档,x和y坐标都与

相关
  

左上角

,即:

矩形1 x坐标从25变到36,y从43变到34

Rectangles2 x坐标从35降低到44,y从45降低到44

这意味着它们不会重叠,因为Rectangle2底部(y = 44)比Rectangle1顶部(y = 43)高1个单位

事实上,它与以下简单测试冲突:

class Program
{
    static void Main(string[] args)
    {
        Rectangle r1 = new Rectangle(25,43,11,9);
        Rectangle r2 = new Rectangle(35, 45, 9, 1);

        Rectangle r3 = new Rectangle();
        r3 =  Rectangle.Intersect(r1, r2);

        if (!r3.IsEmpty)
        {
            Console.WriteLine("X = "+ r3.X);
            Console.WriteLine("Y = " + r3.Y);
            Console.WriteLine("Width = " + r3.Width);
            Console.WriteLine("Height = " + r3.Height);
        }
        else
            Console.WriteLine("r1 and r2 do not intersect");
        Console.ReadLine();
    }
}

Console output

我现在很困惑,因为测试矩形结果在一个单元的坐标35,45处重叠。我无法解释。

2 个答案:

答案 0 :(得分:2)

似乎您在弄错y轴。 R1从25、43到35、51,R2从35、45到43、45。我的值现在是INCLUSIVE界,因此它是x +宽度-1和y +高度-1。因此,相交正好像素为35、45,大小为1x1像素。因此计算正确。

答案 1 :(得分:0)

Windows Coordinate System中:

  

x坐标向右增加; y坐标从   从上到下。

其次:

  

对于屏幕坐标,原点是屏幕坐标的左上角   屏幕。

因此,屏幕的左上角为(0,0),并且您从顶部到底部 DOWN 时Y值 INCREASE

基本上,Y轴已从您惯用的标准数学类绘图中翻转出来。

在这里,我不仅使用Left和Top来显示坐标,还使用RightBottom属性来显示坐标:

Console.WriteLine(String.Format("r1: ({0}, {1}) --> ({2}, {3})", r1.Left.ToString(), r1.Top.ToString(), r1.Right.ToString(), r1.Bottom.ToString()));
Console.WriteLine(String.Format("r2: ({0}, {1}) --> ({2}, {3})", r2.Left.ToString(), r2.Top.ToString(), r2.Right.ToString(), r2.Bottom.ToString()));

这将产生以下输出:

r1: (25, 43) --> (36, 52)
r2: (35, 45) --> (44, 46)

希望能帮助您了解正在发生的事情。