Java 给定方向上等距点集的包络 让我们考虑一个二维(纬度,经度)点集。集合中的点间距相等(约),相互距离为0.1度\乘以0.1度。集合中的每个点是边长为0.1度的正方形网格的中心(即,正方形两条对角线的交点)。每个广场与相邻的广场相邻
我们的目标是获得由具有给定方向的正方形网格的边界边形成的轮廓多边形的坐标(将用图形说明)。此多边形内部没有孔Java 给定方向上等距点集的包络 让我们考虑一个二维(纬度,经度)点集。集合中的点间距相等(约),相互距离为0.1度\乘以0.1度。集合中的每个点是边长为0.1度的正方形网格的中心(即,正方形两条对角线的交点)。每个广场与相邻的广场相邻,java,r,algorithm,geospatial,graph-algorithm,Java,R,Algorithm,Geospatial,Graph Algorithm,我们的目标是获得由具有给定方向的正方形网格的边界边形成的轮廓多边形的坐标(将用图形说明)。此多边形内部没有孔 让我们考虑一个大小为10(点集)的样本数据集。 lat_x我会这样做: 可能是一些2D数组点分组,以匹配网格 这将加快以下所有操作 计算平均网格大小(img1从左起) 作为两个向量 创建蓝点(img2) as:gray_点(+/-)0.5*蓝色_向量 创建红点(img3) as:蓝色_点(+/-)0.5*红色_向量 创建灰线列表(img4) 获取距离接近平均栅格距离的所有2个原
让我们考虑一个大小为10(点集)的样本数据集。
lat_x我会这样做:
可能是一些2D数组点分组,以匹配网格
这将加快以下所有操作
计算平均网格大小(img1从左起)
作为两个向量
创建蓝点(img2)
as:gray_点(+/-)0.5*蓝色_向量
创建红点(img3)
as:蓝色_点(+/-)0.5*红色_向量
创建灰线列表(img4)
获取距离接近平均栅格距离的所有2个原始(灰色)点,并为它们添加直线
创建红线列表(img4)
取距离接近平均栅格距离的所有2个原始(灰色)点,如果该点不与灰色线的任何线相交,则为其添加线
重新排列线点以匹配多边形缠绕…
角度
计算红色矢量的角度(通过atan2)
计算蓝色矢量的角度(通过atan2)
返回绝对值较小的值
[edit1]对评论的回应
网格大小
找到几个彼此最接近的点,因此选择任意点并找到所有最接近的点。可能的距离应接近:
sqrt(1.0)*d,sqrt(1+1)*d,sqrt(1+2)*d,sqrt(2+2)*d,...
其中d
是网格大小,因此计算少数拾取点的d
。记住找到的第一个最小的d
,扔掉所有与最小的不相似的东西。将它们取平均值,称之为d
网格向量
取任意点A
并找到距离d
最近的点B
。例如+/-10%
比较:|(| A-B |-d)|你知道旋转中心在哪里吗?我假设不是从0,0开始的。你会提前知道θ吗,或者这是你必须估计的。似乎最好的办法是将其旋转50度,使用其他点,然后通过旋转将这些点向后平移。中点似乎位于边界线上,从那里开始累积…@MrFlick这些是卫星数据,$theta$是通过观察卫星的移动方向来估算的。旋转和平移可能不是个好主意,因为点位于(纬度,经度)上,两点之间的地理距离不是点的平移和旋转不变的。@MrFlick我不知道旋转中心的确切位置。很抱歉回复晚了,谢谢您的关注。@John谢谢您的关注。请解释一下我如何从中点开始施工?谢谢@Spektre的关注和努力。请你解释一下你提出的算法中的以下问题:(第2点)要找到平均网格大小,向量的选择是什么?是二维点本身吗?(第5点)如何获得蓝色和红色点?请注意,这里把0.05个单位代入或添加到点坐标,得到正方形网格的拐角点作为这些偏离点将是无济于事的,因为它不考虑点应该移动的方向。我没有得到你的第六点,什么是网格距离?请你解释一下,谢谢你的好意回复。很抱歉回复晚了…我正在尝试编写给定的算法。我在这里停留,在网格向量部分,在得到你评论的4组“通过对一组向量求反将负方向组连接在一起”之后。这里,什么是负方向组?你是说有两个坐标的是负数还是至少有一个坐标是负数!我试着用R.janak来编码,你应该有4个方向,其中2个方向是相对的,所以如果你对一组向量求反,你就得到了另一组的方向。我的意思是用-1乘以所有坐标。。。(与之类似,北对南为负,西对东为负)。。。你的矢量是旋转的,所以你需要处理所有的矢量,而不是单一的坐标。。。(您应该查看向量数学基础)
lon_y <- c(88.21993, 88.25369, 88.31292, 88.28740, 88.34669,
88.32118, 88.40608, 88.38045, 88.35494, 88.43984)
sqrt(1.0)*d,sqrt(1+1)*d,sqrt(1+2)*d,sqrt(2+2)*d,...
A.x+=0.5*red_vector.x;
A.y+=0.5*red_vector.y;
|(|A-B|-d)|<=0.1*d
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...
}