在给定方向上包裹等距点集

亚纳克

让我们考虑一个二维(纬度,经度)点集。集合中的点之间的等距间隔(约)为0.1度\ x 0.1度。集合中的每个点都是边长为0.1度的正方形网格的中心(即,正方形的两个对角线的相交点)。每个正方形都与相邻的正方形相邻。

我们的目标是获得由给定方向的正方形网格的边界边形成轮廓多边形的坐标(将用数字说明)。该多边形内部没有孔

让我们考虑一个大小为10(点集)的样本数据集。

lat_x <- c(21.00749, 21.02675, 21.00396, 21.04602, 21.02317, 
           21.06524, 21.00008, 21.04247, 21.08454, 21.0192)

lon_y <- c(88.21993, 88.25369, 88.31292, 88.28740, 88.34669, 
           88.32118, 88.40608, 88.38045, 88.35494, 88.43984) 

这是以上几点的粗略图解,后面是一些插图, 在此处输入图片说明

黑点是上述示例中的(纬度,经度)点。

蓝色方形框是方形网格。

正方形的给定方向(\ theta)为$ theta $ = 50度。

我们的目标是获取轮廓多边形(黄色)的有序(顺时针或逆时针)坐标。

注意:这个问题与非常相似,@ laune给出了很好的答案。那里的目标是获得没有方向(或0度方向)的轮廓多边形。但是在当前设置中,我需要在绘制正方形网格和所得多边形时包括方向(非零)。

我将不胜感激任何解决上述问题的人的任何建议,java或R代码或有用的参考。

光谱

我会这样:

网格轮廓

  1. 可能是一些2D阵列点分组以匹配网格

    可以加快以下所有操作的速度。

  2. 计算平均网格大小(左起为img1)

    作为两个向量

  3. 创建蓝点(img2)

    作为: gray_point (+/-) 0.5*blue_vector

  4. 创建红点(img3)

    作为: blue_point (+/-) 0.5*red_vector

  5. 创建灰线列表(img4)

    取所有距离都接近平均网格距离的所有2个原始(灰色)点,并为其添加线

  6. 创建红线列表(img4)

    取所有距离接近平均网格距离的所有2个原始(灰色)点,如果它们不与灰线中的任何一条线相交,则为其添加线

  7. 重新排列线点以匹配多边形绕组...

  8. 角度


计算红色矢量的角度(通过atan2)
计算蓝色矢量的角度(通过atan2)
返回绝对值较小的那个

[edit1]对评论的回应

网格大小

find few points that are closest to each other so pick any point and find all closest points to it. The possible distances should be near:

sqrt(1.0)*d,sqrt(1+1)*d,sqrt(1+2)*d,sqrt(2+2)*d,...

where d is the grid size so compute d for few picked points. Remember the first smallest d found and throw away all that are not similar to smallest one. Make average of them and let call it d

grid vectors

Take any point A and find closest point B to it with distance near d. For example +/-10% comparison: |(|A-B|-d)|<=0.1*d Now the grid vector is (B-A). Find few of them (picking different A,B) and group them by sign of x,y coordinates into 4 groups.

然后通过否定一组矢量将负方向组连接在一起,这样您将拥有2个矢量列表(红色,蓝色方向),并从它们中得出平均矢量(红色,蓝色矢量)

转移点

您采取任何一点,A然后向其中添加或减去红色或蓝色矢量的一半(而不是其大小!!!),例如:

A.x+=0.5*red_vector.x;
A.y+=0.5*red_vector.y;

行列表

for每2个点组合产生2个嵌套s A,B(原始表示灰线,移动红色表示红色轮廓线),并为距离添加条件

|(|A-B|-d)|<=0.1*d

如果是,true则将行添加(A,B)到列表中。这里是伪C ++示例:

    int i,j,N=?;       // N is number of input points in pnt[]
    double x,y,d=?,dd=d*d,de=0.1*d; // d is the avg grid size
    double pnt[N][2]=?;    // your 2D points
    for (i=0;i<N;i++)      // i - all points
     for (j=i+1;j<N;j++)   // j - just the rest no need to test already tested combinations
       {
       x=pnt[i][0]-pnt[j][0];
       y=pnt[i][1]-pnt[j][1];
       if (fabs((x*x)+(y*y)-dd)<=de) ... // add line pnt[i],pnt[j] to the list...
       }

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在给定切线方向上找到二次贝塞尔曲线上的点(如果有)?

创建一个 3d numpy 数组,其条目在给定方向上增加

GeoDjango:在给定方向上将坐标移动固定距离(例如,向东移动一英里)

从给定点获取N个随机等距点

当在给定方向上没有窗口时,是否有可能使“ i3-msg focus <direction>”不回绕

在Cesiumjs中创建方向上的点

在给定起点,方向四元数和行进距离的情况下查找下一个3D点

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

在给定圆中生成多个随机点的功能

在给定的极值点上强制拟合样条

使用openlayers在给定坐标的地图上绘制点?

R; 在给定向量的情况下向上或向下舍入到给定的X

点x cor沿给定方向计算

轮廓中等距的点

ThreeJS等距球点

矩阵中的等距点

如何计算一条直线上与给定点等距的两个点?

无法使用Regl在Z方向上绘制点

快速计算新点x在y方向上的距离

如何在给定距离的任意垂直线上找到3-D点

沿椭圆在给定的端点和短轴上获得n个点

在给定分辨率和中心点的情况下检索图像的角坐标

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

如何在给定参数曲线的一点上绘制法线

如何在给定向量的垂直平面中找到 3D 点坐标

在给定的当前点,距离和方位的情况下获取准确的经/纬度

如何在给定长度的曲线的每个点上绘制法线向量?

Hibernate Envers:AuditQuery用于选择在给定时间点有效的实体

在给定角度的点(x,y)的边界内绘制一条线