我想使用graphics.DrawCurve
画一条曲线,我在不同的数组(float x[]
和float y[]
)中有x和y值。由于DrawCurve
需要点数组作为输入,我需要从浮点数组x和y转换或动态创建点数组。这有什么快捷的方法吗?
我有大约20000点用于绘制曲线,为此目的使用graphics.DrawCurve
是否是个好主意?
答案 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();