Source code for eppy.geometry.volume_zone
# Copyright (c) 2012 Tuan Tran
# =======================================================================
# Distributed under the MIT License.
# (See accompanying file LICENSE or copy at
# http://opensource.org/licenses/MIT)
# =======================================================================
""""This module is used for calculation of zone volume for E+ surfaces"""
# Wrote by Tuan Tran trantuan@hawaii.edu / tranhuuanhtuan@gmail.com
# School of Architecture, University of Hawaii at Manoa
# Find the intersection between two lines
# V = (1/6)*|(a-d).((b-d)x(c-d))| http://en.wikipedia.org/wiki/Tetrahedron
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
try:
import numpy as np
except ImportError as err:
from tinynumpy import tinynumpy as np
[docs]def vol_tehrahedron(poly):
"""volume of a irregular tetrahedron"""
p_a = np.array(poly[0])
p_b = np.array(poly[1])
p_c = np.array(poly[2])
p_d = np.array(poly[3])
return abs(
np.dot(
np.subtract(p_a, p_d),
np.cross(np.subtract(p_b, p_d), np.subtract(p_c, p_d)),
)
/ 6
)
[docs]def central_p(poly1, poly2):
central_point = np.array([0.0, 0.0, 0.0])
for i in range(len(poly1)):
central_point = np.add(
central_point, np.add(np.array(poly1[i]), np.array(poly2[i]))
)
return np.divide(np.divide(central_point, (len(poly1))), 2)
[docs]def vol(poly1, poly2):
""" "volume of a zone defined by two polygon bases"""
c_point = central_p(poly1, poly2)
c_point = (c_point[0], c_point[1], c_point[2])
vol_therah = 0
num = len(poly1)
poly1.append(poly1[0])
poly2.append(poly2[0])
for i in range(num - 2):
# the upper part
tehrahedron = [c_point, poly1[0], poly1[i + 1], poly1[i + 2]]
vol_therah += vol_tehrahedron(tehrahedron)
# the bottom part
tehrahedron = [c_point, poly2[0], poly2[i + 1], poly2[i + 2]]
vol_therah += vol_tehrahedron(tehrahedron)
# the middle part
for i in range(num):
tehrahedron = [c_point, poly1[i], poly2[i], poly2[i + 1]]
vol_therah += vol_tehrahedron(tehrahedron)
tehrahedron = [c_point, poly1[i], poly1[i + 1], poly2[i]]
vol_therah += vol_tehrahedron(tehrahedron)
return vol_therah