【问题标题】:How should I calculate the surface area of a 3D Mesh file我应该如何计算 3D Mesh 文件的表面积
【发布时间】:2018-12-24 22:21:16
【问题描述】:

我应该如何计算 3D Mesh 文件的表面积。 是否有任何用于表面积计算的预定义函数。我正在做一个项目,在选择图片体积和面积后,会在该字段中自动计算。

【问题讨论】:

  • 一个网格中所有三角形的面积之和?
  • 不,图不是三角形。
  • 你使用四边形吗? Three.js 的什么版本?
  • 请阅读How to Askminimal reproducible example。到目前为止,还不清楚你在问什么。

标签: javascript python-2.7 three.js mesh


【解决方案1】:

没有直接的方法来获取该区域,但您可以创建自己的自定义逻辑。逻辑是从你的网格中创建三角形并计算那里的面积并添加它们,这将等于你的网格的面积。

示例如下:

function crossVectors( a, b ) {
   var ax = a.X, ay = a.Y, az = a.Z;
   var bx = b.X, by = b.Y, bz = b.Z;
    var P={X:ay * bz - az * by,
          Y:az * bx - ax * bz,
          Z:ax * by - ay * bx}

   return P;
}
 function SuperficialAreaOfMesh(points) {

   var _len =points.length,
      _area = 0.0;

   if (!_len) return 0.0;

   var i= 0,vols=0;
   var va,vb,vc;
   do  {
      va={X:points[i],Y:points[i+1],Z:points[i+2]};
      vb={X:points[i+3],Y:points[i+4],Z:points[i+5]};
      vc={X:points[i+6],Y:points[i+7],Z:points[i+8]};

      var ab = {X:vb.X-va.X,Y:vb.Y-va.Y,Z:vb.Z-va.Z};
         //vb.clone().sub(va);  var ac = {X:vc.X-va.X,Y:vc.Y-va.Y,Z:va.Z-vc.Z};
      //vc.clone().sub(va);   var cross = new THREE.Vector3();
      cross=crossVectors( ab, ac );
      _area += Math.sqrt(Math.pow(cross.X,2)+Math.pow(cross.Y,2)+Math.pow(cross.Z,2))/2;
      i+=9;
   }
   while (i<points.length);

   return customRound(Math.abs(_area)/100,2);

}
// Let's say you have mesh named mesh
SuperficialAreaOfMesh(mesh.vertices);

上面的例子遵循here找到的教程。

Here is another nice logic for your query

【讨论】:

  • 为了减少代码,可以使用THREE.Triangle()及其.getArea()方法来完成。
  • 尺寸 X、Y、Z 值已给出,但我不知道我必须使用什么公式来计算 3D 文件的表面积。
  • 尝试使用上述逻辑。它会返回你的区域。
  • 实际上我将 area 作为数组获取,函数只需要 2 个参数。请帮帮我..... [0.10762328 0.02869747 0.11791313 0.11009426 0.04056691 0.11645208 0.10868461 0.03259173 0.12078221]
  • @ UllasHunka其实我的点作为嵌套阵列上来[[12.671184 4.1647673 13.446729 ... 12.671184 4.1647673 13.946729] [12.303494 2.7925358 13.946729 ... 12.671184 4.1647673 13.946729] [12.303494 2.7925358 13.446729 ... 12.303494 2.7925358 [1.0177865 6.900198 14.36] 0.84364206 6.250282 14.36] [1.3021419 7.51 19.36 ... 1.0177865 6.900198 14.36] spp>
【解决方案2】:
 def crossVectors(a,b):
    P = {}
    ax = b[0]['X']
    ay = b[0]['Y']
    az = b[0]['Z']
    bx = b[1]['X']
    by = b[1]['Y']
    bz = b[1]['Z']
    P['X'] = ay * bz - az * by
    P['Y'] = az * bx - ax * bz
    P['Z'] = ax * by - ay * bx
    return P

 def find_mins_maxs(self, obj):
    minx = maxx = miny = maxy = minz = maxz = None
    # print"##############", obj #dir(obj)

    arr1 = obj.points
    length_1 =len(arr1)
    _area = 0.0;
    va ={}
    vb = {}
    vc = {} 
    ab= {}
    ac= {}
    val = []
    if length_1 ==0:
        return 0.0
    i= 0;
    while i<length_1-2:
        va['X'] = arr1[i][0]
        va['Y'] = arr1[i][1]
        va['Z'] = arr1[i][2]
        vb['X'] = arr1[i+1][0]
        vb['Y'] = arr1[i+1][1]
        vb['Z'] = arr1[i+1][2]
        vc['X'] = arr1[i+2][0]
        vc['Y'] = arr1[i+2][1]
        vc['Z'] = arr1[i+2][2]
        ab['X'] = vb['X']-va['X']
        ab['Y'] = vb['Y']-va['Y']
        ab['Z'] = vb['Z']-va['Z']
        ac['X'] = vc['X']-va['X']
        ac['Y'] = vc['Y']-va['Y']
        ac['Z'] = vc['Z']-va['Z']
        val.append(ab)
        val.append(ac)
        cross= self.crossVectors(val)
        _area +=np.sqrt(np.power(cross['X'],2)+np.power(cross['Y'],2)+np.power(cross['Z'],2))/2;
        i+=9;
        area = np.abs(_area)/100
        fractiondigits =2
        area =round(area*np.power(10,fractiondigits))/np.power(10,fractiondigits)
        print"@@@@@@@@@@@@@@@",area
    return area

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多