这是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,因为它们的顺序相同。
答案 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
的构造函数中提供Y
和PointF
:http://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);