动态创建点阵列

时间:2015-05-28 07:15:23

标签: c# point

我想使用graphics.DrawCurve画一条曲线,我在不同的数组(float x[]float y[])中有x和y值。由于DrawCurve需要点数组作为输入,我需要从浮点数组x和y转换或动态创建点数组。这有什么快捷的方法吗?

我有大约20000点用于绘制曲线,为此目的使用graphics.DrawCurve是否是个好主意?

3 个答案:

答案 0 :(得分:5)

有几个问题需要回答。

  

我无法找到如何分配点数组。

嗯,分配点数组与其他任何类型的数组没有区别:

const int size = 100;
Point[] pointArray = new Point[size];

但阵列缺少一些“便利”。例如,它们具有您需要在初始化(分配)时指定的固定大小。如果您需要更多空间,则必须手动创建一个新的(更大的)数组并将所有值从旧的复制到新的。

这就是为什么几乎每个地方都可以使用数组,你可能最好使用一个列表:

List<Point> pointList = new List<Point>();

然后,无论您何时需要传递数组,都可以通过以下方式获取:

Point[] pointArray = pointList.ToArray();
  

动态收集分配的点数组中的x和y值

当您使用列表时,这很简单:

pointList.Add(new Point(x, y));

我们不知道您如何填充float x[]float y[]。如果可能的话,我首先没有这两个单独的数组,只需从头开始使用pointList。有一点需要注意:System.Drawing.Point仅适用于int值,而不适用于float值。所以我假设您打算收集坐标的int值。

  

从float数组x和y

动态创建点数组

如果你不能改变坐标的集合而来处理这些数组,你可以像这样将它们“压缩”在一起:

IEnumerable<Point> points = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord));

或者,如果你知道你需要一个数组:

Point[] pointArray = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord)).ToArray();

为此,您需要能够使用System.Linq(换句话说,高于.Net 2.0)。

如果你不能使用Linq,你必须“手动”。类似的东西:

int size = Math.Min(x.Length, y.Length);
Point[] pointArray = new Point[size];

for (int index = 0; index < size; index++)
{
  pointArray[index] = new Point((int)x[index], (int)y[index]);
}

答案 1 :(得分:2)

您可以创建比数组更好的List<Point>

List<Point> list = new List<Point>();
Point point=new Point(10,15);
list.Add(point);

您可以从两个数组中获取所有x和y坐标,并将其作为点放在列表中,然后使用此列表绘制曲线。

答案 2 :(得分:1)

假设两个数组中的值具有相同的索引,您可以迭代它们,创建点并将它们添加到列表中。

List<Point> points = new List<Point>();
for(int i = 0; i < x.Length; i++){
    points.Add(new Point(x[i],y[i]);
}

我在这里使用DrawCurve时没有看到特定问题。

如果您需要点数组,请使用points.ToArray();