cesium之飛線數據獲取(貝塞爾曲線轉換)


cesium之飛線數據獲取(貝塞爾曲線轉換)

最近研究了一下飛線生成的原理,找到一種實現方法。

以下:x指經度,y指緯度,h指飛線高度

原理:

  1.通過兩個點和飛線高度計算出控制貝塞爾曲線弧度的第三個點

  2.將三個點的(y, h)傳入貝塞爾曲線算法,得到一條垂直於地面的貝塞爾曲線點數組arr

  3.通過兩點的直線公式,獲取數組arr中每個點的x值,得到空間曲線數組

代碼:

// 貝塞爾曲線二維轉三維  返回一個三維點數組
// 參數: x1,y1,x2,y2,h 兩點經緯度坐標和飛線高度
export function getBSRPoints (x1,y1,x2,y2,h) {
  let point1 = [y1, 0]
  let point2 = [(y2+y1)/2, h]
  let point3 = [y2, 0]
  let arr = getBSR(point1, point2, point3)
  let arr3d = []
  for (let i in arr) {
    let x = (x2-x1)*(arr[i][0]-y1)/(y2-y1) + x1
    arr3d.push([x, arr[i][0], arr[i][1]])
  }
  return arr3d
}
// 生成貝塞爾曲線
function getBSR (point1, point2, point3) {
  var ps = [{ x: point1[0], y: point1[1] }, { x: point2[0], y: point2[1] }, { x: point3[0], y: point3[1] }]
  let guijipoints = CreateBezierPoints(ps, 100);
  return guijipoints
}
// 貝賽爾曲線算法
// 參數:
// anchorpoints: [{ x: 116.30, y: 39.60 }, { x: 37.50, y: 40.25 }, { x: 39.51, y: 36.25 }]
function CreateBezierPoints(anchorpoints, pointsAmount) {
  var points = [];
  for (var i = 0; i < pointsAmount; i++) {
    var point = MultiPointBezier(anchorpoints, i / pointsAmount)
    points.push([point.x, point.y]);
  }
  return points;
}
function MultiPointBezier(points, t) {
  var len = points.length;
  var x = 0, y = 0;
  var erxiangshi = function (start, end) {
    var cs = 1, bcs = 1;
    while (end > 0) {
      cs *= start;
      bcs *= end;
      start--;
      end--;
    }
    return (cs / bcs);
  };
  for (var i = 0; i < len; i++) {
    var point = points[i];
    x += point.x * Math.pow((1 - t), (len - 1 - i)) * Math.pow(t, i) * (erxiangshi(len - 1, i));
    y += point.y * Math.pow((1 - t), (len - 1 - i)) * Math.pow(t, i) * (erxiangshi(len - 1, i));
  }
  return { x: x, y: y };
}

調用:

  引入以上代碼文件,調用getBSRPoints方法即可獲取飛線數據,將其賦予動態材質,即可實現飛線。

  動態材質見:https://www.cnblogs.com/s313139232/p/12804734.html

注意:

  以上方法獲取到的數據格式為[[x,y,z],[x,y,z],[x,y,z],[x,y,z]],而cesium創建線fromDegreesArrayHeights方法需要的數據格式為:[x,y,z,x,y,z,x,y,z,x,y,z]

  將一下方法加入上面文件中調用即可:

export function getBSRxyz (x1,y1,x2,y2,h) {
  let arr3d = getBSRPoints(x1,y1,x2,y2,h)
  let arrAll = []
  for (let i in arr3d) {
    arrAll.push(arr3d[i][0])
    arrAll.push(arr3d[i][1])
    arrAll.push(arr3d[i][2])
  }
  return arrAll
}

 

 

 

鑽研不易,轉載請注明出處。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM