我想使用graphics.DrawCurve
绘制一条曲线,并且在单独的数组(float x[]
和float y[]
)中有x和y值。由于DrawCurve
需要将点数组作为输入,因此我需要从浮点数组x和y转换或动态创建点数组。有什么快速的方法吗?
我有大约20000点用于绘制曲线,为此目的使用graphics.DrawCurve
是个好主意吗?
最佳答案
有几个问题要回答。
我找不到如何分配点数组。
好吧,分配点数组与分配任何其他类型的数组没有什么不同:
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
值。从浮点数组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]);
}
关于c# - 动态创建点数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30499654/