首先想法的目标: 我有一个方法可以获得两个点和一些点来创建并返回一个点列表,其中包含要在点之间创建的新点数。
第一个问题是例如第一次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点,我不想要。
我得到的结果是: 我用黑色标记了我不需要的点:
我该如何解决?
问题在于我想:
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这就是我现在使用你的代码:
这就是我在绘画事件中绘制点的方法:
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 也许这里的油漆事件是错误的,但我不这么认为。
答案 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
}