精华内容
下载资源
问答
  • 最近项目需要对不规则物体的体积与面积进行计算,查阅了很多资料都没有进展,有的说用微积分的也有用VTK的感觉这些都很麻烦而且没有具体明确的思路,今天看到一篇相关资料感觉很简单易懂而切也很实用。 代码如下:...

         最近项目需要对不规则物体的体积与面积进行计算,查阅了很多资料都没有进展,有的说用微积分的也有用VTK的感觉这些都很麻烦而且没有具体明确的思路,今天看到一篇相关资料感觉很简单易懂而切也很实用。

        代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    [RequireComponent(typeof(MeshFilter))]
    public class MeshCalculator : MonoBehaviour
    {
        private MeshFilter mf = null;
        private Vector3 scale;
        private float sum;
        private string sum1;

        // Use this for initialization
        void Start()
        {
            this.mf = this.GetComponent<MeshFilter>();
            //有损缩放
            this.scale = this.transform.lossyScale;
            this.CalculateSumArea();
            this.CalculateSumVolume();
        }
        private void CalculateSumVolume()
        {
            Vector3[] arrVertices = this.mf.mesh.vertices;
            int[] arrTriangles = this.mf.mesh.triangles;
            float sum = 0.0f;
            for (int i = 0; i < this.mf.mesh.subMeshCount; i++)
            {
                int[] arrIndices = this.mf.mesh.GetTriangles(i);
                for (int j = 0; j < arrIndices.Length; j += 3)
                    sum += this.CalculateVolume(arrVertices[arrIndices[j]]
                                            , arrVertices[arrIndices[j + 1]]
                                            , arrVertices[arrIndices[j + 2]]);
            }
       
               
            Debug.Log("Volume= " + Mathf.Abs(sum));
        }
        private void CalculateSumArea()
        {
            Vector3[] arrVertices = this.mf.mesh.vertices;
            int[] arrTriangles = this.mf.mesh.triangles;
            float sum1 = 0.0f;
            for (int i = 0; i < this.mf.mesh.subMeshCount; i++)
            {
                int[] arrIndices = this.mf.mesh.GetTriangles(i);
                for (int j = 0; j < arrIndices.Length; j += 3)
                    sum1 += this.CalculateArea(arrVertices[arrIndices[j]]
                                            , arrVertices[arrIndices[j + 1]]
                                            , arrVertices[arrIndices[j + 2]]);
            }
         
           Debug.Log("Area = " + sum1);
        }
        private float CalculateVolume(Vector3 pt0, Vector3 pt1, Vector3 pt2)
        {
            pt0 = new Vector3(pt0.x * this.scale.x, pt0.y * this.scale.y, pt0.z * this.scale.z);
            pt1 = new Vector3(pt1.x * this.scale.x, pt1.y * this.scale.y, pt1.z * this.scale.z);
            pt2 = new Vector3(pt2.x * this.scale.x, pt2.y * this.scale.y, pt2.z * this.scale.z);
            float v321 = pt2.x * pt1.y * pt0.z;
            float v231 = pt1.x * pt2.y * pt0.z;
            float v312 = pt2.x * pt0.y * pt1.z;
            float v132 = pt0.x * pt2.y * pt1.z;
            float v213 = pt1.x * pt0.y * pt2.z;
            float v123 = pt0.x * pt1.y * pt2.z;
            return (1.0f / 6.0f) * (-v321 + v231 + v312 - v132 - v213 + v123);
        }
        private float CalculateArea(Vector3 pt0, Vector3 pt1, Vector3 pt2)
        {
            pt0 = new Vector3(pt0.x * this.scale.x, pt0.y * this.scale.y, pt0.z * this.scale.z);
            pt1 = new Vector3(pt1.x * this.scale.x, pt1.y * this.scale.y, pt1.z * this.scale.z);
            pt2 = new Vector3(pt2.x * this.scale.x, pt2.y * this.scale.y, pt2.z * this.scale.z);
            float a = (pt1 - pt0).magnitude;
            float b = (pt2 - pt1).magnitude;
            float c = (pt0 - pt2).magnitude;
            float p = (a + b + c) * 0.5f;
            return Mathf.Sqrt(p * (p - a) * (p - b) * (p - c));
        }
       /* private void OnGUI()
        {
            GUILayout.Label("体积:" + Mathf.Abs(sum));
            GUILayout.Label("面积:" +sum1);
        }*/
    }

    经测试符合对不规则物体的体积表面积的求解

    有篇国外的论文提到了一种计算方式。有兴趣的童学可以看看,算法非常简单,代码量也少。 
    项目是在Unity平台做的,我用的是C#代码,你们还可以参考这个unity帖子

    他通过对每个三角面片求其面积然后进行总的相加就可以了,但是对于那篇论文上讲解的对三角面片的买诺记求解那块不是很理解,希望有懂得的人指导一下。

    转自:https://blog.csdn.net/zhang_hui_cs/article/details/77618329

    展开全文
  • ObjectVolume程序计算对象文件(.obj)中表示的闭合三角形网格的体积,表面积和质心。 该过程遍历构成表面的三角形列表,并为每个三角形形成带有外部点的四面体。 程序使用原点(0,0,0)。 然后计算四面体的体积。 ...
  • 考纲原文了解球、棱柱、棱锥、台的表面积和体积的计算公式.知识点详解一、柱体、锥体、台体的表面积1.旋转体的表面积2.多面体的表面积多面体的表面积就是各个面的面积之和,也就是展开图的面积.棱锥、棱台、棱柱的...

    考纲原文

    了解球、棱柱、棱锥、台的表面积和体积的计算公式.

    知识点详解

    一、柱体、锥体、台体的表面积

    1.旋转体的表面积

    dc605bba05a3852bde209704d04d3fee.png

    2.多面体的表面积

    多面体的表面积就是各个面的面积之和,也就是展开图的面积.

    棱锥、棱台、棱柱的侧面积公式间的联系:

    7d4f6d19ef0edd35f82342745d112dfd.png

    二、柱体、锥体、台体的体积

    1.柱体、锥体、台体的体积公式

    3e47e96c5f1f70b90411131c1f9f6a5c.png

    2.柱体、锥体、台体体积公式间的关系

    ac91fb3c02be8e5f81524e1fc75e211b.png

    3.必记结论

    (1)一个组合体的体积等于它的各部分体积之和或差;

    (2)等底面面积且等高的两个同类几何体的体积相等.

    三、球的表面积和体积

    1.球的表面积和体积公式

    2c170b59c50e1c25ae3a26db12ce5551.png

    2.球的切、接问题(常见结论)

    d14b2248b37caf2dc1a485fb185d1523.png

    考向分析

    考向一 柱体、锥体、台体的表面积

    1.已知几何体的三视图求其表面积,一般是先根据三视图判断空间几何体的形状,再根据题目所给数据与几何体的表面积公式,求其表面积.

    2.多面体的表面积是各个面的面积之和,组合体的表面积应注意重合部分的处理,以确保不重复、不遗漏.

    3.求多面体的侧面积时,应对每一个侧面分别求解后再相加;求旋转体的侧面积时,一般要将旋转体展开为平面图形后再求面积.

    考向二 柱体、锥体、台体的体积

    空间几何体的体积是每年高考的热点之一,题型既有选择题、填空题,也有解答题,难度较小,属容易题. 求柱体、锥体、台体体积的一般方法有:

    (1)若所给定的几何体是可直接用公式求解的柱体、锥体或台体,则可直接利用公式进行求解.

    (2)若所给定的几何体的体积不能直接利用公式得出,则常用等体积法、割补法等方法进行求解.

    ①等体积法:一个几何体无论怎样转化,其体积总是不变的.如果一个几何体的底面面积和高较难求解时,我们可以采用等体积法进行求解.等体积法也称等积转化或等积变形,它是通过选择合适的底面来求几何体体积的一种方法,多用来解决有关锥体的体积,特别是三棱锥的体积.

    ②割补法:运用割补法处理不规则的空间几何体或不易求解的空间几何体的体积计算问题,关键是能根据几何体中的线面关系合理选择截面进行切割或者补成规则的几何体.要弄清切割后或补形后的几何体的体积是否与原几何体的体积之间有明显的确定关系,如果是由几个规则的几何体堆积而成的,其体积就等于这几个规则的几何体的体积之和;如果是由一个规则的几何体挖去几个规则的几何体而形成的,其体积就等于这个规则的几何体的体积减去被挖去的几个几何体的体积.因此,从一定意义上说,用割补法求几何体的体积,就是求体积的“加、减”法.

    (3)若以三视图的形式给出几何体,则应先根据三视图得到几何体的直观图,然后根据条件求解.

    考向三 球的表面积和体积

    1.确定一个球的条件是球心和球的半径,已知球的半径可以利用公式求球的表面积和体积;反之,已知球的体积或表面积也可以求其半径.

    2.球与几种特殊几何体的关系:(1)长方体内接于球,则球的直径是长方体的体对角线长;(2)正四面体的外接球与内切球的球心重合,且半径之比为3∶1;(3)直棱柱的外接球:找出直棱柱的外接圆柱,圆柱的外接球就是所求直棱柱的外接球.特别地,直三棱柱的外接球的球心是上、下底面三角形外心连线的中点;(4)球与圆柱的底面和侧面均相切,则球的直径等于圆柱的高,也等于圆柱底面圆的直径;(5)球与圆台的底面和侧面均相切,则球的直径等于圆台的高.

    3.与球有关的实际应用题一般涉及水的容积问题,解题的关键是明确球的体积与水的容积之间的关系,正确建立等量关系.

    2e2ad18c9e00fe5955a78d67c7ff9ffe.png

    考向四 空间几何体表面积和体积的最值

    求解空间几何体表面积和体积的最值问题有两个思路:

    一是根据几何体的结构特征和体积、表面积的计算公式,将体积或表面积的最值转化为平面图形中的有关最值,根据平面图形的有关结论直接进行判断;

    二是利用基本不等式或是建立关于表面积和体积的函数关系式,然后利用函数的方法或者利用导数方法解决.

    【名师点睛】

    涉及球与棱柱、棱锥的切、接问题时,一般过球心及多面体中的特殊点(一般为接、切点)或线作截面,把空间问题转化为平面问题,再利用平面几何知识寻找几何体中元素间的关系,或只画内切、外接的几何体的直观图,确定球心的位置,弄清球的半径(直径)与该几何体已知量的关系,列方程(组)求解.先确定三角形BCD外接圆的半径,再解方程得外接球半径,最后根据球的体积公式得结果.

    展开全文
  • 补充柱体、锥体、台体、球体的体积和表面积公式 技巧总结 常运用割补法, 典例剖析 例1【2019届高三理科数学第三轮模拟训练题】已知\(AB\)为半径为\(R\)的球\(O\)的一条直径,过\(OB\)的中点\(M\)作垂直于\(AB\)的...

    前言

    涉及公式

    补充柱体、锥体、台体、球体的体积和表面积公式

    技巧总结

    常运用割补法,

    典例剖析

    例1【2019届高三理科数学第三轮模拟训练题】已知\(AB\)为半径为\(R\)的球\(O\)的一条直径,过\(OB\)的中点\(M\)作垂直于\(AB\)的截面,若以此截面为底面,\(A\)为顶点的圆锥的体积为\(\cfrac{3\pi}{8}\),则球的表面积为__________。

    分析:如图所示,\(OA=R\)\(MD=r\),则\(AM=\cfrac{3R}{2}\)\(BM=\cfrac{R}{2}\)

    992978-20190604173341306-726920991.png

    由相交弦定理(垂径定理)可知,\(r^2=\cfrac{3R}{2}\cdot \cfrac{R}{2}=\cfrac{3R^2}{4}\),圆锥的高\(h=AM=\cfrac{3R}{2}\)

    \(V_{圆锥}=\cfrac{1}{3}\pi r^2 h=\cfrac{3\pi R^3}{8}=\cfrac{3\pi}{8}\),故\(R=1\),故\(S_{球}=4\pi R^2=4\pi\).

    例2【2017凤翔中学第二次月考理科第15题】

    已知三棱锥\(P-ABC\)满足\(PA、PB、PC\)两两垂直,且\(PA=PB=PC=2\)\(Q\)是三棱锥\(P-ABC\)外接球上的一个动点,则点\(Q\)到平面\(ABC\)的距离的最大值是多少?

    分析:我们可以将此三棱锥还原为正方体的一部分,补体并特殊化为为正方体的一个角,如图所示,

    992978-20190513171155755-508344172.png

    且正方体有个外接球,那么点\(Q\)到平面\(ABC\)的距离的最大值即是正方体的体对角线的\(\cfrac{2}{3}\),而体对角线长为\(\sqrt{2^2+2^2+2^2}=2\sqrt{3}\),故所求值为\(\cfrac{4\sqrt{3}}{3}\)

    例3【2017凤翔中学第三次月考理科第10题】

    已知球面上有\(A、B、C\)三点,如果\(|AB|=|BC|=|AC|=2\sqrt{3}\),且球心到平面\(ABC\)的距离为1,则该球的体积为多少?

    分析:本题目关键是求球的半径\(R\) ,如上例中的模型,已知的三点可以安放在图中的点\(A'、B、C'\)处,但是要注意,

    已知的平面\(ABC\)和模型中的平面\(A'BC'\)平行,不一定重合,此时求半径问题就转化为求正三棱锥的侧棱的长问题了,

    992978-20171212153442957-1962312818.png

    而且此时正三棱锥的底面边长为\(2\sqrt{3}\),正三棱锥的高是1,高的垂足\(E\)是下底面的中心,

    则其侧棱\(OA\)\(OA=\sqrt{1^2+2^2}=\sqrt{5}\),故\(R=\sqrt{5}\)

    故该球的体积\(V_球=\cfrac{4}{3}\cdot \pi\cdot R^3=\cfrac{20\sqrt{5}}{3}\pi\)

    例4【2019届高三理科数学二轮用题】在面积为4的正方形\(ABCD\)中,\(M\)是线段\(AB\)的中点,现将图形沿\(MC\)\(MD\)折起,使线段\(MA\)\(MB\)重合,得到一个四面体\(A-CDM\),其中点\(B\)和点\(A\)重合,则该四面体外接球的表面积为_________。

    分析:平面图形如左图,立体图形如右图所示,\(\angle MAC=\angle MAD=\cfrac{\pi}{2}\),下来的重点是如何将四面体放置在球体内部。

    992978-20190425163657172-2006231357.jpg

    可以这样来思考,将最特殊的面\(ACD\)放置在下底面,这样方便来放置和下底面垂直的侧棱,如下图所示;

    992978-20190425163142567-801257074.jpg

    底面圆的圆心\(O'\)为下底面正三角形的重心,\(O\)为球心,则\(OA=OM=R\),由于\(\triangle ACD\)为等边三角形,\(AC=2\),则\(CH=1\)\(AH=\sqrt{3}\),则\(AO'=\cfrac{2\sqrt{3}}{3}\),过点\(O\)\(OK\perp AM\)\(K\),则\(OK=AO'=\cfrac{2\sqrt{3}}{3}\),又\(AK=\cfrac{1}{2}AM=\cfrac{1}{2}\),在\(Rt\triangle AOK\)中,由勾股定理可知\(R^2=(\cfrac{2\sqrt{3}}{3})^2+(\cfrac{1}{2})^2=\cfrac{19}{12}\),故\(S_{球O}=4\pi R^2=\cfrac{19\pi}{3}\)

    补充说明:如果想不清这一点,还可以想着将四面体补体成一个直三棱柱,如下图的动图所示,

    992978-20190425162645572-1651923327.gif

    解后反思:当一条侧棱和下底面垂直时,常将三棱锥\(M-ACD\)补体成直三棱柱\(MC'D'-ACD\),这样容易想清楚。

    例5【2019届高三理科数学第三轮模拟训练题】三棱锥\(P-ABC\)中,\(\triangle ABC\)为等边三角形,\(PA=PB=PC=3\)\(PA\perp PB\),则三棱锥\(P-ABC\)的外接球的表面积为__________。

    分析:补体并特殊化为为正方体的一个角,如图所示,

    992978-20190513171155755-508344172.png

    则体对角线长为\(3\sqrt{3}\),即\(R=\cfrac{3\sqrt{3}}{2}\),故\(S_{表}=4\pi R^2=27\pi\).

    例6【2019届高三理科数学第三轮模拟训练题】已知体积为\(\cfrac{9\sqrt{2}}{4}\)的三棱锥\(P-ABC\)的所有棱长都相等,则三棱锥\(P-ABC\)的外接球的表面积为【】

    $A.\cfrac{27\pi}{2}$ $B.\cfrac{27\sqrt{6}\pi}{2}$ $C.\cfrac{27\pi}{8}$ $D.\cfrac{81\sqrt{6}\pi}{8}$

    分析:如图,设\(\triangle ABC\)的外接圆的圆心为\(E\),由于三棱锥\(P-ABC\)的所有棱长都相等,故三棱锥为正四面体,

    992978-20190615120039000-316553373.png

    设正四面体的棱长为\(AB=a\),由正四面体的体积为\(V=\cfrac{9\sqrt{2}}{4}\),可解得\(a=3\)

    则其外接球的半径为\(R=\cfrac{\sqrt{6}a}{4}=\cfrac{3\sqrt{6}}{4}\),详解详析 1

    故三棱锥\(P-ABC\)的外接球的表面积为\(S=4\pi R^2=4\pi (\cfrac{\sqrt{6}3}{4})^2=\cfrac{27\pi}{2}\),故选\(A\)

    例7【2019届高三理科数学第三轮模拟训练题】鲁班锁时中国古代传统的智力玩具,起源于中国古代建筑中首创的榫卯结构。如图所示,在没有钉子和绳子的情况下,通过一种榫卯咬合的方式把三组木条(共六根木条,每根木条均可视为正四棱柱)垂直相交固定在一起,其上下、左右、前后完全对称。现有一个鲁班锁,每一根木条的高为\(5\),底面正方形的边长为\(2\),现将该鲁班锁放在一个球形容器中,则能容纳该鲁班锁的最小球形容器的表面积为(容器壁厚度忽略不计)【】

    $A.28\pi$ $B.33\pi$ $C.45\pi$ $D.120\pi$

    分析:由于鲁班锁的上下、左右、前后完全对称,故此问题等同于一个下底面的长为\(2\)宽为\(4\),高为\(5\)的长方体外接于球,如图所示,

    992978-20190611203613129-538841141.png

    则外接球的直径为长方体的体对角线,则其长为\(\sqrt{2^2+4^2+5^2}=3\sqrt{5}\),则\(R=\cfrac{3\sqrt{5}}{2}\)

    故球体的表面积为\(4\pi R^2=45\pi\),故选\(C\).

    例8【2019届高三理科数学三轮模拟试题】\(P\)为矩形\(ABCD\)所在平面外的一点,且\(PA\perp\)平面\(ABCD\),若\(PB=\sqrt{5}\)\(PD=\sqrt{10}\)\(BD=\sqrt{13}\),则\(P-ABCD\)的外接球面积是【】

    $A.4\pi$ $B.12\pi$ $C.13\pi$ $D.14\pi$

    992978-20190612143347510-1589761047.png

    分析:如图所示,\(PA\)\(AB\)\(AD\)两两垂直,设\(AB=x\)\(AD=y\)\(AP=z\),则有

    \(x^2+y^2=13\)\(y^2+z^2=10\)\(z^2+x^2=5\),则可知\(x^2+y^2+z^2=14\)

    故将此三棱锥还原为长方体后,其体对角线\(d=\sqrt{14}\),则\(P-ABCD\)的外接球的半径为\(r=\cfrac{\sqrt{14}}{2}\)

    \(S_{球}=4\pi r^2=4\pi \cdot \cfrac{14}{4}=14\pi\),故选\(D\).

    例9【2019届高三理科数学三轮模拟试题】直三棱柱\(ABC-A_1B_1C_1\)的底面是直角三角形,侧棱长等于底面三角形的斜边长,若其外接球的体积为\(\cfrac{32\pi}{3}\),则该三棱柱体积的最大值为__________。

    分析:设此三棱柱的底面直角三角形的直角边分别为\(a\)\(b\),则棱柱的高\(h=\sqrt{a^2+b^2}\)

    992978-20190615113730508-97917984.png

    设直三棱柱的外接球的半径为\(R\),则\(\cfrac{4}{3}\pi R^3=\cfrac{32\pi}{3}\),解得\(R=2\)

    由于上下底面三角形的斜边的中点的连线的中点为该三棱柱的外接球的球心,

    \(\sqrt{2}h=2R=4\),则\(h=2\sqrt{2}\),所以\(a^2+b^2=h^2=8\geqslant 2ab\)

    \(ab\leqslant 4\),当且仅当\(a=b=2\)时取到等号。

    故三棱柱的体积\(V=Sh=\cfrac{1}{2}abh=\sqrt{2}ab\leq 4\sqrt{2}\)

    992978-20190615113742760-1858718864.gif


    1. 详解详析链接

    转载于:https://www.cnblogs.com/wanghai0666/p/10974813.html

    展开全文
  • 这篇文章主要是对三维模型的一些介绍以及使用C++完成一个mesh3维封闭模型的表面积和体积的计算。 三维模型表达方式 三维模型表达方式即组成三维模型的方式。常见的有:基于图元的CAD模型、三维点云、Mesh网格模型...

    以后可能会对三维视觉进行一些学习和研究,最近做的项目需要训练模型,所以就空出来时间来入门学习一下。最近也学了下c++,正好拿来练手。
    这篇文章主要是对三维模型的一些介绍以及使用C++完成一个mesh封闭模型的表面积和体积的计算。
    完整代码以及OBJ模型在文章后链接中。

    enter description here

    三维模型表达方式

    三维模型表达方式即组成三维模型的方式。常见的有:基于图元的CAD模型、三维点云、Mesh网格模型、体素化模型、八叉树表示、TSDF表示等

    enter description here

    三维点云

    点云是指透过3D扫描器所得到的形式。
    扫描资料以点的形式记录,每一个点包含有三维坐标,有些可能含有色彩资讯(R,G,B)或物体反射面强度。
    点云数据除了具有几何位置以外,还有强度信息,强度信息的获取是根据激光扫描仪接受装置采集到的回波强度。

    enter description here

    mesh网格

    Mesh是多边形网格,是计算机图形学中用于各种不规律物体建模的一种数据结构。这些网格通常由三角形、四边形或者其它的简单凸多边形组成,这样可以简化渲染过程。但是,网格也可以包括带有空洞的普通多边形组成的物体。

    在多边形网格的面片中三角面片是被分割的最小单位,且表示比较简单、灵活并且拓扑描述方便,所以被广泛使用,所以mesh常常指代三角面片

    表示方式即是顶点信息的简单列表以及其他法向量等信息的列表。
    enter description here

    如上图中 组成这个的三维模型就是由一个个的三角星面(三维下的)组成的。
    一维坐标系组成的最小单位是点,二位坐标系组成的最小单位是直线段,三维坐标系下组成的最下单位就可以是三角面。(自己推测 无实际参考证明)

    体素化模型

    是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性。表示模型的空间体素跟表示图像的二维像素比较相似,只不过从二维的点扩展到三维的立方体单元,而且基于体素的三维模型有诸多应用。
    enter description here

    三维模型格式

    3D模型的种类非常的多,不同应用领域、不同功能属性,加密的独有的通用的等等。有非常多的格式。如OBJ、FBX、GLB、3MF、B3D、PLY、U3D等等

    下面介绍几种常见的3D模型格式

    OBJ

    OBJ文件是Alias | Wavefront公司为它的一套基于工作站的3D建模和动画软件“AdvancedVisualizer”开发的一种标准3D模型文件格式。

    OBJ 格式支持点、线、纹理顶点、面和自由形状的几何图形(曲线和曲面)等多边形几何图形。此格式不支持动画或与场景的光线和位置相关的信息。OBJ 文件通常是由CAD(计算机辅助设计)生成的 3D 建模过程的最终产品。

    该文件格式是开放的,并已由其他供应商为其 3D 图形应用程序实施。

    FBX

    FBX,FilmBox,是一种流行的 3D 文件格式,最初由 Kaydara 为 MotionBuilder 开发,是许多 3D 工具使用的主要 3D 交换格式之一,FBX 有二进制和 ASCII 文件格式。

    FBX 是一种专有格式,Autodesk 提供了一个 C++ FBX SDK,用于从 FBX 文件读取、写入和转换。

    GLB

    GLB 是以 GL 传输格式 ( glTF )保存的 3D 模型的二进制文件格式表示。
    能够表述的信息有二进制格式的节点层次结构、相机、材料、动画和网格。这种二进制格式将 glTF 信息(JSON、.bin 和图像)存储在二进制 blob 中。

    计算三维模型表面积和体积

    由于OBJ文件是可直接读取的,易操作因此使用OBJ格式的文件。三维模型的表达方式就使用mesh三角形面片。

    enter description here

    详解OBJ文件格式

    每行代表一条数据

    行首含义示例
    #注释# Max2Obj Version 4.0
    v一个顶点的坐标(x y z)v 27.591814 173.004517 -51.917446
    vt顶点的纹理坐标信息vt 0.000000 0.916667 0.000000
    vn三维法向量(x y z)vn -0.004955 0.097663 -0.020915
    f顶点/纹理坐标/法线 三个索引f 1/1/1 2/2/2 3/3/3

    其中fface也就是面,一行数据表示的是一个面,一个面包含三个顶点(三角面片组成的),一个点具有“顶点/纹理坐标/法线”3个索引值,索引的是前面3个列表的信息。
    f 1/1/1 2/2/2 3/3/3表示的就是这个面由 第 1,2,3个顶点组成的,法线是 第1,2,3个法线。

    enter description here
    (上图为 从源文件中每部分都截取出来一些 代码中进行测试)

    根据OBJ的格式我们就可以获取到各个面上的各个顶点的坐标,就可以进行表面积和体积的计算。

    OBJ文件读取

    根据上面OBJ的格式可以得知,需要把顶点坐标读取到一个迭代器中(因为不知道有多少个顶点 无法使用数组,并且相比于数组我更喜欢用迭代器)。
    这里要定义一个顶点坐标的结构体

    struct Points{  // 顶点坐标
        float num_x;
        float num_y;
        float num_z;
    };
    

    vt vnv 一样都是三个float类型的 ,所以都是用这个结构体就可以了。

    对于一个面,里面包含了三组信息(顶点索引,纹理索引、法向量索引),每组信息里面又有三个信息(三个顶点、三个纹理特征、三个法向量)。
    因此使用嵌套式结构体。索引只需要使用 int 就可以了。

    struct Face_Index{
        int fri_point;
        int sec_point;
        int thi_point;
    };
    struct Faces{
        Face_Index points_index; // 一个面上的三个点的坐标索引
        Face_Index wenli_index; // 一个面上的三个点的纹理索引
        Face_Index normal_index; // 一个面上的 三个法向量索引
    
    };
    

    定义三个存放数据的迭代器,迭代器的数据类型是相对应的结构体。

    //  顶点坐标,法向量,面中对应的index, 分别放到了一个迭代器中
    vector<Points> ve_points;
    vector<Points> normal_vectors;
    vector<Faces> faces_index;
    

    接下来只需要进行读取每行数据,然后根据数据前面的开头判断数据的特征,判断后将数据进行字符串的一些处理获取到需要的数据,将相对应的数据放到相对应的迭代器中。

    表面积计算

    需要求的是整个三维模型的表面积,那么只需要求出来每个面的表面积。
    通过高数中学的知识可知,根据三个顶点坐标,利用两个边向量的叉乘即可算出来三角面的面积
    enter description here

    根据线代里面学的很容易就能推导出 面积的公式

    //叉乘公式  两个向量叉乘 即为两个向量组成的平行四边形的面积 除以2及时组成的三角形的面积
    double triangle_area(float p1X, float p1Y, float p1Z,
                         float p2X, float p2Y, float p2Z,
                         float p3X, float p3Y, float p3Z)
    {
        double ax = p2X - p1X;
        double ay = p2Y - p1Y;
        double az = p2Z - p1Z;
        double bx = p3X - p1X;
        double by = p3Y - p1Y;
        double bz = p3Z - p1Z;
        double cx = ay*bz - az*by;
        double cy = az*bx - ax*bz;
        double cz = ax*by - ay*bx;
        return (double)(0.5 * sqrt(cx*cx + cy*cy + cz*cz));
    }
    

    体积计算

    在计算三维模型的体积时,我们选择一个内部的点O,每个三角面片跟这个点就构成了一个四面体,而我们计算每个四面体的体积,再叠加到一块即可以得出三维模型的体积。

    enter description here
    可参考论文中计算四面体的公式(也可自行推导) 论文链接

    结论如下
    enter description here
    只需要一个面的三个顶点坐标再叠加每个面的顶点形成四面体的体积 即可得出三维模型的体积。

    //推导四面体的公式  https://zhuanlan.zhihu.com/p/26140241
    double triangle_volume(float p1X, float p1Y, float p1Z,
                           float p2X, float p2Y, float p2Z,
                           float p3X, float p3Y, float p3Z)
    {
        double v321 = p3X*p2Y*p1Z;
        double v231 = p2X*p3Y*p1Z;
        double v312 = p3X*p1Y*p2Z;
        double v132 = p1X*p3Y*p2Z;
        double v213 = p2X*p1Y*p3Z;
        double v123 = p1X*p2Y*p3Z;
        return (double)(1.0/6.0)*(-v321 + v231 + v312 - v132 - v213 + v123);
    }
    

    结果验证

    在能够读取OBJ文件,能够计算表面积和体积之后,只需要将获取到顶点的迭代器进行遍历。然后将每个面上的点放入进计算表面积和体积的函数中,即可得出最终的结果

    在计算出结果后,使用软件Blender进行验证。
    enter description here

    小数点前的数一致,由于某些未知原因并不是完全一样,但是也可得出计算结果是没什么问题的。
    (经测试应该是由于单位的原因,Blender软件中得出的值与计算出的值数量级不同。后几位数不同的原因经测试不是由于数据类型的原因,具体原因还不清楚)

    如果以上内容帮助到了你,还请点赞、关注、收藏.
    完整代码 链接

    展开全文
  • 每三个点是一个面,通过面积公式,计算出每个面的面积S=√[p(p-l1)(p-l2)(p-l3)](p为半周长) 而体积的思路,依然是通过顶点,每个三角面和中心点组成一个三棱锥,计算出其所在平行六面体的体积,四面体的体积就是...
  • 已知棱长求三棱锥的表面积和体积 一年前编写的程序,刚学习Java时的接口练习 import java.util.Scanner; import static java.lang.StrictMath.sqrt; /** * @Author :Shilaiyuan * @Date:2019-10-25 * @...
  • 3D模型展示以及体积、表面积计算

    千次阅读 2018-03-20 13:05:00
    上次为大家提供了3D模型的展示之后 发现网上有很多想要计算3D模型表面积和体积的需求 那么经过掉了几百根头发的艰辛历程之后 终于为大家解决了这一需求 按照惯例先上图为证 当然我这样写 有的人认为我在忽悠 你说...
  • 四面体有向体积*6 double volume(Point a,Point b,Point c,Point d){ return (b-a)*(c-a)^(d- a); } // 正:点在面同向 double dblcmp(Point &p,face & f){ Point m =P[f.b]- P[f.a]; Point n =P[f....
  • 有了这些函数,可以实现很多其他功能,如计算一个三角网格模型的表面积,只需要遍历每个三角形单元并计算其面积即可。 另外,还有一个办法是vtkMassProperties。这个类可以实现三角网格的表面积和体积计算,但是...
  • 没什么好解释的,好多天不更新博客了,csdn还是灌水啊,试着写质量博客吧我还是。...请你返回最终形体的表面积。 示例 1: 输入:[[2]] 输出:10 示例 2: 输入:[[1,2],[3,4]] 输出:34 示例...
  • //四面体有向体积*6 double volume(Point a,Point b,Point c,Point d) { return (b-a)*(c-a)^(d-a); } //正:点在面同向 double dblcmp(Point &p,face &f) { Point m=P[f.b]-P[f.a]; Point n=P[f.c]...
  • 有了这些函数,可以实现很多其他功能,如计算一个三角网格模型的表面积,只需要遍历每个三角形单元并计算其面积即可。 另外,还有一个办法是 vtkMassProperties 。这个类可以实现三角网格的表面积和体积计算,...
  • 问题描述:题目给了我们N个点,问我们这个三维凸包的表面积是多少? 题目分析:三维凸包的模板题目。可以保存一下kuangbin大神的三维凸包模板。 代码如下: #include #include #include #include using ...
  • 四面体有向体积*6 double volume(Point a,Point b,Point c,Point d) { return (b-a)*(c-a)^(d- a); } // 正:点在面同向 double dblcmp(Point &p,face & f) { Point m =P[f.b]- P[f.a]; Point n =...
  • Ultimate Weapon Time Limit: ...In year 2008 of the Cosmic Calendar, the Aliens send a ... double Area()//表面积 { double S=0; if(n==3) { S=area(p[0],p[1],p[2])/2.0; return S; } for(int i=0;i...
  •  double area()//表面积  {  double ret=0;  for(int i=0;i;i++)  ret+=area(ply[tri[i].a],ply[tri[i].b],ply[tri[i].c]);  return ret/2.0;  }  double volume()//体积  {  TPoint p...
  • 1.前言:2018马上就要过去了,今天的一场模拟赛做到了这个题,一开始没有人过,我在队友开其他题的时候偷懒...这个其实大家高中都会,就是等体积法,四面体的体积被表示成表面积与内切球半径的乘积的3倍。四面体的体...
  • 求凸包表面积 */ #include #include #include < string .h> #include #include using namespace std; const int MAXN= 550 ; const double eps=1e- 8 ; struct Point { double x,y,z; ...
  • //表面积 double area() { double res=0; if(n==3) { Point p=cross(P[0],P[1],P[2]); res=vlen(p)/2.0; return res; } for(int i=0;i;i++) res+=area(P[F[i].a],P[F[i].b],P[F[i].c]); return res/2.0...
  • 增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况: 1> 在凸包内,则可以跳过 2> 在凸包外,找到从这个点可以"看见"的面S(看不看得见可以用法向量,看点是否在面外侧),删除这些面S,然后对于S的...
  • 2,四面体的体积为,由于现在不知道向量怎么打出来,我就插张图片了,将这个式子平方后得到:3,根据矢量数量积的坐标表达式及数量积的定义得又根据余弦定理得4,将上述的式子带入(1),就得到了传说中的欧拉四面体...
  • 奥数题-求空间4点构成的四面体体积

    千次阅读 2017-11-12 17:56:04
    问:四面体ABCD体积的最大值是多少? 觉得挺有趣,就拿着笔这纸上画了画,最后得出答案。 先说思考过程 可以把K看做空间坐标系的原点,分别以3,4,5,6为半径画球体,我们发现,4个球体是同心的,也就是在这4个...
  • 海伦公式: 四面体体积公式 六条边分别为a,b,c,a1,b1,c1。 a,b,c,a1,b1,c1,其中a与a1,b与b1,c与c1互为对边,...R = (3*V)/S s为四面体面积 最小外接球 四个点到球心的距离相等 代码如下: import math impor
  • 对任意四面体$ABCD$,其体积$V$和外接球半径$R$满足$$6RV=\sqrt{p(p-aa_1)(p-bb_1)(p-cc_1)}.$$ 其中$p=\frac 12(aa_1+bb_1+cc_1)$,$a,a_1,b,b_1,c,c_1$分别为四面体的三组对棱的长. 允许我先跑个题且在正文里介绍...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 507
精华内容 202
关键字:

四面体的表面积