Mesh 网格曲面栅格化

news2024/9/25 7:13:22

Mesh 网格曲面栅格化

使用CGAL将地形曲面网格体栅格化。

Code

#include<iostream>
#include<cmath>

#include<CGAL/Surface_mesh.h>
#include<CGAL/Surface_mesh/IO/PLY.h>

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_xy_3.h>
#include <CGAL/Delaunay_triangulation_2.h>

#include <CGAL/Polygon_mesh_processing/locate.h>

#include "include/Color_ramp.h"

using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Projection_traits = CGAL::Projection_traits_xy_3<Kernel>;
using Point_2 = Kernel::Point_2;
using Point_3 = Kernel::Point_3;

// Triangulated Irregular Network
using TIN = CGAL::Delaunay_triangulation_2<Projection_traits>;
using Mesh = CGAL::Surface_mesh<Point_3>;

int main(){
   //读取网格曲面
    Mesh mesh;
    CGAL::IO::read_PLY("test.ply",mesh);
    // 计算包围盒
    CGAL::Bbox_3 bbox = CGAL::bbox_3(mesh.points().begin(), mesh.points().end());
    std::cout << "with:" << bbox.x_span() << "\nheight:" << bbox.y_span() << std::endl;
    int width = std::ceil(bbox.x_span());
    int height = std::ceil(bbox.y_span());
    width = std::max(width, height);
    height = width;
    // 构建Delaunay_triangulation 三角网
    TIN tin (mesh.points().begin(), mesh.points().end());
    TIN::Face_handle location;

    // Use PPM format (Portable PixMap) for simplicity
    std::ofstream raster_ofile("raster.ppm", std::ios_base::binary);
    // PPM header
    raster_ofile << "P6" << std::endl // magic number
        << width << " " << height << std::endl // dimensions of the image
        << 255 << std::endl; // maximum color value
    // Use rainbow color ramp output
    Color_ramp color_ramp;
    //查询并插值,使用三角形重心插值
    for (std::size_t y = 0; y < height; ++y)
        for (std::size_t x = 0; x < width; ++x)
        {
            Point_3 query(bbox.xmin() + x * (bbox.xmax() - bbox.xmin()) / double(width),
                bbox.ymin() + (height - y) * (bbox.ymax() - bbox.ymin()) / double(height),
                0); // not relevant for location in 2D
            location = tin.locate(query, location);
            // Points outside the convex hull will be colored black
            std::array<unsigned char, 3> colors { 0, 0, 0 };
            // 查询到网格点所在三角形面
            if (!tin.is_infinite(location))
            {
                std::array<double, 3> barycentric_coordinates
                    = CGAL::Polygon_mesh_processing::barycentric_coordinates
                    (Point_2(location->vertex(0)->point().x(), location->vertex(0)->point().y()),
                        Point_2(location->vertex(1)->point().x(), location->vertex(1)->point().y()),
                        Point_2(location->vertex(2)->point().x(), location->vertex(2)->point().y()),
                        Point_2(query.x(), query.y()),
                        Kernel());
                  // 插值
                double height_at_query
                    = (barycentric_coordinates[0] * location->vertex(0)->point().z()
                        + barycentric_coordinates[1] * location->vertex(1)->point().z()
                        + barycentric_coordinates[2] * location->vertex(2)->point().z());
                // Color ramp generates a color depending on a value from 0 to 1
                // 高程值映射(拉伸或缩放)
                double height_ratio = (height_at_query - bbox.zmin()) / (bbox.zmax() - bbox.zmin());
                height_ratio = height_ratio > 1.0 ? 1.0 : height_ratio;
                colors = color_ramp.get(height_ratio);
            }
            //写入映射后的RGB
            raster_ofile.write(reinterpret_cast<char*>(&colors), 3);
        }
    raster_ofile.close();
    return 0;
}

构建

cmake_minimum_required(VERSION 3.1...3.23)
project(main)
find_package(CGAL REQUIRED)
create_single_source_cgal_program("main.cpp")
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=D:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build build --config Debug

Result

网格体
在这里插入图片描述
栅格化符号化结果:红色->黄色->绿色->蓝色->白色(高程值递减)
在这里插入图片描述

反过程

在这里插入图片描述
在这里插入图片描述

参考及相关链接

  1. https://blog.csdn.net/mrbaolong/article/details/137610742
  2. https://doc.cgal.org/latest/Manual/tuto_gis.html
  3. stl2png-Mesh转栅格
  4. 高度栅格图转网格体Mesh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Masscan扫描器进行信息搜集

Masscan 是一款极为高效的端口扫描工具&#xff0c;以其卓越的扫描速度和大规模扫描能力而著称。该工具不仅支持 TCP 和 UDP 协议的扫描&#xff0c;还允许用户根据需求灵活指定多个目标和端口。Masscan 通过采用先进的网络性能优化技术&#xff0c;充分利用操作系统的资源和多…

更轻量级的性能测试工具—Apache Bench

之前一直使用的Jmeter进行接口性能测试&#xff0c;但是AB工具是很轻量级、快速开箱即用的。 yum安装 yum install -y httpd-tools 安装完成后&#xff0c;通过 ab -V 命令验证安装情况&#xff0c;如下表示安装成功 通过如下命令可以查看如何使用AB工具: 模拟请求示例&am…

在编程学习中,如何有效地管理时间和避免拖延?

在编程学习中&#xff0c;有效的时间管理和避免拖延是成功的关键因素。以下是一些实用的策略&#xff1a; 1. 明确目标 设定清晰的学习目标&#xff0c;了解你想要达成的技能水平。目标要具体、可衡量、可实现、相关性强、时限性&#xff08;SMART&#xff09;。 2. 制定计划…

19.神经网络 - 线性层及其他层介绍

神经网络 - 线性层及其他层介绍 1.批标准化层–归一化层&#xff08;不难&#xff0c;自学看官方文档&#xff09; Normalization Layers torch.nn — PyTorch 1.10 documentation BatchNorm2d — PyTorch 1.10 documentation 对输入采用Batch Normalization&#xff0c;可…

[AI]从零开始的so-vits-svc webui部署教程(小白向)

一、本次教程是给谁的&#xff1f; 如果你点进了这篇教程&#xff0c;相信你已经知道so-vits-svc是什么了&#xff0c;那么我们这里就不过多讲述了。如果你还不知道so-vits-svc能做什么&#xff0c;可以去b站搜索一下&#xff0c;你大概率会搜索到一些AI合成的音乐&#xff0c;…

SQL 注入之 WAF 绕过

在当今的网络安全环境中&#xff0c;SQL 注入攻击一直是一个严重的威胁&#xff0c;而 Web 应用防火墙&#xff08;WAF&#xff09;则是抵御此类攻击的重要防线。然而&#xff0c;攻击者们不断探索各种方法来绕过 WAF&#xff0c;以实现他们的恶意目的。本文将深入探讨 SQL 注入…

深度学习系列73:使用rapidStructure进行版面分析

1. 概述 项目地址https://github.com/RapidAI/RapidStructure?tabreadme-ov-file 2. 文档方向分类示例 安装$ pip install rapid-orientation import cv2 from rapid_orientation import RapidOrientation orientation_engine RapidOrientation() img cv2.imread(test_im…

SpringAOP-概述+配置文件的形式实现

2.1AOP概述 什么是AOP? AOP全称Aspect Oriented Programming&#xff0c;翻译过来就是&#xff1a;面向切面编程。 AOP是一种编程的规范AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范通过预编译方式或者运行期动态代理实…

投资组合理论中的资本资产定价模型(CAPM)和套利定价理论(APT)的实现案例

一&#xff1a;资本资产定价模型&#xff08;CAPM&#xff09; 资本资产定价模型&#xff08;Capital Asset Pricing Model&#xff0c;简称CAPM&#xff09;是金融学中一个重要的理论模型&#xff0c;用于估算一个投资的预期回报率&#xff0c;并确定投资的风险与预期回报之间…

前端面试题每日一练,测测你对JavaScript生成器和 Array.from 的理解

今天的挑战题目涉及到JavaScript中的生成器函数 (Generator) 和 Array.from 方法的结合使用。我们将利用生成器生成斐波那契数列&#xff0c;并通过 Array.from 创建一个包含前几个斐波那契数的数组。让我们一步步解析这段代码&#xff0c;看看它会输出什么以及为什么。 代码解…

抽奖系统PHP源码开源二开版带完整后台

该程序可以作为活动氛围活动气氛的烘托作用&#xff0c;活动游戏而已&#xff01; 抽奖系统源码是一个以php MySQL进行开发的手机抽奖系统源码。用途&#xff1a;适合做推广营销、直播、粉丝抽奖。 功能介绍&#xff1a; 1、后台可以设置每个抽奖用户的抽奖次数,后台添加设置…

四川财谷通信息技术有限公司引领抖音小店新风尚

在当今这个数字化时代&#xff0c;电子商务的浪潮以前所未有的速度席卷全球&#xff0c;而短视频平台抖音凭借其庞大的用户基数和强大的流量变现能力&#xff0c;成为了众多商家竞相入驻的新蓝海。在这片充满机遇与挑战的海洋中&#xff0c;四川财谷通信息技术有限公司以其敏锐…

模型 福格行为

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。BMAP 1 福格行为的应用 1.1 基于福格行为模型的儿童教育应用设计 随着移动互联网的普及&#xff0c;儿童教育应用迅速发展&#xff0c;如何设计出既吸引儿童又能积极促进学习的教育应用成为设计者关…

景芯SoC A72实战反馈

先说结论&#xff1a; 内容非常全面&#xff0c;讲解到位&#xff0c;会有专门的工程师一对一答疑&#xff0c;整个项目跑下来提升非常大&#xff0c;绝对物超所值&#xff01; 一些细节&#xff1a; 本人微电子专业研一在读&#xff0c;有过两次简单的数字芯片流片经历&…

IO进程day04(进程)

目录 进程 1》什么是进程 1> 概念 2> 特点 3> 进程段 4> 进程分类 5> 进程状态 6> 进程状态切换图 7> 进程相关命令 <补充>优先级调度 2》进程函数接口 1> 创建进程 fork() 2> 回收资源 3> 结束进程 4> 获取进程号 3》exe…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 08网络自动化

云原生数据中心和老一代数据中心不同之处在于其核心概念是聚焦于高效运营。网络自动化就是达到此目标的关键因素。 要达到此目的&#xff0c;本章要解决诸如下述的一些问题&#xff1a; 什么是网络自动化以及为什么我们在乎它?为了学习网络自动化&#xff0c;我需要学习编程…

栈OJ题——栈的压入、弹出序列

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 栈的压入、弹出序列 题目描述&#xff1a;给定两个整型数组&#xff0c;判断数组2是否是数组1的某一个出栈顺序。该题默认可以边入栈边出栈。 二、解题思路 三、解题代码 但是&#xff0c;上述解题代码中还存在一…

HCIP第一天作业

要求&#xff1a;R1-R2-R3-R4-R5 RIP 100 运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1-R2之间增…

Echarts栅格进度条装饰实现

如下图&#xff0c;如果你的业务需要这么一个饼图&#xff0c;你单纯借助echarts是实现不了如图效果的&#xff0c;你需要借助dom操作&#xff0c;合svg的配合才能实现。 首先饼图部分结束echarts,实现以及通过配置实现你想要的效果。 中间的文字百分比计算需要自己计算&#…

springboot3.x入门系列【5】支持unix sock 套接字服务

目录 一、简介 二、springBoot3.x 套接字的支持 1. 环境要求 2. springboot内置tomcat 2.1 支持unix 设置 unixDomainSocketPath 2.2 windows 下unix服务测试 3. springboot外置tomcat 3.1 tomcat 配置unix socket 套接字 3.2 启动tomcat 服务 3.3 nginx 支持unix…