﻿# hirth coupling


n=3 # number of teeths
ca=0 # cone angle
ta=5 # teeth angle, angle between 2 teeths seen 
# perpendicular to the tool path
i_r=15 # inner radius
o_r=25 # outer radius
ns=100 # number of segments in each teeth
ch=1 # chamfer
fl=1.5 # fillet on the trough
l1=[[i_r,0,0],[o_r,0,0]]
l2=axis_rot_1(l1,[0,1,0],[o_r,0,0],ca)
l2=flip(line2length(l2,l_len(l2)+o_r))
l2=line2length(l2,l_len(l2)+i_r)
cone1=[ rot(f'z{i}',l2) for i in linspace(0,360,100)]
s1=[ rot(f'z{i}',l1)  for i in linspace(0,360,n+1)[:-1]]
s1=psos(cone1,s1,[0,0,1])
p1=rot(f'z{360/n/2}' ,plane([0,1,0],[1e5,1e5]))
l3=axis_rot_1(s1[0],[0,1,0],s1[0][0],-90)
l3=axis_rot_1(l3,line_as_axis(s1[0]),s1[0][0],-ta/2)


l4=axis_rot_1(flip(s1[0]),[0,1,0],s1[0][1],90)
l4=axis_rot_1(l4,line_as_axis(s1[0]),s1[0][1],-ta/2)


pnt1=ppos(p1,s1[0][0],line_as_axis(l3),unidirection=0)
pnt2=ppos(p1,s1[0][1],line_as_axis(l4),unidirection=0)
l5=[pnt1,pnt2]
c1=translate([0,0,-1e5/2],linear_extrude(arc(i_r/2,0,360,s=100),1e5))
pnt3=ppos(c1,pnt1,line_as_axis(flip(l5)))
l5p=[pnt3,pnt2]
cone2=[ rot(f'z{i}',l5p) for i in linspace(0,360,100)]
s2=[ rot(f'z{i}',l5) for i in linspace(0,360,n+1)[:-1]]
s1=[s1,s2]
s1=cpo(l_(concatenate(a_(s1).transpose(1,0,2,3))))
a=m_points1(s1[0],ns)
b=m_points1(s1[1],ns)
s1=cpo([a,b])


c1=translate([0,0,-pnt2[2]*50] ,linear_extrude(arc(i_r,0,360,s=200),pnt2[2]*100))
c2=translate([0,0,-pnt2[2]*50] ,linear_extrude(arc(o_r,0,360,s=200),pnt2[2]*100))
v1=[line_as_axis(p) for p in s1]


a=psos_v_2(c1,[cpo(s1)[0]],v1,unidirection=0)[0]
b=psos_v_2(c2,[cpo(s1)[1]],v1,unidirection=0)[0]
s1=cpo([a,b])


h=s1[ns][1][2]
s1=cpo(s1+[s1[0]])
sol1=surf_base(s1,-10)
sol2=surf_base(s1,h+10)


cone3=cpo(surface_offset(cone2,ch))
sol3=flip(rot(f'z{360/n/2}' ,surf_base(cone3,pnt2[2]+10)))


cone4=surface_offset(cone1,ch)
h1=cone4[0][0][2]
sol4=rot(f'z{360/n/2}' ,surf_base(cpo(cone4),h1-10))


s1=cpo(s1)
l1=s1[0]
l2=i_p_p(s1[:-ns],l1,fl)
l3=i_p_p(s1[ns:],l1,-fl)
f1=convert_3lines2fillet(l3,l2,l1)


l1=s1[ns]
l2=i_p_p(s1,l1,fl)
l3=i_p_p(s1,l1,-fl)
f2=convert_3lines2fillet(l3,l2,l1)
p2=translate(s1[0][0],plane(rot(f'y{ca}',[1,0,0]),[20,20]))
l1=ip_surf(p2,cpo(s1))
l1a=line2length(l1[1:3],10)
l1b=line2length(flip(l1[-3:-1]),10)
with open('trial.scad','w+') as f:
    f.write(f'''
    include<dependencies2.scad>
    //color("blue")for(p={s1})p_line3d(p,.3,1);
    //color("magenta")for(p={[l1a,l1b]})p_line3d(p,.3,1);
    //color("cyan")for(p={cone4})p_line3d(p,.3,1);
    //color("magenta")points({[pnt1]},5);
    //%{swp_surf(cone4)}
    //%{swp_surf(cone3)}
    //%{swp_surf(p1)}
    //%{swp_surf(s1)}
    //%{swp_surf(c1)}
    //%{swp_surf(c2)}
    %{swp_surf(p2)}
    
    difference(){{
    {swp_c(flip(sol1))}
    {swp(sol3)}
    }}
    for(i=[0:360/{n}:360])rotate([0,0,i]){swp(f1)}
    /*
    translate([0,0,.1]){{
    difference(){{
    {swp_c(flip(sol2))}
    {swp(sol4)}
    }}
    for(i=[0:360/{n}:360])rotate([0,0,i]){swp(f2)}
    }}
    */
    ''')
v1=a_(l1a[1])-a_(l1a[0])
v2=a_(l1b[1]-a_(l1b[0]))
u1=v1/norm(v1)
u2=v2/norm(v2)
r2d(arccos(u1@u2))