计算 3D 网格的体积

2024-02-13

我厌倦了计算 3D 物体(立方体、圆柱体...)的体积,有人可以帮忙吗

有这个问题吗?问题是,如何计算物体的体积

基于三角形的坐标。我的班级做得不好,有人能帮我吗

提高班级水平 ?

thanks

public class Algorithm
{
    private  Mesh _mesh { get; set; }

    public Algorithm(Mesh mesh)
    {
        _mesh = mesh;
    }

    private double SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3)
    {
        var v321 = p3.X * p2.Y * p1.Z;
        var v231 = p2.X * p3.Y * p1.Z;
        var v312 = p3.X * p1.Y * p2.Z;
        var v132 = p1.X * p3.Y * p2.Z;
        var v213 = p2.X * p1.Y * p3.Z;
        var v123 = p1.X * p2.Y * p3.Z;
        return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);
    }

    public double VolumeOfMesh()
    {
        double volume = 0.0;

        Vector3[] vertices = _mesh.Vertices;
        int[] triangles = _mesh.Triangles;

        for (int i = 0; i < _mesh.Triangles.Length; i += 3)
        {
            Vector3 p1 = vertices[triangles[i + 0]];
            Vector3 p2 = vertices[triangles[i + 1]];
            Vector3 p3 = vertices[triangles[i + 2]];

            volume += SignedVolumeOfTriangle(p1, p2, p3);
        }

        return Math.Abs(volume);
    }
}



public  class Mesh
{
    public Mesh(Vector3[] _vertices,int[] _triangles)
    {
        Vertices = _vertices;
        Triangles = _triangles;
    }

    public Vector3[] Vertices { get; set; }

    public int[] Triangles { get; set; }
}


public class Vector3
{
    public Vector3()
    {

    }

    public Vector3(double x,double y,double z)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public double X { get; set; }

    public double Y { get; set; }

    public double Z { get; set; }
}



private void button1_Click(object sender, EventArgs e)
{
        Vector3[] vers = new Vector3[8] {
                                    new Vector3 {X = 5,Y = 5,Z =5},
                                    new Vector3 {X = 15,Y = 5,Z =5},
                                    new Vector3 {X = 15,Y = 15,Z =5},
                                    new Vector3 {X = 5,Y = 15,Z =5},
                                    new Vector3 {X = 5,Y = 5,Z =15},
                                    new Vector3 {X = 15,Y = 5,Z =15},
                                    new Vector3 {X = 15,Y = 15,Z =15},
                                    new Vector3 {X = 5,Y = 15,Z =15},
        };

        int[] trs = new int[36] { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 
                                  1, 6, 2, 1, 5, 6, 0, 4, 7, 0, 7, 3,
                                  0, 1, 5, 0, 5, 4, 3, 2, 6,3, 6, 7 };


        Mesh mesh = new Mesh(vers, trs);
        Algorithm algo = new Algorithm(mesh);
        var vol = algo.VolumeOfMesh();

        MessageBox.Show(vol.ToString());
}

我的测试结果是vol = 666,666,但它应该是1000。


线路

double v132 = (p3.X - basePoint.X) * (p3.Y - basePoint.Y) * (p2.Z - basePoint.Z);

根据不正确如何计算表面由三角形组成的 3D 网格对象的体积 https://stackoverflow.com/questions/1406029/how-to-calculate-the-volume-of-a-3d-mesh-object-the-surface-of-which-is-made-up-t它应该是(注意 p1.X 而不是 p3.X):

var v132 = p1.X*p3.Y*p2.Z;

EDIT

尽管您将此答案标记为正确,但我测试了代码并发现了更多错误。

通过调整三角形索引,三角形并不全部朝外(或朝内):

0, 1, 2,
0, 2, 3,
4, 6, 5,
4, 7, 6,// adjusted
1, 6, 2,
1, 5, 6,
0, 7, 4,// adjusted
0, 3, 7,// adjusted
0, 5, 1,// adjusted
0, 4, 5,// adjusted
3, 2, 6,
3, 6, 7

所有法线均朝外。然后计算返回 -1000 负值,具体取决于基本偏移量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 3D 网格的体积 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • Android的RelativeLayout和wrap_content的高度?

    我正在尝试选择 ListActivity 类似于用于向启动器屏幕添加快捷方式的选择 我已经滚动了自己的页眉和页脚 我希望在屏幕上时将其 粘在 视图的顶部和底部 为了做到这一点 我使用了RelativeLayout 将标题设置为停靠在顶部 将
  • 如何创建隐藏多层向量并将其公开为单个范围的 Boost.Range?

    我有一个无法修改的遗留类层次结构 由于外部库的要求 我需要为 Line 和 Ring 定义 Boost Range 其中两者仅在单次运行中公开点 即 对于 Line 和 Ring 它应该是点的 Boost Range 伪代码来说明 Line
  • 使用 jQuery 循环并获取 JSON 数组的键/值对

    我希望循环遍历 JSON 数组并显示键和值 它应该是以下帖子的简化版本 但我似乎语法不正确 带有 JSON 数组的 jQuery each 循环 https stackoverflow com questions 3030321 jquer
  • MySql.Data.MySqlClient.MySqlConnection.Open() 花费很长时间

    我有一个 mvc net4 网站 连接到 mysql 在页面加载时我运行一个查询 这是不可避免的 MySql Data MySqlClient MySqlConnection Open 最坏情况下打开速度非常慢 需要 15 秒 仅当我长时间
  • 如何使用带有 DLL 的 Automation Anywhere 在 SAP 中获取带有属性的 IDObject?

    我正在使用 Automation Anywhere 本身提供的 SAP DLL 在 SAP with Automation Anywhere 上开发自动化流程 我需要找到具有指定属性的 IDObject 来单击 获取指定元素的值 但似乎没有
  • 如何在 Xcode 项目中启用或禁用特定库或 SDK 的位码

    我的项目中有很多外部库和 SDK 而且有些不支持bitcode 所以我必须禁用bitcode 但有些图书馆喜欢解析崩溃报告 确实需要它来表示崩溃报告 我想禁用和启用bitcode对于特定的库 我怎样才能做到这一点 有可能吗 Thanks 你
  • 无法从 Java 中的 cookie 获取值。值包含逗号。

    我在从包含逗号的 cookie 中获取值时遇到问题 它返回的不是完整字符串 而是被截断到第一个逗号的字符串 例如 cookie value var1 var2 var3 String cookieVal cookie getValue co
  • 在一列数字中,找到最接近某个目标值的值

    假设我在列中有一些数字数据 例如 11 100000 36 829657 6 101642 11 400000 36 402069 5 731998 11 700000 35 953025 5 372652 12 000000 35 482
  • SyndicateFeed 将命名空间前缀从 a10 更改为atom

    我正在使用 System ServiceModel Synmination SynspirationFeed 创建一个 rss 提要 从中我得到以下内容
  • 具有多个资源的 Kubernetes 应用程序单个 YAML

    目前我使用 docker compose 来安排我的应用程序 该应用程序由 3 个 dockerimages 一个 postgresql 数据库和 2 个 Wildfly 应用程序服务器 前端 ui 后端 组成 My docker comp
  • jquery Draggable:如何限制可拖动区域?

    我有一个可拖动的对象 div 和一些可放置的对象 表TD 我希望用户将我的可拖动对象拖动到这些可放置 TD 之一 我以这种方式启用可拖动和可放置 draggable draggable droppable droppable 问题是 用户可
  • C++ 中的静态全局变量

    我想通过 malloc 方法创建一个整数数组 我希望这个数组是全局的并且可以在我的程序中的任何地方使用 我将代码放入一个头文件中 如下所示 static int pieces 然后我有一个函数可以用我想要的数字填充它 该函数位于命名空间中
  • 链接到网页的特定部分

    如何创建指向我无法控制的另一个网站上的长网页的一部分的链接 我认为您可以在链接末尾使用 partofpage 的变体 有什么建议么 只需附加一个 随后是该人的 ID a 标签 或其他 HTML 标签 例如 section 你想要达到的目标
  • 聚合物和 PHP

    你好 我刚刚开始学习聚合物 我使用 PHP 收集数据如下 我可以将其嵌入到 DIV 中并显示一些数据 但我想将这段代码放入带有我可以导入的参数的 Polymer 元素中 并将 json 数据也放入我可以用来填充页面的外部 Polymer 元
  • Enterprise Library 5.0 和命令超时

    我正在使用以下代码 想知道如果使用企业库的CreateSprocAccessor 我们是否需要设置命令超时 如果不需要 那么如何管理超时 var accessor sqlDatabase CreateSprocAccessor
  • this.$http vueJs 未设置

    我正在玩 vueJS 并尝试从 ajax 请求中获取一些数据 这是我的代码 new Vue el recipeList ready function this fetchRecipes methods fetchRecipes functi
  • 在 Pandas 中将rolling_apply 与需要 2 个参数的函数一起使用

    我正在尝试将 rollapply 与需要 2 个参数的公式一起使用 据我所知 计算 kendall tau 相关性 包括标准平局校正 的唯一方法 除非您从头开始创建公式 是 gt gt gt import scipy gt gt gt x
  • C++ 遗传算法的最佳数据结构?

    我需要实现一个针对我的问题 大学项目 定制的遗传算法 第一个版本将其编码为短矩阵 每条染色体的位数x人口大小 这是一个糟糕的设计 因为我声明了一个短路 但仅使用 0 和 1 值 但这只是一个原型 并且按预期工作 现在是时候开发一个新的了 改
  • 用于计算上下文无关语法的 FIRST 和 FOLLOW 集的算法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一种算法来计算语法的 FIRST 和 FOLLOW 集 是否有一个简单的算法或简单的代码来计算这些 大多数编译器教科书和解析算法
  • 计算 3D 网格的体积

    我厌倦了计算 3D 物体 立方体 圆柱体 的体积 有人可以帮忙吗 有这个问题吗 问题是 如何计算物体的体积 基于三角形的坐标 我的班级做得不好 有人能帮我吗 提高班级水平 thanks public class Algorithm priv