计算直线与WGS84椭球的交点
计算 直线
2023-09-11 14:15:24 时间
/************************************************************************/ /*线段与WGS84椭球求交 x^2/a^2+y^2/a^2+z^2/b^2=1 (x-x0)/m=(y-y0)/n=(z-z0)/p=t m=x1-x0 n=y1-y0 p=z1-z0 p0线段起始点 p1线段终点 center椭球球心 a = osg::WGS_84_RADIUS_EQUATOR;//长轴 b = osg::WGS_84_RADIUS_POLAR;//短轴 /************************************************************************/ osg::Vec3d lineSegment_WGS84Ellipsoid_intersection(osg::Vec3d p0, osg::Vec3d p1, osg::Vec3d center=osg::Vec3d(), double a = osg::WGS_84_RADIUS_EQUATOR, double b = osg::WGS_84_RADIUS_POLAR) { double x0 = p0.x(), y0 = p0.y(), z0 = p0.z(); double x1 = p1.x(), y1 = p1.y(), z1 = p1.z(); double cx = center.x(), cy = center.y(), cz = center.z(); double m = x1 - x0, n = y1 - y0, p = z1 - z0; double A = (m*m + n*n) / (a*a) + p*p / (b*b); double B = 2 * ((m*(x0 - cx) + n*(y0 - cy)) / (a*a) + p*(z0 - cz) / (b*b)); double C = ((x0 - cx)*(x0 - cx) + (y0 - cy)*(y0 - cy)) / (a*a) + (z0 - cz)*(z0 - cz) / (b*b) - 1; double test = B*B - 4.0*A*C; if (test >= 0.0) { double t0 = (-B - sqrt(test)) / (2.0 * A); double t1 = (-B + sqrt(test)) / (2.0 * A); osg::Vec3d lineNormal(m, n, p); // 其实有两个解,根据你的需要选择t0还是t1。 osg::Vec3d hitp = lineNormal*t0 + p0; return hitp; } return osg::Vec3d(0, 0, 0); }
相关文章
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
- 洛谷P1028 数的计算
- 说说这些年做的云计算和大数据项目
- 科技云报道:110岁的IBM云计算再退一城,廉颇老矣尚能饭否?
- C#,数值计算(Numerical Recipes in C#),线性代数方程的求解,LU分解(LU Decomposition)源程序
- IT专业人士都没有理解的云计算,你理解了吗?
- 什么是程序员?程序员的工作就是让电脑快速,自动化完成一些日常需要人为去做的一些重复有重复,反复又反复的工作。尤其是一些需要算法的,需要大量计算的,更需要程序的介入。
- 《Storm分布式实时计算模式》——2.1 Storm集群的框架
- Python通用函数实现数组计算
- Java小白入门200例22之计算数字的幂
- 广元云计算大数据中心项目启动
- 为什么物联网与云计算是天作之合
- 图像相似性度量——互信息计算Matlab实现