代码之家  ›  专栏  ›  技术社区  ›  Chris

如何获取重叠的矩形坐标

c#
  •  7
  • Chris  · 技术社区  · 14 年前

    假设我有以下重叠的矩形(“A”和“B”):

    aaaaaaaa
    aaaaccccbbbbb
    aaaaccccbbbbb
    aaaaccccbbbbb
        bbbbbbbbb
        bbbbbbbbb
    

    我看过很多关于如何计算 地区 关于内矩形(“C”),但是如何获得它的实际上/左/下/右坐标呢?

    5 回复  |  直到 7 年前
        1
  •  13
  •   Tim Robinson    14 年前
        2
  •  9
  •   stakx - no longer contributing Saravana Kumar    14 年前

    两个矩形的重叠区域的X坐标可以根据以下逻辑找到。

    要找到y坐标,在四个假设中的最后一个,以及在这三个情况中,用y代替x。


    假设:

    • 是矩形(其边沿x和y轴对齐),

    • 每个矩形由两个点定义。( X / Y ) X 最大值 / Y 最大值 )

    • 在哪里? X &; X 最大值 Y &; Y 最大值 .

    • A.X &; B.X


    案例1-无重叠:

    +--------+
    |A       |    
    |        |    +----+
    |        |    |B   |
    |        |    +----+
    |        |
    +--------+
    

    A.X &; A.X 最大值 &; B.X &; B.X 最大值 无重叠。


    案例2-部分重叠:

    +--------+
    |A       |
    |     +--+-+
    |     |B | |
    |     +--+-+
    |        |
    +--------+
    

    A.X &; B.X &; A.X 最大值 &; B.X 最大值 重叠X坐标: B.X - A.X 最大值


    案例3-完全重叠:

    +--------+
    |A       |
    | +----+ |
    | |B   | |
    | +----+ |
    |        |
    +--------+
    

    A.X &; B.X &; B.X 最大值 &; A.X 最大值 重叠X坐标: B.X - B.X 最大值


    附笔。: 实际上,您可以进一步简化这个算法。重叠X坐标始终是:

    最大值(max) A.X , B.X -min( A.X 最大值 , B.X 最大值 )

    除非第二个值小于第一个值;这意味着没有重叠。

        3
  •  4
  •   ChrisW    14 年前
    static internal Rectangle intersect(Rectangle lhs, Rectangle rhs)
    {
        Dimension lhsLeft = lhs.Location.X;
        Dimension rhsLeft = rhs.Location.X;
        Dimension lhsTop = lhs.Location.Y;
        Dimension rhsTop = rhs.Location.Y;
        Dimension lhsRight = lhs.Right;
        Dimension rhsRight = rhs.Right;
        Dimension lhsBottom = lhs.Bottom;
        Dimension rhsBottom = rhs.Bottom;
    
        Dimension left = Dimension.max(lhsLeft, rhsLeft);
        Dimension top = Dimension.max(lhsTop, rhsTop);
        Dimension right = Dimension.min(lhsRight, rhsRight);
        Dimension bottom = Dimension.min(lhsBottom, rhsBottom);
        Point location = new Point(left, top);
        Dimension width = (right > left) ? (right - left) : new Dimension(0);
        Dimension height = (bottom > top) ? (bottom - top) : new Dimension(0);
    
        return new Rectangle(location, new Size(width, height));
    }
    
        4
  •  1
  •   user319785    14 年前

    假设:

    Points of   rectangle R1: R1.A(x,y), R1.B(x,y), R1.C(x,y), R1.D(x,y)   
    Points of   rectangle R2: R2.A(x,y), R2.B(x,y), R2.C(x,y), R2.D(x,y)   
    Overlapping rectangle RO: RO.A(x,y), RO.B(x,y), RO.C(x,y), RO.D(x,y)    
    Standard cartesian coordinates (positive is right and upwards).
    

    重叠矩形ro用c_计算如下:

    RO.A.x = Math.Min(R1.A.x, R2.A.x);
    RO.A.y = Math.Max(R1.A.y, R2.A.y);
    RO.C.x = Math.Max(R1.C.x, R2.C.x);
    RO.C.y = Math.Min(R1.C.y, R2.C.y);
    RO.B(x,y) and RO.D(x,y) = ....
    

    内矩形ri:

    将上面解决方案中的最小值和最大值替换为重叠矩形ro。

        5
  •  0
  •   Monolithcode    7 年前

    我为我的项目使用了一个抽象验证器,并检查是否有一些布局控件在其中重叠,我在布局图中创建了矩形:

    RuleFor(p => DoControlsIntersect(p.PageControls.Select(x => new Rectangle(x.Row, x.Column, x.Width, x.Height)).ToList())).Equal(false).WithMessage(OverlappingFields);
    
    private bool DoControlsIntersect(List<Rectangle> rectangles)
            {
                return rectangles.Any(rect => rectangles.Where(r => !r.Equals(rect)).Any(r => r.IntersectsWith(rect)));
            }