在一个线段等距点(Equidistant points in a line segment)

2019-09-28 07:45发布

让我们假设你有两个点(A,B)在二维平面上。 鉴于这两点,什么是找到等距从最接近的每个点以最少相隔较远的线段上的最大点的最好办法。

我使用C#,但在任何语言的例子将是有益的。

List<'points> FindAllPointsInLine(Point start, Point end, int minDistantApart)  
{  
//    find all points  
}

Answer 1:

解释的问题如下:

  • 点之间start
  • 而点end
  • 什么是点的最大数量其间的间隔均匀是至少minDistanceApart

那么,这是相当简单:之间的长度startend除以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”,而不是计算。



Answer 2:

我不知道如果我理解你的问题,但你试图把一个线段这样吗?

之前:

A + -------------------- + B

后:

A + - | - | - | - | - | - | - + B

其中,“两个破折号”是您的最小距离? 如果是的话,那么就会有无限多台满足,除非你的最小距离可以精确地划分段的长度点。 然而,如下可以得到一个这样的组:

  1. 找到该行的向量参数方程
  2. 找到的点的总数(地板(长度/ minDistance才会)+ 1)
  3. 环路I从0到n,发现每一个点沿着线(如果您的参数方程需要在从0到1,T =((浮点)ⅰ)/ n)的

[编辑]看到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);
}

[警告:代码尚未经过测试]



Answer 3:

发现,将适合上线的点数。 计算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)
}


文章来源: Equidistant points in a line segment