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

房地产公司网站下载wordpress能开发app

房地产公司网站下载,wordpress能开发app,建站智能模板,网络系统工程设计是干什么的本节我们分享点云的投影计算,按直线 → 平面 → 圆柱 → 球面顺序介绍。其实无论投影到哪种几何基元,都遵循“三步走”:① 读取或生成点云 → ② 计算每个点在目标几何体上的最近点 → ③ 用最近点坐标替换原坐标并可视化。下面分别给出四种算…

        本节我们分享点云的投影计算,按直线 → 平面 → 圆柱 → 球面顺序介绍。其实无论投影到哪种几何基元,都遵循“三步走”:① 读取或生成点云 → ② 计算每个点在目标几何体上的最近点 → ③ 用最近点坐标替换原坐标并可视化。
下面分别给出四种算法的具体做法。

1、投影到直线

目标
把点云 P = {pᵢ} 压到一条无限长直线上,得到新的点云 P′ = {p′ᵢ},其中 p′ᵢpᵢ 到直线的正交投影。

输入

  • 直线方向向量 d(单位化)

  • 直线上任意一点 o

算法

  1. 读取点云 P

  2. 对每个点 pᵢ 计算参数 tᵢ = (pᵢ − o)·d

  3. 投影点 p_{i}{}'= o + tᵢ d

  4. p_{i}{}'更新 P

  5. 使用 Open3D 的 draw_geometries 可视化。


2、投影到平面

目标
P 正交投影到给定平面。

输入

  • 平面法向量 n(单位化)

  • 平面上任意一点 o

算法

  1. 读取点云 P

  2. 对每个点 pᵢ 计算有符号距离 dᵢ = (pᵢ − o)·n

  3. 投影点 p_{i}{}'= pᵢ − dᵢ n

  4. p_{i}{}'更新 P

  5. 可视化。


3、投影到圆柱面

目标
P 投影到半径为 r、轴线已知的圆柱面上。

输入

  • 圆柱轴线方向向量 d(单位化)

  • 轴线上任意一点 o

  • 半径 r

算法

  1. 读取点云 P

  2. 对每个点 pᵢ
    ① 计算到轴线的最近点 qᵢ = o + ((pᵢ − o)·d) d
    ② 计算离轴距离向量 vᵢ = pᵢ − qᵢ
    ③ 归一化 uᵢ = vᵢ / ‖vᵢ‖(若 ‖vᵢ‖ = 0 可任取正交于 d 的单位向量);
    ④ 圆柱表面点 p_{i}{}'= qᵢ + r uᵢ

  3. p_{i}{}'更新 P

  4. 可视化。


4、投影到球面

目标
P 投影到以 c 为中心、半径 R 的球面上。

输入

  • 球心 c

  • 半径 R

算法

  1. 读取点云 P

  2. 对每个点 pᵢ
    ① 计算方向向量 vᵢ = pᵢ − c
    ② 归一化 uᵢ = vᵢ / ‖vᵢ‖
    ③ 球面点 p′ᵢ = c + R uᵢ

  3. p′ᵢ 更新 P

  4. 可视化。

当然,本次使用的数据依然是兔砸,闪亮登场:

一、四种投影程序

import open3d as o3d
import numpy as np
import os# -------------------------------------------------
# 基础工具
# -------------------------------------------------
def load_pcd(name):pcd = o3d.io.read_point_cloud(name)if pcd.is_empty():raise RuntimeError(f"找不到或无法读取 {name}")return pcddef save_pcd(pcd, src_name, suffix):out = src_name.replace(".pcd", f"_proj_{suffix}.pcd")o3d.io.write_point_cloud(out, pcd, print_progress=False)print(f"已保存:{out}")def view(pcd, title):o3d.visualization.draw_geometries([pcd], window_name=title, width=900, height=700, left=50, top=50)# -------------------------------------------------
# 四种投影实现
# -------------------------------------------------
def proj_line(pcd, line_p, line_d):pts = np.asarray(pcd.points)d = line_d / np.linalg.norm(line_d)t = ((pts - line_p) @ d)[:, None]proj = line_p + t * dnew = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(proj))if pcd.has_colors():new.colors = pcd.colorsreturn newdef proj_plane(pcd, coeffs):A, B, C, D = coeffsn = np.array([A, B, C], dtype=float)n = n / np.linalg.norm(n)pts = np.asarray(pcd.points)dist = (pts @ n + D)[:, None]proj = pts - dist * nnew = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(proj))if pcd.has_colors():new.colors = pcd.colorsreturn newdef proj_cylinder(pcd, axis_p, axis_d, radius):pts = np.asarray(pcd.points)d = axis_d / np.linalg.norm(axis_d)vec = pts - axis_pt = (vec @ d)[:, None]axis_proj = axis_p + t * dradial = pts - axis_projnorms = np.linalg.norm(radial, axis=1, keepdims=True)norms[norms == 0] = 1surf = axis_proj + radius * radial / normsnew = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(surf))if pcd.has_colors():new.colors = pcd.colorsreturn newdef proj_sphere(pcd, center, radius):pts = np.asarray(pcd.points)vec = pts - centernorms = np.linalg.norm(vec, axis=1, keepdims=True)norms[norms == 0] = 1surf = center + radius * vec / normsnew = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(surf))if pcd.has_colors():new.colors = pcd.colorsreturn new# -------------------------------------------------
# 主流程
# -------------------------------------------------
def main():src_file = "E:/CSDN/规则点云/bunny.pcd"if not os.path.isfile(src_file):print("请确保点云存在!")returnpcd = load_pcd(src_file)print(f"已加载 {src_file},共 {len(pcd.points)} 点")# 1) 直线line_p = np.array([0., 0., 0.])line_d = np.array([1., 1., 1.])line_proj = proj_line(pcd, line_p, line_d)# save_pcd(line_proj, src_file, "line")view(line_proj, "投影到直线")# 2) 平面(示例:x+2y+3z+4=0)plane_coeff = [1, 2, 3, 4]plane_proj = proj_plane(pcd, plane_coeff)# save_pcd(plane_proj, src_file, "plane")view(plane_proj, "投影到平面")# 3) 圆柱(Z轴,半径 2.5)axis_p = np.array([0., 0., 0.])axis_d = np.array([0., 0., 1.])radius = 2.5cyl_proj = proj_cylinder(pcd, axis_p, axis_d, radius)# save_pcd(cyl_proj, src_file, "cylinder")view(cyl_proj, "投影到圆柱")# 4) 球(原点,半径 1)center = np.array([0., 0., 0.])sphere_r = 1.0sphere_proj = proj_sphere(pcd, center, sphere_r)# save_pcd(sphere_proj, src_file, "sphere")view(sphere_proj, "投影到球面")print("全部完成!")if __name__ == "__main__":main()

二、四种投影结果

        可以看到,兔砸分别被投影到了直线、平面、圆柱和球面上。当然,根据参数的不同,最后显示的不同,有兴趣的同学可以调节参数试一试。

就酱,下次见^-^

http://www.dtcms.com/a/471740.html

相关文章:

  • Codeforces Beta Round 6 C - Alice, Bob and Chocolate
  • 工业大数据处理分析技术
  • 临武县网站建设专业网络推广方案xiala11
  • 河北省 建设执业注册中心网站上海网站企业
  • 搜索引擎优化网站版面设计图大全简单又漂亮
  • 网站建设的财务分险游戏制作专业
  • 政务网站集约化建设难点与建议wordpress首页修改无效
  • 制作网站平台wordpress 文章列表只显示标题
  • 永川区门户网站建设轨迹免费装修设计软件
  • Python第十二节 装饰器使用详解及注意事项
  • 传媒类网站模板做网站怎么赚流量
  • 网站建设 技术方案模板wordpress 外国主机
  • 惠州市博罗县建设局网站双线网站选服务器
  • spring ai用法
  • linux系统服务器怎么做网站外贸网站建设注意事项
  • c做网站教程哈尔滨学网页设计
  • 什么网站是专门做艺术字的网站一定要备案
  • 二手房网站排行屯济宁做网站公司
  • 内存频率重要吗?对游戏影响大不大?玖合异刃DDR5 8000Mhz评测
  • mem 设备控制 GPIO - C程序通过sysfs文件系统使用GPIO中断
  • 简约风格装修seo排名如何
  • 有关使用AVX,EIGEN等加速方法过程中cmake选项的说明
  • 二手书交易网站开发背景WordPress发邮件4.4.1
  • 【项目开发Trip第2站】casbin库与身份权限划分
  • POET 宣布投资7500万美元
  • wordpress底部插件郑州seo顾问热狗网
  • 韩国网站免费模板美丽定制 网站模板
  • 栾城网站制作产品推广策划案
  • 如何做网站联盟营销网站设计中的js
  • Wazuh vs. 安全洋葱:开源SOC核心平台用哪个呢?