我需要计算并在两个给定点之间添加两个点如何使用公式?

时间:2014-01-01 22:21:40

标签: c# winforms

在我得到这种方法之前的问题:

private static List<PointF> ExtendPoints(
    PointF pt1,
    PointF pt4,
    int numberOfPoints)
{
    extendedPoints.Add(pt1);

    for (double d = 1; d < numberOfPoints - 1; d++)
    {
        double a = (Math.Max(pt1.X, pt4.X) - Math.Min(pt1.X, pt4.X)) * d / (double)(numberOfPoints - 1) + Math.Min(pt1.X, pt4.X);
        double b = (Math.Max(pt1.Y, pt4.Y) - Math.Min(pt1.Y, pt4.Y)) * d / (double)(numberOfPoints - 1) + Math.Min(pt1.Y, pt4.Y);
        var pt2 = new PointF((float)a, (float)b);
        extendedPoints.Add(pt2);
    }

    extendedPoints.Add(pt4);
    return extendedPoints;
}

但结果不对。

这就是我使用该方法的方法:

for (int i = 1; i < clouds.Count; i++)
{
    extendedPoints = ExtendPoints(clouds[i - 1], clouds[i], 2);
}

cloudsextendedPoints都是List<PointF>类型。

方法中的公式应为:(n-1)*m + n。 例如:

假设clouds列表的长度为2。 我有clouds两点:

Index 0: X = 120 Y = 125

Index 1: X = 130 Y = 135

现在方法得到两个点和数字2意味着该方法应该在每两个给定点之间植入另外两点:

所以现在extendedPoints应该是例如:

Index 0: X = 120 Y = 125
Index 1: X = 126 Y = 127
Index 2: X = 128 Y = 129
Index 3: X = 130 Y = 135

现在我们可以说列表clouds的长度为3,因此该方法每次获得两个点并在它们之间植入新的2个点:

所以我们现在说clouds包含3点:

Index 0: X = 100 Y = 125
Index 1: X = 130 Y = 147
Index 2: X = 150 Y = 160

因此,在索引0和索引1之间,该方法会植入2个点,所以现在它是4。 然后在索引1和索引2之间,该方法植入另一个新的两点。 因此,extendedPoints一起应包含7点。

就像公式:

(n-1)*m + n

n是原始列表clouds的长度。 m是方法应在两点之间植入的点数。

如果clouds5分,那么(5-1)*2 + 5 = 13 如果clouds包含10点:(10-1)* 2 + 10 = 28

现在我该如何在方法中实现这个?

规则:

  1. 在两点之间植入两点另外两点。
  2. 首先保持点数顺序pt1然后保留两个新点,最后保持pt4
  3. 使用公式:(n-1)*m + n
  4. 该方法现在的方式是没有给出正确的结果。例如,如果clouds包含2点且该方法应创建2个新点,则列表extendedPoints应包含4个点:

    (2-1)*2 + 2 = 4
    

    但我得到2分,extendedPoints仅包含2分。那是错的!

    如何使用公式实现它?

    更多解释:

    如果我给出两点:第一次迭代pt1pt4然后在它们之间植入两个新点。 在第一次迭代中,pt1包含在clouds索引0中,pt4位于clouds索引1

    在下一次迭代中,pt1应位于索引clouds的{​​{1}}和索引1的{​​{1}},并在它们之间植入两个新点。< / p>

    接着是下一次迭代,pt4位于索引2pt1位于索引2。 依此类推,具体取决于pt4列表长度。

    将点添加到列表时,该方法应始终先添加3,然后再添加两个新点,然后clouds

1 个答案:

答案 0 :(得分:2)

你说:

  

现在方法得到两个点,数字2表示方法应该在每两个给定点之间实现另外两个点

然而,您的循环条件表明,对于您生成的m点之间的m-2

for (double d = 1; d < numberOfPoints - 1; d++)

如果对于m = 2您希望生成两个点,则应显示为:

for (double d = 1; d <= numberOfPoints; d++)

在循环内部,您应该使用d而不是(double)(numberOfPoints + 1)来扩展(double)(numberOfPoints - 1)