C# 动态创建点阵列

C# 动态创建点阵列,c#,point,C#,Point,我想使用graphics.DrawCurve绘制一条曲线,我在单独的数组中有x和y值float x[]和float y[]。由于DrawCurve需要点数组作为输入,因此我需要从浮点数组x和y转换或动态创建点数组。有什么捷径吗 我有大约20000个点用于绘制曲线,使用graphics.DrawCurve是否是一个好主意?您可以创建比数组更好的列表 List<Point> list = new List<Point>(); Point point=new Point(10,

我想使用graphics.DrawCurve绘制一条曲线,我在单独的数组中有x和y值float x[]和float y[]。由于DrawCurve需要点数组作为输入,因此我需要从浮点数组x和y转换或动态创建点数组。有什么捷径吗

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

您可以创建比数组更好的列表

List<Point> list = new List<Point>();
Point point=new Point(10,15);
list.Add(point);
您可以从两个数组中获取所有x和y坐标,并将它们作为点放在列表中,然后使用此列表绘制曲线。

您可以创建优于数组的列表

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

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

如果两个数组中的值具有相同的索引,您可以在其上创建点并将其添加到列表中

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

如果两个数组中的值具有相同的索引,您可以在其上创建索引,创建点并将其添加到列表中

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

有几个问题需要回答

我找不到如何分配点阵列

分配点阵列与分配其他类型的阵列没有区别:

const int size = 100;
Point[] pointArray = new Point[size];
但是数组缺少一些便利性。例如,它们有一个固定的大小,您需要在初始化分配时指定该大小。如果需要更多空间,则必须手动创建一个新的更大的数组,并将所有值从旧数组复制到新数组

这就是为什么几乎所有使用阵列的地方,最好使用列表:

List<Point> pointList = new List<Point>();
在分配的点阵列中动态收集x和y值

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

pointList.Add(new Point(x, y));
我们不知道您如何填充您的浮动x[]和浮动y[]。如果可能的话,我不会首先使用这两个单独的数组,而只是从一开始就使用pointList。有一点需要注意:a仅适用于int值,而不适用于float值。我假设你想收集坐标的int值

从浮动阵列x和y动态创建点阵列

如果无法更改坐标集合并且必须使用这些数组,则可以将它们压缩在一起,如下所示:

IEnumerable<Point> points = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord));
为此,您需要能够使用System.Linq,换句话说,高于.NET2.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]);
}

有几个问题需要回答

我找不到如何分配点阵列

分配点阵列与分配其他类型的阵列没有区别:

const int size = 100;
Point[] pointArray = new Point[size];
但是数组缺少一些便利性。例如,它们有一个固定的大小,您需要在初始化分配时指定该大小。如果需要更多空间,则必须手动创建一个新的更大的数组,并将所有值从旧数组复制到新数组

这就是为什么几乎所有使用阵列的地方,最好使用列表:

List<Point> pointList = new List<Point>();
在分配的点阵列中动态收集x和y值

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

pointList.Add(new Point(x, y));
我们不知道您如何填充您的浮动x[]和浮动y[]。如果可能的话,我不会首先使用这两个单独的数组,而只是从一开始就使用pointList。有一点需要注意:a仅适用于int值,而不适用于float值。我假设你想收集坐标的int值

从浮动阵列x和y动态创建点阵列

如果无法更改坐标集合并且必须使用这些数组,则可以将它们压缩在一起,如下所示:

IEnumerable<Point> points = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord));
为此,您需要能够使用System.Linq,换句话说,高于.NET2.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]);
}

唯一的方法是将两个阵列连接在一起,但是如果从一系列点开始,您会不会感觉更好?你试过什么?到目前为止,除了搜索,我什么都没试过。我尝试应用的是首先分配点阵列,并在循环中动态收集分配的点阵列中的x和y值。但是,到目前为止,我还不知道如何分配点阵列。为什么投反对票?你在找林克吗如未经测试的:xArray.ZipyArray,x,y=>newpointx,y.ToArrayWell到目前为止,您研究了哪些方面,哪些方面不起作用?展示你已经尝试过的,否决票是因为你没有表现出任何研究/努力太酷了!因此,谷歌搜索问题和花半天时间使用不同的编码组合并不算是一种努力。下一次,我会站在那里用谷歌搜索,以显示我真的花了很多钱

我想解决我的问题。另一个问题是在搜索结果中不容易分离数组指针和点数组;虽然数组指针有足够的问题和答案。唯一的方法是将两个数组连接在一起,但是如果从一个点列表开始,你不是会更好吗?你试过什么?到目前为止,除了搜索,我什么都没试过。我尝试应用的是首先分配点阵列,并在循环中动态收集分配的点阵列中的x和y值。但是,到目前为止,我还不知道如何分配点阵列。为什么投反对票?你在找林克吗如未经测试的:xArray.ZipyArray,x,y=>newpointx,y.ToArrayWell到目前为止,您研究了哪些方面,哪些方面不起作用?展示你已经尝试过的,否决票是因为你没有表现出任何研究/努力太酷了!因此,谷歌搜索问题和花半天时间使用不同的编码组合并不算是一种努力。下一次,我会站在那里用谷歌搜索,以显示我真的花了很多精力来解决我的问题。另一个问题是在搜索结果中不容易分离数组指针和点数组;虽然数组指针有足够的问题和答案。这并不能真正回答问题。这实际上回答了问题。然而,Corak提供的解决方案更为详细,可以更好地讨论这个问题。无论如何谢谢你!这并不能真正回答问题,这实际上回答了问题。然而,Corak提供的解决方案更为详细,可以更好地讨论这个问题。无论如何谢谢你!感谢您的详细回答和讨论。我确实有浮点数,并使用了以下循环:PointF[]pointArray=new PointF[500];forint i=0;i<500;i++{pointArray[i]=新的PointFfloatyPoints[i],floatxPoints[i];}但是创建列表并向列表中添加点不适用于Graphics.DrawCurve。我确实在x轴上有浮点值,实际上它与Graphics.DrawCurve配合得很好。到目前为止,我还没有尝试过Linq解决方案,我将在比较解决方案的运行时时编辑此响应。啊,好的,所以将我答案中的每一点都更改为PointF,删除int casting,忘记我写的关于需要int^^的内容。我不太明白你所说的创建列表并向列表中添加点的意思,它不适用于Graphics.DrawCurve。您是否遇到异常或编译错误?不工作可能意味着什么您是否遗漏了所需的任何其他参数?不幸的是,注释中可能只有600个字符,因此我无法详细编写。当我使用'List pointArray=新列表;forint i=0;i<500;i++{pointArray.addnewpointffoatypoints[i],floatxPoints[i];}g.DrawCurvepen,pointArray,1F;'我得到了以下错误错误4参数2:无法从“System.Collections.Generic.List”转换为“System.Drawing.PointF[]”是的,这就是我的意思,然后,无论您实际需要在哪里传递数组,您都可以通过以下方式获得它:Point[]pointArray=pointList.ToArray;-因此,在您的例子中,您必须编写:g.DrawCurvepen,pointArray.ToArray,1F;感谢您的详细回答和讨论。我确实有浮点数,并使用了以下循环:PointF[]pointArray=new PointF[500];forint i=0;i<500;i++{pointArray[i]=新的PointFfloatyPoints[i],floatxPoints[i];}但是创建列表并向列表中添加点不适用于Graphics.DrawCurve。我确实在x轴上有浮点值,实际上它与Graphics.DrawCurve配合得很好。到目前为止,我还没有尝试过Linq解决方案,我将在比较解决方案的运行时时编辑此响应。啊,好的,所以将我答案中的每一点都更改为PointF,删除int casting,忘记我写的关于需要int^^的内容。我不太明白你所说的创建列表并向列表中添加点的意思,它不适用于Graphics.DrawCurve。您是否遇到异常或编译错误?不工作可能意味着什么您是否遗漏了所需的任何其他参数?不幸的是,注释中可能只有600个字符,因此我无法详细编写。当我使用'List pointArray=新列表;forint i=0;i<500;i++{pointArray.addnewpointffoatypoints[i],floatxPoints[i];}g.DrawCurvepen,pointArray,1F;'我得到了以下错误错误4参数2:无法从“System.Collections.Generic.List”转换为“System.Drawing.PointF[]”是的,这就是我的意思,然后,无论您实际需要在哪里传递数组,您都可以通过以下方式获得它:Point[]pointArray=pointList.ToArray;-因此,在您的例子中,您必须编写:g.DrawCurvepen,pointArray.ToArray,1F;