用阵列模拟4个象限

时间:2014-03-15 20:16:27

标签: c# arrays list sorting data-structures

我正在使用C#创建一个应用程序,它构建对象并将它们移动到笛卡尔平面上的不同位置。我从位置(0,0)的第一个对象开始。我想我可以在2D数组中表示这个,但是我应该如何在位置(-x,y),( - x,-y,)或(x,-y)表示对象?

现在我正在考虑使用四个数组来表示不同的象限。如何更改数组索引的下限?那可能吗?如果不是我想我可以做一些算术来将-x或-y数字映射到每个数组的自然数,我希望有另一个解决方案。

我还想过将原点放在我的数组中间,但是数组在运行时增长,所以我不得不将内容转移到找到新的中间位置。这似乎更令人困惑。

我是否正确地解决了这个问题?有更简单的解决方案吗?

1 个答案:

答案 0 :(得分:4)

我认为你可能正在思考你所遇到的问题。根据您发布的内容,您需要知道:

  • 什么象限是笛卡尔平面上的给定点?

我想要一个像这样的解决方案:

enum CartesianQuadrant {
  None = 0, 
  I,
  II,
  III,
  IV,    
}

struct Point {
  public readonly double X;
  public readonly double Y;
  public readonly CartesianQuadrant Quadrant;

  public Point(double x, double y) {
      X = x; 
      Y = y; 
      Quadrant = x == 0 || y == 0 ? CartesianQuadrant.None :
                 x > 0 ? y > 0 ? CartesianQuadrant.I : CartesianQuadrant.IV :
                 y > 0 ? CartesianQuadrant.II : CartesianQuadrant.III;
  }
}

然后,当您初始化Point时,Point.Quadrant将拥有坐标所在的象限。然后您可以拥有Point[]IList<Point>,或者适合的任何一个集合您的需求。

使用示例:

  var p1 = new Point(3.0, 2.0); // p1.Quadrant == CartesianQuadrant.I
  var p2 = new Point(-3.0, 2.0); // p2.Quadrant == CartesianQuadrant.II
  var p3 = new Point(-3.0, -2.0); // p2.Quadrant == CartesianQuadrant.III
  var p4 = new Point(3.0, -2.0); // p2.Quadrant == CartesianQuadrant.IV
  var pnone1 = new Point(0.0, 2.0); // p2.Quadrant == CartesianQuadrant.None
  var pnone2 = new Point(2.0, 0.0); // p2.Quadrant == CartesianQuadrant.None
  var pnone3 = new Point(0.0, 2.0); // p2.Quadrant == CartesianQuadrant.None