如何为方法分配两个PointF点?

时间:2013-12-30 14:00:06

标签: c# winforms

这是ja72的方法:

public static List<PointF> DistributePoints(PointF pt1, PointF pt4, int number_of_points)
        {
            List<PointF> result = new List<PointF>();
            float x_min = Math.Min(pt1.X, pt4.X), x_max = Math.Max(pt1.X, pt4.X);
            float y_min = Math.Min(pt1.Y, pt4.Y), y_max = Math.Max(pt1.Y, pt4.Y);
            if (number_of_points < 2) throw new ArgumentException("Need Two Points At Least");
            for (int i = 0; i < number_of_points; i++)
            {
                float scale = (float)i / (number_of_points - 1);
                float x = x_min + (x_max - x_min) * scale, y = y_min + (y_max - y_min) * scale;
                result.Add(new PointF(x, y));
            }
            return result;
        }

这就是我如何使用它:

for (int i = 0; i < clouds.Count - 1; i += 2)
            {
                extendedPoints = DistributePoints(new PointF(clouds[i].X, clouds[i].Y), new PointF(clouds[i + 1].X, clouds[i + 1].Y), 20);
            }
            clouds = extendedPoints;
            return clouds;

云是PointF列表 此外,extendedPoints是PointF List。

现在在云中,我有37个索引(点)。

例如,假设在索引0中的云中我有:x = 150 y = 200 索引1:x = 160 y = 250 所以我使用你的ja72方法,现在extendedPoints包含20点:

extendedPoints的格式应如下所示:

index 0 : x = 150 y = 200
index 1 : x = 152 y = 210
index 2 : x = 155 y = 220
.
.
.
.
.
index 21 : x = 160 y = 250

现在这是一个迭代。 下一个应该从原始List索引2和索引3的云中取出并将它们发送到您的方法并返回另外20个点。

现在extendedPoints应该如下所示:

index 0 : x = 150 y = 200
index 1 : x = 152 y = 210
index 2 : x = 155 y = 220
.
.
.
.
.
index 21 : x = 160 y = 250
index 22 : x = 165 y = 255 ( this index 21 is the original index 2 of clouds )
index 23 : x = 166 y = 260
.
.
.
.
.
index 42 : x = 200 y = 300 ( this is the index 42 should be the original index 3 of clouds )

换句话说,我需要保持云的所有点坐标与它们在原始云列表中的顺序相同,并在每两点之间添加新的20点。

最后,云应该以它们之前的相同顺序包含所有原始点,但在每两个点之间添加新的20个点。

问题是你的方法只在云上迭代一次不是37次。 最后,每次点数混合时,应加入pt1和pt4,因为它们的顺序相同。

2 个答案:

答案 0 :(得分:2)

代码有一个微妙的错误。端点的处理方式与内部点(通过Min()Max()过程)不同。使用double作为循环计数器也不是一个好主意。请将以下代码视为代码的更简洁版本:

public static List<PointF> DistributePoints(PointF pt1, PointF pt4, int number_of_points)
{
    List<PointF> result=new List<PointF>();
    float x_min=Math.Min(pt1.X, pt4.X), x_max=Math.Max(pt1.X, pt4.X);
    float y_min=Math.Min(pt1.Y, pt4.Y), y_max=Math.Max(pt1.Y, pt4.Y);
    if(number_of_points<2) throw new ArgumentException("Need Two Points At Least");
    for(int i=0; i<number_of_points; i++)
    {
        float scale=(float)i/(number_of_points-1);
        float x=x_min+(x_max-x_min)*scale, y=y_min+(y_max-y_min)*scale;
        result.Add(new PointF(x, y));
    }
    return result;
}

您使用的是:

{
    var res=DistributePoints(new PointF(100, 20), new PointF(10, 200), 11);
    // res = 
    // ( 10.0,  20.0)
    // ( 19.0,  38.0)
    // ( 28.0,  56.0)
    // ..
    // ( 91.0, 182.0)
    // (100.0, 200.0)
}

答案 1 :(得分:0)

您需要在X的构造函数中提供YPointFhttp://msdn.microsoft.com/en-us/library/system.drawing.pointf.pointf(v=vs.110).aspx

extendedPoints = ExtendPoints(new PointF(clouds[i].X, clouds[i].Y), new PointF(clouds[i + 1].X, clouds[i + 1].Y),20);