Cesium中常用的一些数学计算(矩阵、向量)用法——向量

这篇具有很好参考价值的文章主要介绍了Cesium中常用的一些数学计算(矩阵、向量)用法——向量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刚好本人最近在研究数字孪生模拟相关的专题,涉及到三维空间中跟线代相关的计算,顺便重温了一下现代,在使用的过程中遇到的一些总结和实用技巧在下头阐述,相信这篇文章能够给短时间接触这些API的人一些启发。

不同人看向量存在着差异。物理专业学生的视角,向量由方向和长度决定;对于数学专业的学生来说,向量则会被概括为列表的形式方便计算机的存储;

向量是将几何问题转化为代数问题的桥梁,通常,我们研究的二维向量是平面的,而对于我们生活的三维空间,则更多使用三维的向量表示。理解其几何意义可以更好的运用于实际的案例,理解其代数实现可以更好地在计算机进行实现,先来总结一下Cesium 中Cartesian3的一些常见用法:

笛卡尔坐标系(Cartesian3)

地球几何中心为原点,以米为单位。
cesium 向量计算,CesiumJS,矩阵,线性代数

坐标经典转换

如何将经纬度或弧度转空间直角坐标系

// wgs84的弧度的经纬度
var position = Cesium.Cartesian3.fromRadians(-2.007, 0.645)
 //#WGS84经纬度转换为世界(笛卡尔)坐标直接转换
var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)//其中,高度默认值为0,可以不用填写;longitude和latitude为经纬度
var positions = Cesium.Cartesian3.fromDegreesArray(coordinates);//其中,coordinates格式为不带高度的数组。例如:[-115.0, 37.0, -107.0, 33.0]
var positions = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带有高度的数组。例如:[-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]

如何将笛卡尔空间直角坐标(Cartesian3)转经纬度或弧度(wgs84)

// 第一种:直接转换,转换为弧度
const cartographic = Cesium.Cartographic.fromCartesian(cartesian3)
// 第二种:间接转化,转换为角度
const ellipsoid = viewer.scene.globe.ellipsoid
const cartesian3 = new Cesium.cartesian3(x,y,z)
const cartographic = ellipsoid.cartesianToCartographic(cartesian3)
const lat = Cesium.Math.toDegrees(cartograhphic.latitude)
const lng = Cesium.Math.toDegrees(cartograhpinc.longitude)
const alt = cartographic.height

常用方法

Cesium.Cartesian3.abs(cartesian, new Cesium.Cartesian3())

求向量的绝对值

Cesium.Cartesian3.add(a, b, new Cesium.Cartesian3())

  // 源码
  // 代数理解
  // A(X1,Y1) B(X2,Y2),则A + B=(X1+X2,Y1+Y2)
  result.x = left.x + right.x;
  result.y = left.y + right.y;
  result.z = left.z + right.z;

向量相加得到的结果。由起点指向下一个向量的终点(几何意义的理解)。
cesium 向量计算,CesiumJS,矩阵,线性代数

Cesium.Cartesian3.subtract(pointA, pointB, new Cesium.Cartesian3());

  // 源码
  // A(X1,Y1) B(X2,Y2),A - B=(X1-X2,Y1-Y2)
  result.x = left.x - right.x;
  result.y = left.y - right.y;
  result.z = left.z - right.z;

计算A、B两个笛卡尔向量差,第一个参数是起点,第二个参数是终点。
由减向量的终点指向被减向量的终点。
cesium 向量计算,CesiumJS,矩阵,线性代数

Cesium.Cartesian3.normalize(vector, new Cesium.Cartesian3());

  // 源码
  const magnitude = Cartesian3.magnitude(cartesian);
  result.x = cartesian.x / magnitude;
  result.y = cartesian.y / magnitude;
  result.z = cartesian.z / magnitude;

将向量归一化(即单位向量),实际应用中使得我们可以只考虑单位向量的方向,不去管他的大小。

Cesium.Cartesian3.negate(cartesian, new Cesium.Cartesian3())

向量方向取反

// 例子
Cesium.Cartesian3.negate(new Cesium.Cartesian3(3,4,5), new Cesium.Cartesian3()) 
// new Cesium.Cartesian3(-3, -4, -5)

Cesium.Cartesian3.dot(left, right) ;

// 源码
// 代数实现: 两个维数相同的向量对应维相乘再相加
// 计算向量的点积(注:点积是标量,只有数值,没有方向)
 return left.x * right.x + left.y * right.y + left.z * right.z;

几何意义:b在a向量上的投影和a长度的乘积;
如果两个向量的指向方向大致相同时,则点积为正数;两个互相垂直的向量结果为0;两个向量的指向大致相反时,点积为负数。
cesium 向量计算,CesiumJS,矩阵,线性代数
点积与顺序无关。

点积在图形学上的用途:主要用于求夹角、求两个向量投影的长度、比较两个向量的接近程度(方向上,如果点积越大,说明夹角越小)

Cesium.Cartesian3.cross(left, right, result)

计算向量叉积(注:叉积是向量)

  // 源码
  const leftX = left.x;
  const leftY = left.y;
  const leftZ = left.z;
  const rightX = right.x;
  const rightY = right.y;
  const rightZ = right.z;

  const x = leftY * rightZ - leftZ * rightY;
  const y = leftZ * rightX - leftX * rightZ;
  const z = leftX * rightY - leftY * rightX;

  result.x = x;
  result.y = y;
  result.z = z;
  return result;

向量的叉积:两个互相垂直的向量,结果是向量的乘积;向量叉乘自身得到长度为0的向量;

叉积的用途很多,可用于求平面的法向量(向量的方向同时垂直于向量a、b组成的平面)、建立三维空间坐标中的直角坐标系、计算三角形的面积、判断左右和内外等等;例如可以判断凹凸多边形、点是否在三角形面内。

Cesium.Cartesian3.projectVector(a, b, new Cesium.Cartesian3())

求向量a投影到向量b上的向量

 // 源码
  const scalar = Cartesian3.dot(a, b) / Cartesian3.dot(b, b);
  return Cartesian3.multiplyByScalar(b, scalar, result);

源码解析:按照几何理解,a、b的点积是a向量在b向量上投影的长度 乘以 b向量的长度(模),b的点积是b长度的平方,所以scalar = a向量在b向量上投影的长度/b向量的长度,将b向量乘以他们的比例即等于a在b上的投影。

Cesium.Cartesian3.midpoint(left, right, new Cesium.Cartesian3())

求两个点的中间点

  result.x = (left.x + right.x) * 0.5;
  result.y = (left.y + right.y) * 0.5;
  result.z = (left.z + right.z) * 0.5;

cesium 向量计算,CesiumJS,矩阵,线性代数
绿色的点为蓝色点的中点

Cesium.Cartesian3.multiplyByScalar(cartesian, scalar, new Cesium.Cartesian3())

向量的缩放比例

  // 源码
  result.x = cartesian.x * scalar;
  result.y = cartesian.y * scalar;
  result.z = cartesian.z * scalar;

Cesium.Cartesian3.multiplyComponents(left, right, new Cesium.Cartesian3())

两个Cartesian的分量乘积

  result.x = left.x * right.x;
  result.y = left.y * right.y;
  result.z = left.z * right.z;

Cesium.Cartesian3.divideByScalar(cartesian, scalar, new Cesium.Cartesian3())

将提供的笛卡尔分量除以提供的标量

  result.x = cartesian.x / scalar;
  result.y = cartesian.y / scalar;
  result.z = cartesian.z / scalar;

Cesium.Cartesian3.divideComponents(left, right, new Cesium.Cartesian3())

两个笛卡尔坐标的分量商

  result.x = left.x / right.x;
  result.y = left.y / right.y;
  result.z = left.z / right.z;

Cesium.Cartesian3.magnitude(cartesian)

求向量的长度(向量的模)(注:一个向量)

// 源码
return Math.sqrt(Cartesian3.magnitudeSquared(cartesian));

Cesium.Cartesian3.magnitudeSquared(cartesian)

求向量长度的平方(向量模的平方)(注:一个向量)

// 源码
return (cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z);

Cesium.Cartesian3.distance(left, right)

求两个向量之间的距离(注:求两点的直线距离)

 // 源码
 Cartesian3.subtract(left, right, distanceScratch);
  return Cartesian3.magnitude(distanceScratch);

区别于直线距离,还有地表距离,可以用下面的方式计算:

// 求取地表两点距离  由经纬度返回弧度
 let startPosition1=new Cesium.Cartographic.fromDegrees(110,30);
 let endPosition1=new Cesium.Cartographic.fromDegrees(110,30.1);
 let geodesic = new Cesium.EllipsoidGeodesic(startPosition1,endPosition1);
 //设置测地线的起点和终点
 // geodesic.setEndPoints(startPosition1, endPosition1);
 let distance1 = geodesic.surfaceDistance;//求地表距离,单位为米
 console.log("两点的地表距离:",distance1);

Cesium.Cartesian3.distanceSquared(left, right)

求两个向量之间距离的平方(注:两个向量)

  // 源码
  Cartesian3.subtract(left, right, distanceScratch);
  return Cartesian3.magnitudeSquared(distanceScratch);

Cesium.Cartesian3.angleBetween(left, right)

求两个向量的夹角文章来源地址https://www.toymoban.com/news/detail-689163.html

  Cartesian3.normalize(left, angleBetweenScratch);
  Cartesian3.normalize(right, angleBetweenScratch2);
  const cosine = Cartesian3.dot(angleBetweenScratch, angleBetweenScratch2);
  const sine = Cartesian3.magnitude(
    Cartesian3.cross(
      angleBetweenScratch,
      angleBetweenScratch2,
      angleBetweenScratch
    )
  );
  return Math.atan2(sine, cosine);

到了这里,关于Cesium中常用的一些数学计算(矩阵、向量)用法——向量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium屏幕中心、相机坐标和距离计算

    moveRotation方法参数中第一个参数step是移动步长,第二个参数i是判断是否是俯仰角还是航向角进行绕中心点进行翻滚,entity可以另外分离出来做一个方法,这样避免每次调用moveRotation方法都生成一个entity覆盖物。 该方法的参数distance接受正负数,对应上升和下降

    2024年01月18日
    浏览(42)
  • 【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向

    在Cesium的使用过程中,常常需要计算模型在移动过程中的朝向,除了可以利用位置信息让Cesium自动计算之外,还可以通过一些矩阵变换的方法控制模型的朝向,本篇文章笔者记录了自己计算模型朝向信息的方法,欢迎交流~ 大致思路是先根据模型的速度信息、位置信息,建立

    2024年02月12日
    浏览(53)
  • 前端VUE框架通过Cesium加载3dtiles,计算3dtiles的面积

    前端VUE框架通过Cesium加载3dtiles,计算3dtiles的面积完整代码 前端开发中,使用Vue框架可以帮助开发者更高效地开发复杂的Web应用程序,并且越来越多的项目开始集成三维地球数据可视化。Cesium是一个开源的JavaScript库,可以轻松地实现地球数据的可视化,同时支持3D场景的绘制

    2024年02月08日
    浏览(56)
  • Cesium 根据飞机航线计算飞机的Heading(偏航角)、Pitch(俯仰角)、Roll(翻滚角)

    设置飞机的一些坐标位置(经纬度高度),插值得到更多的坐标位置,然后飞机按照这些坐标集合形成的航线飞行,飞机的朝向、俯仰角以及飞机转弯时的翻转角根据坐标集合计算得出,而不需要手动设置heading、pitch、roll。 不知道为什么,可能是飞行速度变化太大,我用Cesiu

    2024年04月08日
    浏览(37)
  • 矩阵等价和向量组等价的一些问题

    什么是向量组? 答:向量组是由若干同维数的列向量(或同维数的行向量)组成的集合。 什么是向量组等价? 答:两个向量组,各自拼成矩阵A和B,向量组等价就是三秩相等,即r(A)=r(B)=r(A,B)。注意:下面的例子有行向量组怎么拼成矩阵的说明 什么是矩阵等价? 答:矩

    2024年02月05日
    浏览(38)
  • 数学_矩阵向量求导公式相关

    目录 一. 向量变元的实值标量函数  1、四个法则  2、几个公式 二. 矩阵变元的实值标量函数  1、四则运算  2、几个公式  求导公式 参考:矩阵分析与应用 张贤达 第五章 梯度分析和最优化 P271 本节 证明过程 参考:矩阵求导公式的数学推导(矩阵求导——基础篇) - 知乎

    2024年01月25日
    浏览(46)
  • 【考研数学】线形代数第三章——向量 | 3)向量秩的性质、向量空间、过渡矩阵

    紧接前文学习完向量组秩的基本概念后,继续往后学习向量的内容。 性质 1(三秩相等) —— 设 A = ( β 1 , β 2 , … , β n ) = ( α 1 , α 2 , … , α n ) T pmb{A=(beta_1,beta_2,dots,beta_n)=(alpha_1,alpha_2,dots,alpha_n)^T} A = ( β 1 ​ , β 2 ​ , … , β n ​ ) = ( α 1 ​ , α 2 ​ , … , α n ​ )

    2024年02月11日
    浏览(46)
  • 【考研数学】线形代数第三章——向量 | 3)向量组秩的性质、向量空间、过渡矩阵

    紧接前文学习完向量组秩的基本概念后,继续往后学习向量的内容。 性质 1(三秩相等) —— 设 A = ( β 1 , β 2 , … , β n ) = ( α 1 , α 2 , … , α n ) T pmb{A=(beta_1,beta_2,dots,beta_n)=(alpha_1,alpha_2,dots,alpha_n)^T} A = ( β 1 ​ , β 2 ​ , … , β n ​ ) = ( α 1 ​ , α 2 ​ , … , α n ​ )

    2024年02月09日
    浏览(53)
  • 【考研数学】矩阵、向量与线性方程组解的关系梳理与讨论

    两个原因让我想写这篇文章,一是做矩阵题目的时候就发现这三货经常绑在一起,让人想去探寻其中奥秘;另一就是今天学了向量组的秩,让我想起来了之前遗留下来的一个问题:到底存不存在系数矩阵的秩和增广矩阵的秩之差比 1 大的情况?可能这个问题有点抽象,不过看

    2024年02月11日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包