開發(fā)中遇到了這個問題,Leaflet沒有用兩點畫曲線的方法应役,只能自己求出曲線的坐標(biāo)點組,再畫了燥筷,廢話不多說箩祥,直接貼代碼:
calcCoorArr=(point_start,point_end,num)=>{// 入?yún)蓚€坐標(biāo)(字符串格式:"114.30911,30.600052"),num是返回坐標(biāo)點個數(shù)
? //第一步把坐標(biāo)字符串轉(zhuǎn)為對象,為了方便計算轉(zhuǎn)為了數(shù)字格式
? var p_start={x:parseFloat(point_start.split(",")[0]),y:parseFloat(point_start.split(",")[1])};
? var p_end={x:parseFloat(point_end.split(",")[0]),y:parseFloat(point_end.split(",")[1])};
? //此處敲黑板,是任務(wù)的第二大難點荆责,求出相對的第三個點滥比,用于固定曲線的彎曲度,下面公式是已知三角形兩點坐標(biāo)和兩個坐標(biāo)點的夾角求第三點坐標(biāo)做院,兩個夾角我們是自定義任意值盲泛,不過不要加起來超過180度
? // 已知兩點p1(x1,y1)、p2(x2,y2)和兩點所對應(yīng)的角度A和B,x3键耕、y3是對應(yīng)第三點的坐標(biāo)寺滚,cot25°=2.14
? //x3 = (x1*cotB+x2*cotA+y2-y1)/(cotA+cotB)
? //y3 = (y1*cotB+y2*cotA+x1-x2)/(cotA+cotB)
? let x3=(p_start.x*2.14+p_end.x*2.14-p_start.y+p_end.y)/(2*2.14)
? let y3=(p_start.y*2.14+p_end.y*2.14-p_end.x+p_start.x)/(2*2.14)
? var p_crt1={x:x3,y:y3};
? var p_crt2={x:x3,y:y3};
? //下面計算貝葉斯曲線,不是幾個字能說清屈雄,直接拿去用沒毛病
? /**
? * 計算公式:
? *? ? ? ? ? ? ? ? ? | 1? 0? 0? 0|? |P0|
? * [1 t t*t? t*t*t] |-3? 3? 0? 0|? |P1|
? *? ? ? ? ? ? ? ? ? |3? -6? 3? 0|? |P2|
? *? ? ? ? ? ? ? ? ? |-1? 3? -3? 1|? |p3|
? *
? * **/
? let paths=[];
? for(let i=0;i<num+1;i++){
? ? let t=i/num;
? ? var _matrix1=[1,t,t*t,t*t*t];
? ? var _matrix2=[
? ? ? [1,0,0,0]
? ? ? ,[-3,3,0,0]
? ? ? ,[3,-6,3,0]
? ? ? ,[-1,3,-3,1]
? ? ];
? ? var _matrix3=[
? ? ? [p_start.x,p_start.y]
? ? ? ,[p_crt1.x,p_crt1.y]
? ? ? ,[p_crt2.x,p_crt2.y]
? ? ? ,[p_end.x,p_end.y]
? ? ];
? ? var _matrix_tmp=[
? ? ? _matrix1[0]*_matrix2[0][0]+_matrix1[1]*_matrix2[1][0]+_matrix1[2]*_matrix2[2][0]+_matrix1[3]*_matrix2[3][0]
? ? ? ,_matrix1[0]*_matrix2[0][1]+_matrix1[1]*_matrix2[1][1]+_matrix1[2]*_matrix2[2][1]+_matrix1[3]*_matrix2[3][1]
? ? ? ,_matrix1[0]*_matrix2[0][2]+_matrix1[1]*_matrix2[1][2]+_matrix1[2]*_matrix2[2][2]+_matrix1[3]*_matrix2[3][2]
? ? ? ,_matrix1[0]*_matrix2[0][3]+_matrix1[1]*_matrix2[1][3]+_matrix1[2]*_matrix2[2][3]+_matrix1[3]*_matrix2[3][3]
? ? ];
? ? var _matrix_final=[
? ? ? _matrix_tmp[0]*_matrix3[0][0]+_matrix_tmp[1]*_matrix3[1][0]+_matrix_tmp[2]*_matrix3[2][0]+_matrix_tmp[3]*_matrix3[3][0]
? ? ? ,_matrix_tmp[0]*_matrix3[0][1]+_matrix_tmp[1]*_matrix3[1][1]+_matrix_tmp[2]*_matrix3[2][1]+_matrix_tmp[3]*_matrix3[3][1]
? ? ];
? ? //下面注釋掉的原因是入?yún)⑹墙?jīng)緯度村视,但leaflet渲染需要的是緯度在前經(jīng)度在后的數(shù)組,然后你懂的
? ? // var _res_point={
? ? //? x:_matrix_final[0]
? ? //? ,y:_matrix_final[1]
? ? // };
? ? var _res_point=[_matrix_final[1],_matrix_final[0]];
? ? paths.push(_res_point);
? }
? return paths;
}
走了一兩天彎路酒奶,才摸索出來蚁孔,原創(chuàng)不易,你的贊賞是我原創(chuàng)的動力惋嚎,謝謝~