给定一组带有线段的点,找到等距的点

奥马尔·法拉格

我目前正在编写地图,并试图将街道段分成相等的部分。如果街道段是直的,则只需将街道段的长度除以您想要的任何因素即可。然而,弯曲的街道更难分成相等的部分,因为它们由多个部分组成。我想要做的是找出一种方法将街道段分成相等的点,无论它有多弯曲,或者每个段有多长。我尝试参数化曲线以使其起作用,但它仍然不起作用。要了解参数化的含义,请查看此内容

目前,这就是我目前实施它的方式。

        //street_seg_length is length of the ith street segment
        for (double j = 0.0; j < street_seg_length[i]; j+=inc) { 
        
        double rem = j - int(j);
        //A street segment can be split up into multiple curve points. 
        //The more curve points, the curvier a road is
        LatLon from = curve_points_pos[i][int(j)];
        LatLon to = curve_points_pos[i][int(j)+1];
        //Returns cartesian coordinates from latitude and longitude of nth and n+1th curve point
        double x1 = x_from_lon(from.longitude());
        double y1 = y_from_lat(from.latitude());
        double x2 = x_from_lon(to.longitude());
        double y2 = y_from_lat(to.latitude());
        //arrowX, arrowY are supposed to be the coordinates of a point between 2 curve points
        double arrowX = (1 - rem)*x1 + rem*x2;
        double arrowY = (1 - rem) * y1 + rem * y2;
        
         
         
        }
        
    }

rem 是上面帖子中讨论的余数,j 是上面帖子中与 t 相同的值,p 是第 n 个点,q 是上面帖子中讨论的第 n+1 个点。

有人可以解释我可以做什么来实现这一目标或我做错了什么吗?我想在街段上找到等距的点,不管它有多弯曲。我是否正确遵循链接帖子中的算法?我相信我是,但显然算法是错误的,或者我没有正确实现它,后者更有可能。

欧姆

您生成的路径+将具有等距点,但您的原始路径o具有不同长度的段。你有两件不同的事情要处理:

  • 该指数currnext当前段的起点和终点,并
  • t的插值变量

下面是一个curr / next的例子

o    +        0 / 1       t = 0.0
|    |
|    +        0 / 1       t = 0.667
o    |
|    +        1 / 2       t = 0.2
|    |
|    +        1 / 2       t = 0.6
|    |
o    +        1 / 2       t = 1.0

所以你的算法是这样的:

  • 找到整体和累积的段长度;
  • curr = 0开始next = 1
  • 循环 n 个等距点:
    • 确定该z的总运行长度
    • 调整currnext,使curr ≤ z ≤ next
    • 确定t和插值

这是一个将路径seg分成n相同长度的段的实现。(它不是在 C++ 中,而是在 Javascript 中,它直接处理 (x, y) 坐标而不是 lon/lat,但我认为您可以理解它。)

function split(seg, n) {
    let acc = [];               // n + 1 accumulated lengths
    let len = 0;                // overall length
    let p = seg[0];              
    
    let res = [];               // array of n + 1 result points
    
    // find segemnt and overall lengths
    
    for (let i = 0; i < seg.length; i++) {
        let q = seg[i];
        len += Math.hypot(q.x - p.x, q.y - p.y);
        acc.push(len);

        p = q;
    }
    
    acc.push(2 * len);          // sentinel

    let curr = 0;
    let next = 1;
    
    // create equidistant result points
    
    for (let i = 0; i < n; i++) {
        let z = len * i / n;        // running length of point i
        
        // advance to current segment
        
        while (z > acc[next]) {
            curr++;
            next++;
        }
        
        // interpolate in segment
                
        let p = seg[curr];
        let q = seg[next];
        
        let t = (z - acc[curr]) / (acc[next] - acc[curr]);
        
        res.push(new Point(p.x * (1 - t) + q.x * t,
                           p.y * (1 - t) + q.y * t));
    }
    
    // push end point (leave out when joining consecutive segments.)
    
    res.push(seg[seg.length - 1]);
    
    return res;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

给定一组格点,有多少组点?

在给定起点的情况下找到适合一组点的最大圆(numpy)

如何找到覆盖R中一组点的给定分数的最小椭圆?

Eigen和SVD在给定一组点的情况下找到最佳拟合平面

给定一组坐标点,删除内部点(或找到点的外环)以形成多边形

找到一组线段中的所有交点?

给定二维空间中的一组点,每个点都有一些惩罚,找到一个正好覆盖N个点的凸区域,从而将惩罚最小化

给定一组点计算网格宽度

我如何使用python从一组点中选择等距的点

在图像中的一组点周围找到不同的边界

有效地找到一组二进制点周围的边界

给定一组2D点和一个最大距离,找到以该点为中心的最小聚类

如何在无组织点云中的一个点周围找到具有特定半径的球形空间中的一组点

在一组垂直线段中找到所有不相交的交点

从一组点到范围之间的接触点找到最接近点的有效方法?

关闭从一组点生成的打开的 Catmull-Rom 样条曲线,并带有平滑曲线

计算一组点的熵

使上限适合一组点

平面中的一组点

给定一组边界点的二维三角剖分

给定一组点找出最大面积k-gon

给定一组点,如何计算相似度变换(平移,缩放,旋转)?

如何在 xy 平面中的给定 (x,y) 坐标内生成一组随机点?

如何在一组点中找到最接近另一个点的点?

给定带有点的二维图,找到一条穿过最大点数的线

找到包围一组点的边界多边形的面积

在3D空间中的一组点中找到两个最远的点

R在一组点“下方”找到最接近的凸曲线

将闭合曲线拟合到一组离散点并找到它的周长