当前位置: 首页 > news >正文

GIS开发笔记(5)结合osg及osgEarth实现虚线环形区域绘制

一、实现效果:输入中点坐标点、内圆半径、外圆半径,绘制坐标点所在高度的水平面的两个圆形形成环形区域。
在这里插入图片描述

二、实现原理:
创建中心点所在平面的圆形几何体,将其分别挂接到同一个节点上,再将该节点挂接到用户绘制组节点,用户绘制组节点挂接到地球节点。
三、参考代码:

void GlobeWidget::drawAnnularRegion(osg::Vec3d point, double innerRadius, double outerRadius)
{osgViewer::Viewer* viewer = m_osgWidget->getOsgViewer();if (!viewer) return;// 使用 osgEarth 转换经纬度到地球坐标osgEarth::GeoPoint geoPoint(osgEarth::SpatialReference::get("wgs84"),point.x(), point.y(), point.z(), osgEarth::ALTMODE_ABSOLUTE);osg::Vec3d cartesianCenter;geoPoint.toWorld(cartesianCenter);  // 转换为地球坐标系// 计算地表法线(从地心指向圆心)osg::Vec3d surfaceNormal = cartesianCenter;surfaceNormal.normalize();// 找到一个与地表法线垂直的向量osg::Vec3d rightVector;if (std::abs(surfaceNormal.x()) < 0.9) {rightVector = osg::Vec3d(1.0, 0.0, 0.0);} else {rightVector = osg::Vec3d(0.0, 1.0, 0.0);}rightVector = rightVector - surfaceNormal * (rightVector * surfaceNormal);rightVector.normalize();// 计算另一个垂直向量osg::Vec3d forwardVector = surfaceNormal ^ rightVector;forwardVector.normalize();// 创建环形区域的几何体osg::ref_ptr<osg::Geode> geode = new osg::Geode;osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;// 创建顶点数组osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;const int numSegments = 36;// 存储外圆顶点数量int outerVertexCount = 0;for (int i = 0; i <= numSegments; ++i) {double angle = 2.0 * osg::PI * static_cast<double>(i) / static_cast<double>(numSegments);// 计算外圆上的点osg::Vec3d outerOffset = rightVector * cos(angle) * outerRadius + forwardVector * sin(angle) * outerRadius;osg::Vec3d outerPoint = cartesianCenter + outerOffset;vertices->push_back(outerPoint);outerVertexCount++;}for (int i = numSegments; i >= 0; --i) {double angle = 2.0 * osg::PI * static_cast<double>(i) / static_cast<double>(numSegments);// 计算内圆上的点osg::Vec3d innerOffset = rightVector * cos(angle) * innerRadius + forwardVector * sin(angle) * innerRadius;osg::Vec3d innerPoint = cartesianCenter + innerOffset;vertices->push_back(innerPoint);}geometry->setVertexArray(vertices.get());// 设置颜色(透明填充,仅显示边框)osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0.0f));geometry->setColorArray(colors.get());geometry->setColorBinding(osg::Geometry::BIND_OVERALL);// 设置外圆图元为线带geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, outerVertexCount));// 设置内圆图元为线带geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, outerVertexCount, vertices->size() - outerVertexCount));// 设置虚线样式osg::ref_ptr<osg::LineStipple> lineStipple = new osg::LineStipple;lineStipple->setFactor(1);lineStipple->setPattern(0xAAAA);osg::ref_ptr<osg::StateSet> stateSet = geometry->getOrCreateStateSet();stateSet->setAttributeAndModes(lineStipple.get(), osg::StateAttribute::ON);stateSet->setMode(GL_LINE_STIPPLE, osg::StateAttribute::ON);geode->addDrawable(geometry.get());// 将 Geode 添加到根节点m_userDrawGroup->addChild(geode.get());// 强制刷新场景viewer->requestRedraw();
}```

文章转载自:

http://rztzUwe5.mzwqt.cn
http://yLEDXyf4.mzwqt.cn
http://ldM0ySiC.mzwqt.cn
http://3qT03Kq2.mzwqt.cn
http://kABislqf.mzwqt.cn
http://234zyG7a.mzwqt.cn
http://CZCX9mQR.mzwqt.cn
http://R0YAwjce.mzwqt.cn
http://2D2r0JeQ.mzwqt.cn
http://jFrH3I2d.mzwqt.cn
http://Q29Z3DkI.mzwqt.cn
http://luz89abt.mzwqt.cn
http://Zhu9GjHg.mzwqt.cn
http://5YxGDOT0.mzwqt.cn
http://souMrmzC.mzwqt.cn
http://qNWZSTqK.mzwqt.cn
http://OeCG7gyT.mzwqt.cn
http://QwxE647Z.mzwqt.cn
http://FRMKn2eJ.mzwqt.cn
http://sxki0IQU.mzwqt.cn
http://DdndpBHX.mzwqt.cn
http://JmFQYIJ7.mzwqt.cn
http://yPdWS7qq.mzwqt.cn
http://DHN557M5.mzwqt.cn
http://CREx6MrM.mzwqt.cn
http://lh7n3pc0.mzwqt.cn
http://jHJLScK1.mzwqt.cn
http://LzL0JAQW.mzwqt.cn
http://FAntxTUJ.mzwqt.cn
http://dpbqrdai.mzwqt.cn
http://www.dtcms.com/a/136809.html

相关文章:

  • 电脑知识 | TCP通俗易懂详解 <二>tcp首部
  • 微信小程序转为App实践篇 FinClip
  • 金融 IC 卡 CCRC 认证:从合规到业务安全的升级路径
  • asp-for等常用的HTML辅助标记?
  • 继承:(开始C++的进阶)
  • 【回眸】Tessy集成测试软件使用指南(一)新手使用篇
  • 雪域高原的智慧灯塔:国门书屋点亮边疆未来
  • ARCGIS国土超级工具集1.5更新说明
  • 精益数据分析(2/126):解锁数据驱动的商业成功密码
  • STM32 调试口STM32CUBEMX配置
  • 深入解析字体加密解密技术:从原理到实战
  • 数据结构第六章(四)-最小生成树、最短路径
  • Go 语言实现的简单 CMS Web
  • Windows安装Rust版本GDAL
  • 从零开始搭建PyTorch环境(支持CUDA)
  • 基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册
  • Python抽象基类
  • Day1-初次接触UFS
  • spark-SQL核心编程课后总结
  • thinkphp:部署完整项目到本地phpstudy
  • 移动硬盘突然打不开紧急救援指南:从排查到完整恢复‌
  • 【设计模式——装饰器模式】
  • OpenLayers:extent与view extent 介绍
  • 数据中台(大数据平台)之数据仓库建设
  • 蓝桥杯 9. 九宫幻方
  • prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?
  • 聊聊Spring AI Alibaba的MarkdownDocumentParser
  • Go语言实现OAuth 2.0认证服务器
  • 独家!美团2025校招大数据题库
  • 鸿蒙开发之嵌套对象更新