让我们假设你有两个点(A,B)在二维平面上。 鉴于这两点,什么是找到等距从最接近的每个点以最少相隔较远的线段上的最大点的最好办法。
我使用C#,但在任何语言的例子将是有益的。
List<'points> FindAllPointsInLine(Point start, Point end, int minDistantApart)
{
// find all points
}
让我们假设你有两个点(A,B)在二维平面上。 鉴于这两点,什么是找到等距从最接近的每个点以最少相隔较远的线段上的最大点的最好办法。
我使用C#,但在任何语言的例子将是有益的。
List<'points> FindAllPointsInLine(Point start, Point end, int minDistantApart)
{
// find all points
}
解释的问题如下:
start
end
minDistanceApart
那么,这是相当简单:之间的长度start
和end
除以minDistanceApart
,舍去减1(不含1你最终的终点,而不是额外的点数之间的距离的数量其间负)
执行:
List<Point> FindAllPoints(Point start, Point end, int minDistance)
{
double dx = end.x - start.x;
double dy = end.y - start.y;
int numPoints =
Math.Floor(Math.Sqrt(dx * dx + dy * dy) / (double) minDistance) - 1;
List<Point> result = new List<Point>;
double stepx = dx / numPoints;
double stepy = dy / numPoints;
double px = start.x + stepx;
double py = start.y + stepy;
for (int ix = 0; ix < numPoints; ix++)
{
result.Add(new Point(px, py));
px += stepx;
py += stepy;
}
return result;
}
如果你想所有的点,包括起点和终点,那么你就必须调整的循环,并开始“像素”和“PY”在“start.x”和“start.y”代替。 请注意,如果端点的准确性是至关重要的,你可能要执行“像素”和“吡啶”的直接基于比“IX /为NumPoints”,而不是计算。
我不知道如果我理解你的问题,但你试图把一个线段这样吗?
之前:
A + -------------------- + B
后:
A + - | - | - | - | - | - | - + B
其中,“两个破折号”是您的最小距离? 如果是的话,那么就会有无限多台满足,除非你的最小距离可以精确地划分段的长度点。 然而,如下可以得到一个这样的组:
[编辑]看到jerryjvl的答复后,我觉得你想要的代码是这样的:(在Java的ISH这样做)
List<Point> FindAllPointsInLine(Point start, Point end, float distance)
{
float length = Math.hypot(start.x - end.x, start.y - end.y);
int n = (int)Math.floor(length / distance);
List<Point> result = new ArrayList<Point>(n);
for (int i=0; i<=n; i++) { // Note that I use <=, not <
float t = ((float)i)/n;
result.add(interpolate(start, end, t));
}
return result;
}
Point interpolate(Point a, Point b, float t)
{
float u = 1-t;
float x = a.x*u + b.x*t;
float y = a.y*u + b.y*t;
return new Point(x,y);
}
[警告:代码尚未经过测试]
发现,将适合上线的点数。 计算X和Y坐标的步骤和生成点。 像这样:
lineLength = sqrt(pow(end.X - start.X,2) + pow(end.Y - start.Y, 2))
numberOfPoints = floor(lineLength/minDistantApart)
stepX = (end.X - start.X)/numberOfPoints
stepY = (end.Y - start.Y)/numberOfPoints
for (i = 1; i < numberOfPoints; i++) {
yield Point(start.X + stepX*i, start.Y + stepY*i)
}