用数组模拟4个象限

本文关键字:4个 模拟 数组 | 更新日期: 2023-09-27 17:50:22

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

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

我也想过把原点放在数组的中间,但是数组在运行时增长,所以我必须不断地移动内容来找到新的中间。这似乎更令人困惑。

我这样做对吗?有没有更简单的解决办法?

用数组模拟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