找到一个矩形相对于其他

时间:2017-03-12 11:28:58

标签: c# geometry coordinates rectangles

问题 我怎样才能找到一个矩形的方向w.r.t到另一个。我感兴趣的方向是向上,向下,向左和向右。我的矩形由Cell类表示。我正在尝试在该单元类中编写一个函数。函数接受Cell类型的参数,将传递的单元格w.r.t的1(向上)2(向下)3(左)或4(向右)方向返回到调用单元格。

我尝试了什么 我找到了两个矩形的中点,然后比较了x和y坐标。但是这种技术并不适用于所有情况。每当我找到一个丢失的案例时,我必须包含越来越多的if语句,我认为这不是一个好的编程习惯。它变得越来越容易出错并且难以理解。

在搜索解决方案时:也许math.atan2()可以在我的情况下工作。也许我可以找到这两个矩形的中点之间的角度,并使用角度值来确定方向。但我不确定我的想法是否正确。

请指导我。我应该继续使用我的功能并纠正它,还是有更好的解决方案,例如math.atan2()?下面将在代码之后演示一个帮助图像以便更好地理解和所需的解决方案。

代码

public int dirOfThisCell(Cell cell)
    {
        int dir = 0;

        //find mid points of both cells
        PointF midPointThis = this.computeAndGetMidPoint();
        PointF midPointCell = cell.computeAndGetMidPoint();
        //MessageBox.Show(mess);
        //if x of both points is same or with little variance because of variance in sizes of cells
        ===>>  //Comparison Starts!!
        if (midPointThis.X > midPointCell.X)
        {
            //this cell is to the right.
            if ((midPointCell.Y) == (midPointThis.Y))
            {
                 dir = 3;
            }
            else if (Math.Abs(midPointCell.Y) - Math.Abs(midPointThis.Y) < 5) { dir = 3; }
            else if (Math.Abs(midPointCell.Y) - Math.Abs(midPointThis.Y) > 5) {
                if (midPointThis.Y > midPointCell.Y) { dir = 1; }
                else if (midPointThis.Y < midPointCell.Y) dir = 2;
            }
                // a considerable difference

            else { dir = 3; }

                //some small variations in y
            //else if(Math.Abs()
        }

        else if (midPointThis.X < midPointCell.X)
        {
             // this cell is to the left
            if ((midPointCell.Y) == (midPointThis.Y))
            {
                dir = 4;
            }
            else if (Math.Abs(midPointCell.Y) - Math.Abs(midPointThis.Y) <= 10)
            {
                dir = 4;
            }
        }

        //if this cell is below 
        else if (midPointThis.Y > midPointCell.Y)
        {
            //this cell is down than the cell
            if ((midPointCell.X) == (midPointThis.X))
            {
                dir = 1;
            }
            //else if (Math.Abs(midPointCell.X) - Math.Abs(midPointThis.X) < 2) { dir = 1; }
        }

        else if (midPointThis.Y < midPointCell.Y)
        {
            if ((midPointCell.X) == (midPointThis.X))
            {
                dir = 2;
            }
        }
        return dir;
    }

图片

Sample Image

样本矩形如图所示。矩形可以是单个单元格,也可以通过组合多个编号单元格来制作。

需要样本解决方案

  1. 细胞18 w.r.t到8的方向应该是向上(1)
  2. 细胞18 w.r.t到10的方向应该是向上(1)
  3. 细胞14 w.r.t到13的方向应该是正确的(4)
  4. 细胞9 w.r.t到31的方向应该是向下(1)
  5. 细胞15 w.r.t到9的方向应该留下(3)
  6. 我在c#工作。

    非常感谢任何帮助。

    谢谢

1 个答案:

答案 0 :(得分:0)

计算矩形中心与另一个中心相比的角度似乎不是一个好主意,因为这些矩形的中心只是告诉你它们的中心在哪里,解决方案完全不愿意两侧的宽度,高度和方向。我知道第三个问题在你的具体情况下并不是一个问题,因为你可以放心地假设边是水平的XOR垂直,但总的来说,这也可能是一个问题。要计算Shape1(在我们的特定情况下是矩形)与Shape2相比的相对位置,您需要计算两者的最小和最大x和y。

Shape1位于Shape2&lt; =&gt;的左侧Shape1.maxX&lt; = Shape2.minX

Shape1位于Shape2&lt; =&gt;的右侧Shape2.minX&gt; = Shape2.maxX

Shape1高于Shape2&lt; =&gt; Shape1.maxY&lt; = Shape2.minY

Shape2低于Shape2&lt; =&gt; Shape2.minY&gt; = Shape1.maxY