update bevel

This commit is contained in:
looooo
2015-10-22 23:01:31 +02:00
parent 7b4e5076c2
commit 1972520677

View File

@@ -22,7 +22,8 @@
from __future__ import division
from __future__ import division
from numpy import cos, sin, tan, arccos, arctan, pi, array, linspace, transpose, vstack, sqrt
from _functions import rotation3D, reflection3D
import numpy as np
from _functions import rotation3D, reflection3D, intersection_line_circle
@@ -53,33 +54,32 @@ class bevel_tooth(object):
4.*cos(2.*self.gamma + (4.*sin(self.gamma))/self.z)))*sin(2.*self.gamma))/(-6. - 2.*cos(2.*self.alpha) +
cos(2.*self.alpha - 2.*self.gamma) - 2.*cos(2.*self.gamma) + cos(2.*(self.alpha + self.gamma)))**2))
self.involute_start = -pi/2. + \
arctan(1/tan(self.gamma)*1/cos(self.alpha))
self.involute_start_radius = self.getradius(self.involute_start)
self.involute_start = -pi/2. + arctan(1/tan(self.gamma)*1/cos(self.alpha))
self.involute_start_radius = self.get_radius(self.involute_start)
self.r_f = sin(self.gamma - sin(gamma) * 2 / self.z) - self.clearence * sin(self.gamma)
self.z_f = cos(self.gamma - sin(gamma) * 2 / self.z)
self.add_foot = True
if self.involute_start_radius < self.r_f:
self.add_foot = False
self.involute_start = -arccos(
sqrt((42 + 16*cos(2*self.alpha) + 6*cos(4*self.alpha) -
4*cos(4*self.alpha - 2*self.gamma) - 8*cos(2*(self.alpha - self.gamma)) +
cos(4*(self.alpha - self.gamma)) + 24*cos(2*self.gamma) - 2*cos(4*self.gamma) -
8*cos(2*(self.alpha + self.gamma)) + cos(4*(self.alpha + self.gamma)) -
4*cos(2*(2*self.alpha + self.gamma)) + 24*cos((4*sin(self.gamma))/self.z) +
4*cos(2*self.alpha - (4*sin(self.gamma))/self.z) + 16*cos(2*self.gamma -
(4*sin(self.gamma))/self.z) + 24*cos(4*self.gamma - (4*sin(self.gamma))/self.z) +
4*cos(2*self.alpha + 4*self.gamma - (4*sin(self.gamma))/self.z) -
8*cos(2*(self.alpha + self.gamma - (2*sin(self.gamma))/self.z)) +
4*cos(2*self.alpha + (4*sin(self.gamma))/self.z) + 4*cos(2*self.alpha -
4*self.gamma + (4*sin(self.gamma))/self.z) - 8*cos(2*self.alpha - 2*self.gamma +
(4*sin(self.gamma))/self.z) + 32*sqrt(2)*sqrt(-(cos(self.alpha)**2*
(-2 - 2*cos(2*self.alpha) + cos(2*(self.alpha - self.gamma)) -
2*cos(2*self.gamma) + cos(2*(self.alpha + self.gamma)) +
4*cos(2*self.gamma - (4*sin(self.gamma))/self.z))*cos(self.gamma - (2*sin(self.gamma))/self.z)**2*
sin(2*self.gamma)**2)))/(-6 - 2*cos(2*self.alpha) + cos(2*(self.alpha - self.gamma)) -
2*cos(2*self.gamma) + cos(2*(self.alpha + self.gamma)))**2)/sqrt(2))
# if self.involute_start_radius < self.r_f:
# self.add_foot = False
# self.involute_start = -arccos(
# sqrt((42 + 16*cos(2*self.alpha) + 6*cos(4*self.alpha) -
# 4*cos(4*self.alpha - 2*self.gamma) - 8*cos(2*(self.alpha - self.gamma)) +
# cos(4*(self.alpha - self.gamma)) + 24*cos(2*self.gamma) - 2*cos(4*self.gamma) -
# 8*cos(2*(self.alpha + self.gamma)) + cos(4*(self.alpha + self.gamma)) -
# 4*cos(2*(2*self.alpha + self.gamma)) + 24*cos((4*sin(self.gamma))/self.z) +
# 4*cos(2*self.alpha - (4*sin(self.gamma))/self.z) + 16*cos(2*self.gamma -
# (4*sin(self.gamma))/self.z) + 24*cos(4*self.gamma - (4*sin(self.gamma))/self.z) +
# 4*cos(2*self.alpha + 4*self.gamma - (4*sin(self.gamma))/self.z) -
# 8*cos(2*(self.alpha + self.gamma - (2*sin(self.gamma))/self.z)) +
# 4*cos(2*self.alpha + (4*sin(self.gamma))/self.z) + 4*cos(2*self.alpha -
# 4*self.gamma + (4*sin(self.gamma))/self.z) - 8*cos(2*self.alpha - 2*self.gamma +
# (4*sin(self.gamma))/self.z) + 32*sqrt(2)*sqrt(-(cos(self.alpha)**2*
# (-2 - 2*cos(2*self.alpha) + cos(2*(self.alpha - self.gamma)) -
# 2*cos(2*self.gamma) + cos(2*(self.alpha + self.gamma)) +
# 4*cos(2*self.gamma - (4*sin(self.gamma))/self.z))*cos(self.gamma - (2*sin(self.gamma))/self.z)**2*
# sin(2*self.gamma)**2)))/(-6 - 2*cos(2*self.alpha) + cos(2*(self.alpha - self.gamma)) -
# 2*cos(2*self.gamma) + cos(2*(self.alpha + self.gamma)))**2)/sqrt(2))
def involute_function_x(self):
def func(s):
@@ -103,13 +103,14 @@ class bevel_tooth(object):
cos(self.gamma)*cos(s) - cos(self.alpha)*sin(self.gamma)*sin(s)))
return(func)
def getradius(self, s):
def get_radius(self, s):
x = self.involute_function_x()
y = self.involute_function_y()
rx = x(s)
ry = y(s)
return(sqrt(rx**2 + ry**2))
def involute_points(self, num=10):
pts = linspace(self.involute_start, self.involute_end, num=num)
fx = self.involute_function_x()
@@ -118,16 +119,23 @@ class bevel_tooth(object):
y = array(map(fy, pts))
fz = self.involute_function_z()
z = array(map(fz, pts))
xyz = transpose(array([x, y,z]))
if self.add_foot:
p = xyz[0]
p1 =map(lambda x: x * (self.r_f / sqrt(p[0]**2 + p[1]**2)), p)
p1[2] = self.z_f
xyz=vstack([[p1], xyz])
xy = [[i[0]/i[2],i[1]/i[2],1.] for i in xyz]
xyz = transpose(array([x, y, z]))
# conical projection to z=1
xy = [[i[0] / i[2], i[1] / i[2]] for i in xyz]
xy = array([[0, 0]] + xy)
r_cut = self.r_f / self.z_f
for i, point in enumerate(xy[1:]):
print(i)
if point.dot(point) >= r_cut ** 2:
break;
intersection_point = intersection_line_circle(xy[i], point, r_cut)
print(intersection_point, xy[i], point)
xy = array([intersection_point] + list(xy[i+1:]))
xyz = [[p[0], p[1], 1] for p in xy]
backlash_rot = rotation3D(self.backlash / 4)
xy = backlash_rot(xy)
return(xy)
xyz = backlash_rot(xyz)
return(xyz)
def points(self, num=10):
pts = self.involute_points(num = num)
@@ -136,33 +144,26 @@ class bevel_tooth(object):
ref = reflection3D(pi/2)
pts1 = ref(pts)[::-1]
rot = rotation3D(2*pi/self.z)
pt3 = rot(pts[0])
if self.add_foot:
return(array([
[pts[0],pts[1]],
[pts[0], pts[1]],
pts[1:],
[pts[-1], pts1[0]],
pts1[:-1],
[pts1[-2], pts1[-1]]
]))
return(array([pts,[pts[-1],pts1[0]], pts1]))
else:
return(array([pts,[pts[-1],pts1[0]], pts1]))
def _update(self):
def update(self):
self.__init__(z = self.z, clearence = self.clearence,
alpha = self.alpha, gamma = self.gamma, backlash = self.backlash, module = self.module)
if __name__ == "__main__":
from matplotlib import pyplot
gear = bevel_tooth()
x = []
y = []
for i in gear.points(30):
for j in i:
x.append(j[0])
y.append(j[1])
pyplot.plot(x,y)
pyplot.show()
from matplotlib import pyplot
gear = bevel_tooth(z=60, clearence=0.0, gamma=np.deg2rad(45))
x, y, z = gear.involute_points().T
pyplot.plot(x, y)
pyplot.show()