def radius_at_offset(self, stem, z_1):
""" calculate radius of stem at offset z_1 along it """
n_taper = self.param.taper[stem.depth]
if n_taper < 1:
unit_taper = n_taper
elif n_taper < 2:
unit_taper = 2 - n_taper
else:
unit_taper = 0
taper = stem.radius * (1 - unit_taper * z_1)
if n_taper < 1:
radius = taper
else:
z_2 = (1 - z_1) * stem.length
if n_taper < 2 or z_2 < taper:
depth = 1
else:
depth = n_taper - 2
if n_taper < 2:
z_3 = z_2
else:
z_3 = abs(z_2 - 2 * taper * int(z_2 / (2 * taper) + 0.5))
if n_taper < 2 and z_3 >= taper:
radius = taper
else:
radius = (1 - depth) * taper + depth * sqrt(pow(taper, 2) - pow((z_3 - taper), 2))
if stem.depth == 0:
y_val = max(0, 1 - 8 * z_1)
flare = self.param.flare * ((pow(100, y_val) - 1) / 100) + 1
radius *= flare
return radius
评论列表
文章目录