Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于路径的分数';从具有多个点的路径获取坐标;s距离_Javascript_Algorithm_Geometry_Computational Geometry - Fatal编程技术网

Javascript 基于路径的分数';从具有多个点的路径获取坐标;s距离

Javascript 基于路径的分数';从具有多个点的路径获取坐标;s距离,javascript,algorithm,geometry,computational-geometry,Javascript,Algorithm,Geometry,Computational Geometry,我有一个数组,其中每个数组值都是一个对象{lat:\uuuuuu,lng:\uuuuuu}。我想输入一个分数(比如说20%(0.2)并根据与点0的距离获得该分数的特定坐标。这意味着给定距离d(点之间所有单独路径的总和),坐标应为d的1/5。如果我将分数设置为0,这将给出路径中的第一个坐标。如果我把分数设置为1,它会给我最后一个 我已经阅读了SO()上基于分数的坐标,并在我的算法中使用了这个函数 我想我可能会把每个点之间的所有路径加在一起,得到一个和d。然后,对于点之间的每个距离f,我会检查该距离

我有一个数组,其中每个数组值都是一个对象
{lat:\uuuuuu,lng:\uuuuuu}
。我想输入一个分数(比如说
20%
0.2
)并根据与点0的距离获得该分数的特定坐标。这意味着给定距离
d
(点之间所有单独路径的总和),坐标应为
d
的1/5。如果我将分数设置为
0
,这将给出路径中的第一个坐标。如果我把分数设置为
1
,它会给我最后一个

我已经阅读了SO()上基于分数的坐标,并在我的算法中使用了这个函数

我想我可能会把每个点之间的所有路径加在一起,得到一个和
d
。然后,对于点之间的每个距离
f
,我会检查该距离是否低于
d
。如果
true
,则从
d
中扣除
f
。如果
false
,使用上面链接中的函数并输入剩余分数
d
。我想这会给我正确的坐标

这在某种程度上是可行的,但对于长距离的个人路径,它会在整个路径中留下间隙

这是算法代码和生成这张图片的代码。我认为问题出现在
模块中

var模块={};
模块距离=功能(lat1、lon1、lat2、lon2、km=真){
var p=0.017453292519943295,
c=数学cos;
变量a=0.5-c((lat2-lat1)*p)/2+c(lat1*p)*c(lat2*p)*(1-c((lon2-lon1)*p))/2;
如果(公里){
返回12742*Math.asin(Math.sqrt(a));//2*R;R=6371公里
}否则{
返回12742*Math.asin(Math.sqrt(a))*1000;//米
}
};
modules.distanceSum=函数(arr,km=true){
var合计=0;
对于(变量i=0;i0){
总+=模块。距离(arr[i-1]。纬度,arr[i-1]。液化天然气,arr[i]。纬度,arr[i]。液化天然气,公里);
}
}
返回总数;
};
modules.fractionCoordinatorray=函数(arr,frac=0){
var dist=模块距离总和(arr),
分数=[];
如果(分形=1){
返回{
横向:纵向[纵向长度-1]。横向,
lng:arr[arr.length-1].lng
};
}
对于(变量i=0;i0){
var frc=modules.distance(arr[i-1].lat,arr[i-1].lng,arr[i].lat,arr[i].lng/dist;
如果(压裂>frc){
frac-=frc;
}否则{
返回模块.fractionCoordination(arr[i-1].lat,arr[i-1].lng,arr[i].lat,arr[i].lng,frac);
}
}
}
};
modules.fractionCoordinate=函数(lat1、lng1、lat2、lng2、per){
返回{
lat:lat1+(lat2-lat1)*每,
液化天然气:lng1+(lng2-lng1)*每
};
};
/*
为了生成图像,我使用了这个;
*/
var dst=[],
路径=[{
拉脱维亚:12,
液化天然气:12
}, {
拉脱维亚:13.75,
液化天然气:13
}, {
拉脱维亚:14,
液化天然气:17
}, {
拉丁美洲:59,
液化天然气:18
}]; // 示例路径
对于(变量i=0;i<51;i++){
var crd=模块。分形坐标RAY(路径,i/50);
dst.push('标记=尺寸:微小%7C'+crd.lat+'、'+crd.lng);
}

console.log('https://maps.googleapis.com/maps/api/staticmap?autoscale=2&size=600x300&maptype=roadmap&format=png&visual_refresh=true&'+dst.join('&')
如果您首先将分数
frac
转换为绝对距离
totalDistribleMining
(通过将其乘以总路径距离),然后从该点开始使用(即减去各个边的长度),则
fractionCoordinatoray()中的逻辑或多或少是正确的

那么当你打电话的时候

return modules.fractionCoordinate(arr[i-1].lat, arr[i-1].lng, arr[i].lat, arr[i].lng, frac);
你应该通过考试

总分布/距离(arr[i-1]。纬度,arr[i-1]。lng,arr[i]。纬度,arr[i]。lng)

作为最后一个参数


最后,为了提高速度,可以在每个数组元素中添加第三个条目,该条目记录到目前为止沿路径的总距离(因此,该值在开始时为0,在结束时等于总路径长度)。此值不会减少,因此您现在可以使用二进制搜索在O(logn)时间内找到包含任何给定路径距离的路径段。

这太棒了,谢谢!我更新了代码,把它放在一个文件夹中,效果很好。现在这只是道路顶部的一个小缺口。介意看一下吗?另外,我不太明白最后一部分关于如何提高速度的内容。我为小提琴中的每个数组元素添加了一个距离条目,并且每个元素的距离都在增加。现在,我应该用二进制搜索做什么?@MagnusBurton:很高兴它主要对你有用。您可能有一个一次性错误——调试这些错误的最佳方法是尝试较小的情况(例如,长度为2的数组),看看是否可以将其隔离。关于二进制搜索:如果有,比如说,100条边,你首先看看到目前为止第50条的总距离;如果这已经超过了你的目标距离,你知道它必须在前50的某个地方,所以你会看到第25个条目;如果这低于你的目标距离,你会看到第37个(大约在25和50之间的中间),等等。我发现我做错了什么,我不断删除循环中的错误值。现在修好了。感谢您对二进制搜索的解释。现在将实现这一点,因为这似乎是一个巨大的速度提升。不客气:)二进制搜索应该为长(多个边缘)路径提供很大的加速。