【问题标题】:Dynamically create a point array动态创建点数组
【发布时间】:2015-08-10 13:17:23
【问题描述】:

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

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

【问题讨论】:

  • 唯一的方法是将这两个数组连接在一起,但是如果你从一个点列表开始不是更好吗?你试过什么?
  • 到目前为止,除了搜索之外,我什么都做不了。我尝试应用的是首先分配点数组并在循环中动态收集分配的点数组中的 x 和 y 值。但是,到目前为止,我还不知道如何分配一个点数组。 (为什么是减号??)
  • 您在寻找Zip (LINQ) 吗? - 如(未经测试):xArray.Zip(yArray, (x, y) => (new Point(x,y))).ToArray()
  • 那么到目前为止,您研究了什么,什么没有奏效?展示您尝试过的内容,否决票是因为您没有展示任何研究/努力
  • 啊酷!因此,谷歌搜索问题并花费半天不同的编码组合不算作努力。下次我会在谷歌上搜索它以表明我确实付出了努力来解决我的问题。另一个问题是在搜索结果中不容易将数组指针和点数组分开;尽管数组指针有足够的问题和答案。

标签: c# point


【解决方案1】:

您可以创建List<Point>,它比数组更好。

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

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

【讨论】:

  • 这并不能真正回答问题。
  • 这实际上回答了这个问题。然而,Corak 提供的解决方案更详细,并且更好地讨论了这个问题。还是谢谢!
【解决方案2】:

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

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();

【讨论】:

    【解决方案3】:

    有几个问题需要回答。

    我不知道如何分配点数组。

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

    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]);
    }
    

    【讨论】:

    • 感谢您的详细回答和讨论。我确实有浮点数,我使用了以下循环:PointF[] pointArray = new PointF[500]; for(int i = 0; i &lt; 500; i++){ pointArray[i] = new PointF((float)yPoints[i], (float)xPoints[i]); } 但是,创建列表并将点添加到列表不适用于 Graphics.DrawCurve。我确实在 x 轴上有浮点值,实际上它与 Graphics.DrawCurve 配合得很好。到目前为止,我还没有尝试过 Linq 解决方案,当我比较解决方案的运行时间时,我将编辑此响应。
    • 啊,好吧,所以在我对PointF 的回答中更改每个Point,删除(int) 铸造并忘记我写的关于需要int 的内容^_^。我不太明白“创建列表并向列表添加点不适用于 Graphics.DrawCurve”是什么意思。您是否收到异常或编译错误? “不起作用”可能意味着任何事情。 -- 您是否缺少Graphics.DrawCurve 所需的任何其他参数?
    • 不幸的是,cmets 中只有 600 个字符,所以我无法详细写出。当我使用 'List pointArray = new List(); for(int i = 0; i ' 转换为 'System.Drawing.PointF[]'
    • 是的,这就是我所说的“然后,无论您实际需要传递一个数组,您都可以通过以下方式获取它:Point[] pointArray = pointList.ToArray();”——所以在您的情况下,您必须写:g.DrawCurve(pen, pointArray.ToArray(), 1F);
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2020-06-17
    • 2016-06-12
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多