为什么我只获得20个新积分?

时间:2013-12-30 18:03:32

标签: c# winforms

首先想法的目标: 我有一个方法可以获得两个点和一些点来创建并返回一个点列表,其中包含要在点之间创建的新点数。

第一个问题是例如第一次pt1是181,172而pt4是180,171 但在结果中,我看到内部有20个点,但第一个是:

180,171,最后一个是181,172 我需要保持原样。 给定的两点应首先在相同的索引上:181,172然后在索引02 180,171

的最后

第二个问题是它只做一次只返回20分。 这是我使用该方法的方式:

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;

云现在只包含20个点,但在原始云中有37个点,并且方法DistributePoints每次应该从云中取两个点并在两个点之间添加新的20个点。

方法:

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

但由于某些原因,它在pictureBox点上添加了更多的20点,我不想要。

我得到的结果是: 我用黑色标记了我不需要的点:

(点击查看大图)
enter image description here

我该如何解决?

问题在于我想:

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

如果云包含37个点(索引)并且我将它发送到方法20次,那么云应该包含740个点(索引)。 但由于某种原因,云只包含360点(索引)。

37 * 20 = 740 那么为什么云最终只包含360点?

所以我有这个问题,到底云只包含360点,我有另一个问题,它在某些地方绘制20点我不想要它。奇怪。

编辑**

我觉得这个代码部分有些错误:

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

如果我在FOR + = 1中做,那么最终云端以720点结束,但后来我看到两组20点在其他一些位置上绘制为线格式。

如果我在FOR + = 2中做,那么最终云以360点结束,但后来我看到一组20点在其他位置绘制为线格式。

如果我在FOR + = 3中做,那么最终云只有240点结束,但这次没有那些20点在其他位置绘制。但是240分是不对的,我认为它应该以云中的740或777分结束。

编辑**

ja72这就是我现在使用你的代码:

enter image description here

这就是我在绘画事件中绘制点的方法:

public static void Paint(Graphics e, double currentFactor, float kilometers)
        {
            float distance = kilometers / (float)1.09;//289617486; // One pixel distance is 1.09 kilometer.
            Pen p;
            p = new Pen(Brushes.Green);
            if (points == null)
            {
                return;
            }


            foreach (PointF pt in clouds)
            {
                e.FillEllipse(Brushes.Red, (pt.X - distance) * (float)currentFactor, pt.Y * (float)currentFactor, 4f, 4f);
            }

在这种情况下:km = 0.0和currentFactor = 1.0 也许这里的油漆事件是错误的,但我不这么认为。

1 个答案:

答案 0 :(得分:0)

从我最能说的是你想要的东西:

public static List<PointF> DistributePoints(PointF pt_start, PointF pt_end, int number_of_points)
{
    List<PointF> result=new List<PointF>();
    float x_start=pt_start.X, x_end=pt_end.X;
    float y_start=pt_start.Y, y_end=pt_end.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_start+(x_end-x_start)*scale, y=y_start+(y_end-y_start)*scale;
        result.Add(new PointF(x, y));
    }
    return result;
}

static void Main(string[] args)
{
    List<PointF> clouds=new List<PointF>();
    List<PointF> extended=new List<PointF>();
    // add N points to clouds
    // there are N-1 intervals
    for (int i=1; i<clouds.Count; i++)
    {
        extended.AddRange( DistributePoints( clouds[i-1], clouds[i], 20));
    }
    // extended now has (N-1)*20 points
}