discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

hirth joint

AM
Adrian Mariano
Fri, Nov 8, 2024 5:37 PM

I implemented the method I suggested. It was pretty easy to do and works.
I do not understand your problem with skin.  How does it fail?  I construct
mine using vnf_vertex_array which is like skin without fancy point
alignment, and have no issues.  It shouldn’t matter how far apart the
profiles are or how different the scale. Skin just connects the points you
give it to make the polyhedron.

I do have a problem with rounding. The rounding isn’t at the right angle
which leads to a corner where it joins the

I thought the 2 tooth case was working for me but more thorough
investigation revealed problems in the case of skewed teeth. I’ll have to
ponder that.

On Fri, Nov 8, 2024 at 11:39 Bob Carlson bob@rjcarlson.com wrote:

That sounds promising. I tried a lot of stuff but not that and nothing
worked quite right. I’ve tweaked my code now to make the chamfer by
subtracting later. It’s quite easy. The other thing I did is make 2 half
tooth profiles instead of one whole. Now N = 2 works. I also found that
skin() did not work at low tooth counts and had to use a combination of
skin and hull. If two profiles are very different sizes and far apart, that
seemed to be the problem area. I use skin to make thin wafers then hull the
wafers together. I suppose some schemes where I generate many profiles
close together would work too.

Maybe after I finish this version I’m make one more trial of your idea.

-Bob

On Nov 7, 2024, at 15:13, Adrian Mariano avm4@cornell.edu wrote:

I think that to get this right you basically need to take the top point

of the triangle and one of the bottom points of the triangle in their
position projected onto the cylinder, represent in cartesian coordinates,
then interpolate appropriately between them by the chamfer fraction, then
convert back to spherical coordinates to extract the angles.  You can work
through those steps to get some complicated formula, but it looked messy.
I couldn't think of any simpler approach.

I implemented the method I suggested. It was pretty easy to do and works. I do not understand your problem with skin. How does it fail? I construct mine using vnf_vertex_array which is like skin without fancy point alignment, and have no issues. It shouldn’t matter how far apart the profiles are or how different the scale. Skin just connects the points you give it to make the polyhedron. I do have a problem with rounding. The rounding isn’t at the right angle which leads to a corner where it joins the I thought the 2 tooth case was working for me but more thorough investigation revealed problems in the case of skewed teeth. I’ll have to ponder that. On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com> wrote: > That sounds promising. I tried a lot of stuff but not that and nothing > worked quite right. I’ve tweaked my code now to make the chamfer by > subtracting later. It’s quite easy. The other thing I did is make 2 half > tooth profiles instead of one whole. Now N = 2 works. I also found that > skin() did not work at low tooth counts and had to use a combination of > skin and hull. If two profiles are very different sizes and far apart, that > seemed to be the problem area. I use skin to make thin wafers then hull the > wafers together. I suppose some schemes where I generate many profiles > close together would work too. > > Maybe after I finish this version I’m make one more trial of your idea. > > -Bob > > > On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu> wrote: > > > > I think that to get this right you basically need to take the top point > of the triangle and one of the bottom points of the triangle in their > position projected onto the cylinder, represent in cartesian coordinates, > then interpolate appropriately between them by the chamfer fraction, then > convert back to spherical coordinates to extract the angles. You can work > through those steps to get some complicated formula, but it looked messy. > I couldn't think of any simpler approach. > > > >
BC
Bob Carlson
Thu, Nov 14, 2024 11:25 PM

I’ve attached my code that I now believe is debugged and working reliably. It supports all the way down to N=2 (teeth). Depending on N it renders in .25 to .5 s. Preview is similar.

When N = 2 or 3 this is an edge condition that required a lot of testing and work. The other area that caused the most problems was when the “coned” argument was at or around half the tooth height (as measured at the outer radius.) Around this point any auxiliary shapes you use to add a base, add or subtract a chamfer etc, switch from concave to convex or vice versa.

One file is Customizer enabled and serves as the test platform for the second file where all the working code is. The test file also includes some visualization aids that I wrote to help see exactly what is going on.

A note about the anchors. They are all relative to the entire joint. This makes it easier to position both parts in a larger assembly in a way that insures the parts mesh exactly.

-Bob



On Nov 8, 2024, at 10:37, Adrian Mariano avm4@cornell.edu wrote:

I implemented the method I suggested. It was pretty easy to do and works.  I do not understand your problem with skin.  How does it fail?  I construct mine using vnf_vertex_array which is like skin without fancy point alignment, and have no issues.  It shouldn’t matter how far apart the profiles are or how different the scale. Skin just connects the points you give it to make the polyhedron.

I do have a problem with rounding. The rounding isn’t at the right angle which leads to a corner where it joins the

I thought the 2 tooth case was working for me but more thorough investigation revealed problems in the case of skewed teeth. I’ll have to ponder that.

On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com mailto:bob@rjcarlson.com> wrote:

That sounds promising. I tried a lot of stuff but not that and nothing worked quite right. I’ve tweaked my code now to make the chamfer by subtracting later. It’s quite easy. The other thing I did is make 2 half tooth profiles instead of one whole. Now N = 2 works. I also found that skin() did not work at low tooth counts and had to use a combination of skin and hull. If two profiles are very different sizes and far apart, that seemed to be the problem area. I use skin to make thin wafers then hull the wafers together. I suppose some schemes where I generate many profiles close together would work too.

Maybe after I finish this version I’m make one more trial of your idea.

-Bob

On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu mailto:avm4@cornell.edu> wrote:

I think that to get this right you basically need to take the top point of the triangle and one of the bottom points of the triangle in their position projected onto the cylinder, represent in cartesian coordinates, then interpolate appropriately between them by the chamfer fraction, then convert back to spherical coordinates to extract the angles.  You can work through those steps to get some complicated formula, but it looked messy.  I couldn't think of any simpler approach.

I’ve attached my code that I now believe is debugged and working reliably. It supports all the way down to N=2 (teeth). Depending on N it renders in .25 to .5 s. Preview is similar. When N = 2 or 3 this is an edge condition that required a lot of testing and work. The other area that caused the most problems was when the “coned” argument was at or around half the tooth height (as measured at the outer radius.) Around this point any auxiliary shapes you use to add a base, add or subtract a chamfer etc, switch from concave to convex or vice versa. One file is Customizer enabled and serves as the test platform for the second file where all the working code is. The test file also includes some visualization aids that I wrote to help see exactly what is going on. A note about the anchors. They are all relative to the entire joint. This makes it easier to position both parts in a larger assembly in a way that insures the parts mesh exactly. -Bob    > On Nov 8, 2024, at 10:37, Adrian Mariano <avm4@cornell.edu> wrote: > > I implemented the method I suggested. It was pretty easy to do and works. I do not understand your problem with skin. How does it fail? I construct mine using vnf_vertex_array which is like skin without fancy point alignment, and have no issues. It shouldn’t matter how far apart the profiles are or how different the scale. Skin just connects the points you give it to make the polyhedron. > > I do have a problem with rounding. The rounding isn’t at the right angle which leads to a corner where it joins the > > I thought the 2 tooth case was working for me but more thorough investigation revealed problems in the case of skewed teeth. I’ll have to ponder that. > > On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com <mailto:bob@rjcarlson.com>> wrote: >> That sounds promising. I tried a lot of stuff but not that and nothing worked quite right. I’ve tweaked my code now to make the chamfer by subtracting later. It’s quite easy. The other thing I did is make 2 half tooth profiles instead of one whole. Now N = 2 works. I also found that skin() did not work at low tooth counts and had to use a combination of skin and hull. If two profiles are very different sizes and far apart, that seemed to be the problem area. I use skin to make thin wafers then hull the wafers together. I suppose some schemes where I generate many profiles close together would work too. >> >> Maybe after I finish this version I’m make one more trial of your idea. >> >> -Bob >> >> > On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu <mailto:avm4@cornell.edu>> wrote: >> > >> > I think that to get this right you basically need to take the top point of the triangle and one of the bottom points of the triangle in their position projected onto the cylinder, represent in cartesian coordinates, then interpolate appropriately between them by the chamfer fraction, then convert back to spherical coordinates to extract the angles. You can work through those steps to get some complicated formula, but it looked messy. I couldn't think of any simpler approach. >> > >>
BC
Bob Carlson
Thu, Nov 14, 2024 11:34 PM

I forgot something. In _profileU(hs) there is code documented out that causes problems with skin. They show up in the tricky areas like N = 2 and coned = toothHeight/2.

-Bob

On Nov 14, 2024, at 16:25, Bob Carlson via Discuss discuss@lists.openscad.org wrote:

I’ve attached my code that I now believe is debugged and working reliably. It supports all the way down to N=2 (teeth). Depending on N it renders in .25 to .5 s. Preview is similar.

When N = 2 or 3 this is an edge condition that required a lot of testing and work. The other area that caused the most problems was when the “coned” argument was at or around half the tooth height (as measured at the outer radius.) Around this point any auxiliary shapes you use to add a base, add or subtract a chamfer etc, switch from concave to convex or vice versa.

One file is Customizer enabled and serves as the test platform for the second file where all the working code is. The test file also includes some visualization aids that I wrote to help see exactly what is going on.

A note about the anchors. They are all relative to the entire joint. This makes it easier to position both parts in a larger assembly in a way that insures the parts mesh exactly.

-Bob

<PastedGraphic-1.png>

<PastedGraphic-3.png>

<hirth.5.scad>
<hirth test.5.scad>

On Nov 8, 2024, at 10:37, Adrian Mariano avm4@cornell.edu wrote:

I implemented the method I suggested. It was pretty easy to do and works.  I do not understand your problem with skin.  How does it fail?  I construct mine using vnf_vertex_array which is like skin without fancy point alignment, and have no issues.  It shouldn’t matter how far apart the profiles are or how different the scale. Skin just connects the points you give it to make the polyhedron.

I do have a problem with rounding. The rounding isn’t at the right angle which leads to a corner where it joins the

I thought the 2 tooth case was working for me but more thorough investigation revealed problems in the case of skewed teeth. I’ll have to ponder that.

On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com mailto:bob@rjcarlson.com> wrote:

That sounds promising. I tried a lot of stuff but not that and nothing worked quite right. I’ve tweaked my code now to make the chamfer by subtracting later. It’s quite easy. The other thing I did is make 2 half tooth profiles instead of one whole. Now N = 2 works. I also found that skin() did not work at low tooth counts and had to use a combination of skin and hull. If two profiles are very different sizes and far apart, that seemed to be the problem area. I use skin to make thin wafers then hull the wafers together. I suppose some schemes where I generate many profiles close together would work too.

Maybe after I finish this version I’m make one more trial of your idea.

-Bob

On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu mailto:avm4@cornell.edu> wrote:

I think that to get this right you basically need to take the top point of the triangle and one of the bottom points of the triangle in their position projected onto the cylinder, represent in cartesian coordinates, then interpolate appropriately between them by the chamfer fraction, then convert back to spherical coordinates to extract the angles.  You can work through those steps to get some complicated formula, but it looked messy.  I couldn't think of any simpler approach.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I forgot something. In _profileU(hs) there is code documented out that causes problems with skin. They show up in the tricky areas like N = 2 and coned = toothHeight/2. -Bob > On Nov 14, 2024, at 16:25, Bob Carlson via Discuss <discuss@lists.openscad.org> wrote: > > I’ve attached my code that I now believe is debugged and working reliably. It supports all the way down to N=2 (teeth). Depending on N it renders in .25 to .5 s. Preview is similar. > > When N = 2 or 3 this is an edge condition that required a lot of testing and work. The other area that caused the most problems was when the “coned” argument was at or around half the tooth height (as measured at the outer radius.) Around this point any auxiliary shapes you use to add a base, add or subtract a chamfer etc, switch from concave to convex or vice versa. > > One file is Customizer enabled and serves as the test platform for the second file where all the working code is. The test file also includes some visualization aids that I wrote to help see exactly what is going on. > > A note about the anchors. They are all relative to the entire joint. This makes it easier to position both parts in a larger assembly in a way that insures the parts mesh exactly. > > -Bob > > <PastedGraphic-1.png> > > <PastedGraphic-3.png> > > > <hirth.5.scad> > <hirth test.5.scad> > > >> On Nov 8, 2024, at 10:37, Adrian Mariano <avm4@cornell.edu> wrote: >> >> I implemented the method I suggested. It was pretty easy to do and works. I do not understand your problem with skin. How does it fail? I construct mine using vnf_vertex_array which is like skin without fancy point alignment, and have no issues. It shouldn’t matter how far apart the profiles are or how different the scale. Skin just connects the points you give it to make the polyhedron. >> >> I do have a problem with rounding. The rounding isn’t at the right angle which leads to a corner where it joins the >> >> I thought the 2 tooth case was working for me but more thorough investigation revealed problems in the case of skewed teeth. I’ll have to ponder that. >> >> On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com <mailto:bob@rjcarlson.com>> wrote: >>> That sounds promising. I tried a lot of stuff but not that and nothing worked quite right. I’ve tweaked my code now to make the chamfer by subtracting later. It’s quite easy. The other thing I did is make 2 half tooth profiles instead of one whole. Now N = 2 works. I also found that skin() did not work at low tooth counts and had to use a combination of skin and hull. If two profiles are very different sizes and far apart, that seemed to be the problem area. I use skin to make thin wafers then hull the wafers together. I suppose some schemes where I generate many profiles close together would work too. >>> >>> Maybe after I finish this version I’m make one more trial of your idea. >>> >>> -Bob >>> >>> > On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu <mailto:avm4@cornell.edu>> wrote: >>> > >>> > I think that to get this right you basically need to take the top point of the triangle and one of the bottom points of the triangle in their position projected onto the cylinder, represent in cartesian coordinates, then interpolate appropriately between them by the chamfer fraction, then convert back to spherical coordinates to extract the angles. You can work through those steps to get some complicated formula, but it looked messy. I couldn't think of any simpler approach. >>> > >>> > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org
AM
Adrian Mariano
Fri, Nov 15, 2024 12:24 AM

If you want to identify a specific case for reproducing a problem with
skin() I can take a look at it, but I couldn't find anything obviously
wrong in a brief bit of fiddling with parameters.

It's interesting how rather different our hirth joints can look for similar
parameters.  For 2 teeth, with no cone angle/distance they are pretty
similar:

[image: image.png]
but with an extreme cone setting (I was trying to set it to the tooth
height to create the problem you described) they are rather different:

[image: image.png]
Note that mine are symmetric in that a single module produces both halves
and you specify conical with an angle, and then use the negative angle to
make the mate.

On Thu, Nov 14, 2024 at 6:35 PM Bob Carlson bob@rjcarlson.com wrote:

I forgot something. In _profileU(hs) there is code documented out that
causes problems with skin. They show up in the tricky areas like N = 2 and
coned = toothHeight/2.

-Bob

On Nov 14, 2024, at 16:25, Bob Carlson via Discuss <
discuss@lists.openscad.org> wrote:

I’ve attached my code that I now believe is debugged and working reliably.
It supports all the way down to N=2 (teeth). Depending on N it renders in
.25 to .5 s. Preview is similar.

When N = 2 or 3 this is an edge condition that required a lot of testing
and work. The other area that caused the most problems was when the “coned”
argument was at or around half the tooth height (as measured at the outer
radius.) Around this point any auxiliary shapes you use to add a base, add
or subtract a chamfer etc, switch from concave to convex or vice versa.

One file is Customizer enabled and serves as the test platform for the
second file where all the working code is. The test file also includes some
visualization aids that I wrote to help see exactly what is going on.

A note about the anchors. They are all relative to the entire joint. This
makes it easier to position both parts in a larger assembly in a way that
insures the parts mesh exactly.

-Bob

<PastedGraphic-1.png>

<PastedGraphic-3.png>

<hirth.5.scad>
<hirth test.5.scad>

On Nov 8, 2024, at 10:37, Adrian Mariano avm4@cornell.edu wrote:

I implemented the method I suggested. It was pretty easy to do and works.
I do not understand your problem with skin.  How does it fail?  I construct
mine using vnf_vertex_array which is like skin without fancy point
alignment, and have no issues.  It shouldn’t matter how far apart the
profiles are or how different the scale. Skin just connects the points you
give it to make the polyhedron.

I do have a problem with rounding. The rounding isn’t at the right angle
which leads to a corner where it joins the

I thought the 2 tooth case was working for me but more thorough
investigation revealed problems in the case of skewed teeth. I’ll have to
ponder that.

On Fri, Nov 8, 2024 at 11:39 Bob Carlson bob@rjcarlson.com wrote:

That sounds promising. I tried a lot of stuff but not that and nothing
worked quite right. I’ve tweaked my code now to make the chamfer by
subtracting later. It’s quite easy. The other thing I did is make 2 half
tooth profiles instead of one whole. Now N = 2 works. I also found that
skin() did not work at low tooth counts and had to use a combination of
skin and hull. If two profiles are very different sizes and far apart, that
seemed to be the problem area. I use skin to make thin wafers then hull the
wafers together. I suppose some schemes where I generate many profiles
close together would work too.

Maybe after I finish this version I’m make one more trial of your idea.

-Bob

On Nov 7, 2024, at 15:13, Adrian Mariano avm4@cornell.edu wrote:

I think that to get this right you basically need to take the top point

of the triangle and one of the bottom points of the triangle in their
position projected onto the cylinder, represent in cartesian coordinates,
then interpolate appropriately between them by the chamfer fraction, then
convert back to spherical coordinates to extract the angles.  You can work
through those steps to get some complicated formula, but it looked messy.
I couldn't think of any simpler approach.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

If you want to identify a specific case for reproducing a problem with skin() I can take a look at it, but I couldn't find anything obviously wrong in a brief bit of fiddling with parameters. It's interesting how rather different our hirth joints can look for similar parameters. For 2 teeth, with no cone angle/distance they are pretty similar: [image: image.png] but with an extreme cone setting (I was trying to set it to the tooth height to create the problem you described) they are rather different: [image: image.png] Note that mine are symmetric in that a single module produces both halves and you specify conical with an angle, and then use the negative angle to make the mate. On Thu, Nov 14, 2024 at 6:35 PM Bob Carlson <bob@rjcarlson.com> wrote: > I forgot something. In _profileU(hs) there is code documented out that > causes problems with skin. They show up in the tricky areas like N = 2 and > coned = toothHeight/2. > > -Bob > > On Nov 14, 2024, at 16:25, Bob Carlson via Discuss < > discuss@lists.openscad.org> wrote: > > I’ve attached my code that I now believe is debugged and working reliably. > It supports all the way down to N=2 (teeth). Depending on N it renders in > .25 to .5 s. Preview is similar. > > When N = 2 or 3 this is an edge condition that required a lot of testing > and work. The other area that caused the most problems was when the “coned” > argument was at or around half the tooth height (as measured at the outer > radius.) Around this point any auxiliary shapes you use to add a base, add > or subtract a chamfer etc, switch from concave to convex or vice versa. > > One file is Customizer enabled and serves as the test platform for the > second file where all the working code is. The test file also includes some > visualization aids that I wrote to help see exactly what is going on. > > A note about the anchors. They are all relative to the entire joint. This > makes it easier to position both parts in a larger assembly in a way that > insures the parts mesh exactly. > > -Bob > > <PastedGraphic-1.png> > > <PastedGraphic-3.png> > > > <hirth.5.scad> > <hirth test.5.scad> > > > On Nov 8, 2024, at 10:37, Adrian Mariano <avm4@cornell.edu> wrote: > > I implemented the method I suggested. It was pretty easy to do and works. > I do not understand your problem with skin. How does it fail? I construct > mine using vnf_vertex_array which is like skin without fancy point > alignment, and have no issues. It shouldn’t matter how far apart the > profiles are or how different the scale. Skin just connects the points you > give it to make the polyhedron. > > I do have a problem with rounding. The rounding isn’t at the right angle > which leads to a corner where it joins the > > I thought the 2 tooth case was working for me but more thorough > investigation revealed problems in the case of skewed teeth. I’ll have to > ponder that. > > On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com> wrote: > >> That sounds promising. I tried a lot of stuff but not that and nothing >> worked quite right. I’ve tweaked my code now to make the chamfer by >> subtracting later. It’s quite easy. The other thing I did is make 2 half >> tooth profiles instead of one whole. Now N = 2 works. I also found that >> skin() did not work at low tooth counts and had to use a combination of >> skin and hull. If two profiles are very different sizes and far apart, that >> seemed to be the problem area. I use skin to make thin wafers then hull the >> wafers together. I suppose some schemes where I generate many profiles >> close together would work too. >> >> Maybe after I finish this version I’m make one more trial of your idea. >> >> -Bob >> >> > On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu> wrote: >> > >> > I think that to get this right you basically need to take the top point >> of the triangle and one of the bottom points of the triangle in their >> position projected onto the cylinder, represent in cartesian coordinates, >> then interpolate appropriately between them by the chamfer fraction, then >> convert back to spherical coordinates to extract the angles. You can work >> through those steps to get some complicated formula, but it looked messy. >> I couldn't think of any simpler approach. >> > >> >> > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org > > >
SP
Sanjeev Prabhakar
Fri, Nov 15, 2024 1:43 AM

Hi Bob
At the trough it should be a fillet rather than chamfer. On the crest it
should be chamfer.

On Fri, 15 Nov, 2024, 4:56 am Bob Carlson via Discuss, <
discuss@lists.openscad.org> wrote:

I’ve attached my code that I now believe is debugged and working reliably.
It supports all the way down to N=2 (teeth). Depending on N it renders in
.25 to .5 s. Preview is similar.

When N = 2 or 3 this is an edge condition that required a lot of testing
and work. The other area that caused the most problems was when the “coned”
argument was at or around half the tooth height (as measured at the outer
radius.) Around this point any auxiliary shapes you use to add a base, add
or subtract a chamfer etc, switch from concave to convex or vice versa.

One file is Customizer enabled and serves as the test platform for the
second file where all the working code is. The test file also includes some
visualization aids that I wrote to help see exactly what is going on.

A note about the anchors. They are all relative to the entire joint. This
makes it easier to position both parts in a larger assembly in a way that
insures the parts mesh exactly.

-Bob

On Nov 8, 2024, at 10:37, Adrian Mariano avm4@cornell.edu wrote:

I implemented the method I suggested. It was pretty easy to do and works.
I do not understand your problem with skin.  How does it fail?  I construct
mine using vnf_vertex_array which is like skin without fancy point
alignment, and have no issues.  It shouldn’t matter how far apart the
profiles are or how different the scale. Skin just connects the points you
give it to make the polyhedron.

I do have a problem with rounding. The rounding isn’t at the right angle
which leads to a corner where it joins the

I thought the 2 tooth case was working for me but more thorough
investigation revealed problems in the case of skewed teeth. I’ll have to
ponder that.

On Fri, Nov 8, 2024 at 11:39 Bob Carlson bob@rjcarlson.com wrote:

That sounds promising. I tried a lot of stuff but not that and nothing
worked quite right. I’ve tweaked my code now to make the chamfer by
subtracting later. It’s quite easy. The other thing I did is make 2 half
tooth profiles instead of one whole. Now N = 2 works. I also found that
skin() did not work at low tooth counts and had to use a combination of
skin and hull. If two profiles are very different sizes and far apart, that
seemed to be the problem area. I use skin to make thin wafers then hull the
wafers together. I suppose some schemes where I generate many profiles
close together would work too.

Maybe after I finish this version I’m make one more trial of your idea.

-Bob

On Nov 7, 2024, at 15:13, Adrian Mariano avm4@cornell.edu wrote:

I think that to get this right you basically need to take the top point

of the triangle and one of the bottom points of the triangle in their
position projected onto the cylinder, represent in cartesian coordinates,
then interpolate appropriately between them by the chamfer fraction, then
convert back to spherical coordinates to extract the angles.  You can work
through those steps to get some complicated formula, but it looked messy.
I couldn't think of any simpler approach.


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

Hi Bob At the trough it should be a fillet rather than chamfer. On the crest it should be chamfer. On Fri, 15 Nov, 2024, 4:56 am Bob Carlson via Discuss, < discuss@lists.openscad.org> wrote: > I’ve attached my code that I now believe is debugged and working reliably. > It supports all the way down to N=2 (teeth). Depending on N it renders in > .25 to .5 s. Preview is similar. > > When N = 2 or 3 this is an edge condition that required a lot of testing > and work. The other area that caused the most problems was when the “coned” > argument was at or around half the tooth height (as measured at the outer > radius.) Around this point any auxiliary shapes you use to add a base, add > or subtract a chamfer etc, switch from concave to convex or vice versa. > > One file is Customizer enabled and serves as the test platform for the > second file where all the working code is. The test file also includes some > visualization aids that I wrote to help see exactly what is going on. > > A note about the anchors. They are all relative to the entire joint. This > makes it easier to position both parts in a larger assembly in a way that > insures the parts mesh exactly. > > -Bob > > > > > > > On Nov 8, 2024, at 10:37, Adrian Mariano <avm4@cornell.edu> wrote: > > I implemented the method I suggested. It was pretty easy to do and works. > I do not understand your problem with skin. How does it fail? I construct > mine using vnf_vertex_array which is like skin without fancy point > alignment, and have no issues. It shouldn’t matter how far apart the > profiles are or how different the scale. Skin just connects the points you > give it to make the polyhedron. > > I do have a problem with rounding. The rounding isn’t at the right angle > which leads to a corner where it joins the > > I thought the 2 tooth case was working for me but more thorough > investigation revealed problems in the case of skewed teeth. I’ll have to > ponder that. > > On Fri, Nov 8, 2024 at 11:39 Bob Carlson <bob@rjcarlson.com> wrote: > >> That sounds promising. I tried a lot of stuff but not that and nothing >> worked quite right. I’ve tweaked my code now to make the chamfer by >> subtracting later. It’s quite easy. The other thing I did is make 2 half >> tooth profiles instead of one whole. Now N = 2 works. I also found that >> skin() did not work at low tooth counts and had to use a combination of >> skin and hull. If two profiles are very different sizes and far apart, that >> seemed to be the problem area. I use skin to make thin wafers then hull the >> wafers together. I suppose some schemes where I generate many profiles >> close together would work too. >> >> Maybe after I finish this version I’m make one more trial of your idea. >> >> -Bob >> >> > On Nov 7, 2024, at 15:13, Adrian Mariano <avm4@cornell.edu> wrote: >> > >> > I think that to get this right you basically need to take the top point >> of the triangle and one of the bottom points of the triangle in their >> position projected onto the cylinder, represent in cartesian coordinates, >> then interpolate appropriately between them by the chamfer fraction, then >> convert back to spherical coordinates to extract the angles. You can work >> through those steps to get some complicated formula, but it looked messy. >> I couldn't think of any simpler approach. >> > >> >> > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
BC
Bob Carlson
Fri, Nov 15, 2024 4:29 PM

That’s an interesting exercise. I am playing with another strategy to produce the chamfers that will produce a flat chamfer. My current algorithm produces one that is follows the surface of a cone. Unnoticeable at normal tooth counts, but you can see it with very low tooth counts. I’ll generate some pics of the skin issue, but it won’t be till late today.

Sanjay, you are no doubt correct that the groove should be a fillet, I have no ME background at all. But it seems very difficult to produce. I played around with the math to inscribe a circle into an angle at a specific tangent point, but got tired of the exercise before I solved it. I suspect you can do that off the top of your head. Somewhat arbitrarily I chose to make the groove chamfer 50% of the ridge chamfer. Is there another ratio that is accepted or preferred?

-Bob

On Nov 14, 2024, at 17:24, Adrian Mariano avm4@cornell.edu wrote:

It's interesting how rather different our hirth joints can look for similar parameters.  For 2 teeth, with no cone angle/distance they are pretty similar:

That’s an interesting exercise. I am playing with another strategy to produce the chamfers that will produce a flat chamfer. My current algorithm produces one that is follows the surface of a cone. Unnoticeable at normal tooth counts, but you can see it with very low tooth counts. I’ll generate some pics of the skin issue, but it won’t be till late today. Sanjay, you are no doubt correct that the groove should be a fillet, I have no ME background at all. But it seems very difficult to produce. I played around with the math to inscribe a circle into an angle at a specific tangent point, but got tired of the exercise before I solved it. I suspect you can do that off the top of your head. Somewhat arbitrarily I chose to make the groove chamfer 50% of the ridge chamfer. Is there another ratio that is accepted or preferred? -Bob > On Nov 14, 2024, at 17:24, Adrian Mariano <avm4@cornell.edu> wrote: > > It's interesting how rather different our hirth joints can look for similar parameters. For 2 teeth, with no cone angle/distance they are pretty similar:
SP
Sanjeev Prabhakar
Fri, Nov 15, 2024 11:07 PM

I am not sure how you have modeled this but the main point here is that the
teeth should not foul while meshing, if that is not the case in your design
then it should be fine.

On Fri, 15 Nov, 2024, 10:00 pm Bob Carlson via Discuss, <
discuss@lists.openscad.org> wrote:

That’s an interesting exercise. I am playing with another strategy to
produce the chamfers that will produce a flat chamfer. My current algorithm
produces one that is follows the surface of a cone. Unnoticeable at normal
tooth counts, but you can see it with very low tooth counts. I’ll generate
some pics of the skin issue, but it won’t be till late today.

Sanjay, you are no doubt correct that the groove should be a fillet, I
have no ME background at all. But it seems very difficult to produce. I
played around with the math to inscribe a circle into an angle at a
specific tangent point, but got tired of the exercise before I solved it. I
suspect you can do that off the top of your head. Somewhat arbitrarily I
chose to make the groove chamfer 50% of the ridge chamfer. Is there another
ratio that is accepted or preferred?

-Bob

On Nov 14, 2024, at 17:24, Adrian Mariano avm4@cornell.edu wrote:

It's interesting how rather different our hirth joints can look for
similar parameters.  For 2 teeth, with no cone angle/distance they are
pretty similar:


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I am not sure how you have modeled this but the main point here is that the teeth should not foul while meshing, if that is not the case in your design then it should be fine. On Fri, 15 Nov, 2024, 10:00 pm Bob Carlson via Discuss, < discuss@lists.openscad.org> wrote: > That’s an interesting exercise. I am playing with another strategy to > produce the chamfers that will produce a flat chamfer. My current algorithm > produces one that is follows the surface of a cone. Unnoticeable at normal > tooth counts, but you can see it with very low tooth counts. I’ll generate > some pics of the skin issue, but it won’t be till late today. > > Sanjay, you are no doubt correct that the groove should be a fillet, I > have no ME background at all. But it seems very difficult to produce. I > played around with the math to inscribe a circle into an angle at a > specific tangent point, but got tired of the exercise before I solved it. I > suspect you can do that off the top of your head. Somewhat arbitrarily I > chose to make the groove chamfer 50% of the ridge chamfer. Is there another > ratio that is accepted or preferred? > > -Bob > > On Nov 14, 2024, at 17:24, Adrian Mariano <avm4@cornell.edu> wrote: > > It's interesting how rather different our hirth joints can look for > similar parameters. For 2 teeth, with no cone angle/distance they are > pretty similar: > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >
BC
Bob Carlson
Sat, Nov 16, 2024 1:54 AM

It turns out that in the previous version I was calculating the phi angle for the chamfers incorrectly, another place where my math intuition failed me. This code gets it right I think. Look for phiCA in hirth.6.. Phi in spherical coordinates is from vertical and I am sometimes using phiCA from the XY plane instead, so -90. So watch out.

-Bob



On Nov 15, 2024, at 09:29, Bob Carlson via Discuss discuss@lists.openscad.org wrote:

That’s an interesting exercise. I am playing with another strategy to produce the chamfers that will produce a flat chamfer. My current algorithm produces one that is follows the surface of a cone. Unnoticeable at normal tooth counts, but you can see it with very low tooth counts. I’ll generate some pics of the skin issue, but it won’t be till late today.

Sanjay, you are no doubt correct that the groove should be a fillet, I have no ME background at all. But it seems very difficult to produce. I played around with the math to inscribe a circle into an angle at a specific tangent point, but got tired of the exercise before I solved it. I suspect you can do that off the top of your head. Somewhat arbitrarily I chose to make the groove chamfer 50% of the ridge chamfer. Is there another ratio that is accepted or preferred?

-Bob

On Nov 14, 2024, at 17:24, Adrian Mariano avm4@cornell.edu wrote:

It's interesting how rather different our hirth joints can look for similar parameters.  For 2 teeth, with no cone angle/distance they are pretty similar:


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

It turns out that in the previous version I was calculating the phi angle for the chamfers incorrectly, another place where my math intuition failed me. This code gets it right I think. Look for phiCA in hirth.6.. Phi in spherical coordinates is from vertical and I am sometimes using phiCA from the XY plane instead, so -90. So watch out. -Bob  > On Nov 15, 2024, at 09:29, Bob Carlson via Discuss <discuss@lists.openscad.org> wrote: > > That’s an interesting exercise. I am playing with another strategy to produce the chamfers that will produce a flat chamfer. My current algorithm produces one that is follows the surface of a cone. Unnoticeable at normal tooth counts, but you can see it with very low tooth counts. I’ll generate some pics of the skin issue, but it won’t be till late today. > > Sanjay, you are no doubt correct that the groove should be a fillet, I have no ME background at all. But it seems very difficult to produce. I played around with the math to inscribe a circle into an angle at a specific tangent point, but got tired of the exercise before I solved it. I suspect you can do that off the top of your head. Somewhat arbitrarily I chose to make the groove chamfer 50% of the ridge chamfer. Is there another ratio that is accepted or preferred? > > -Bob > >> On Nov 14, 2024, at 17:24, Adrian Mariano <avm4@cornell.edu> wrote: >> >> It's interesting how rather different our hirth joints can look for similar parameters. For 2 teeth, with no cone angle/distance they are pretty similar: > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org
M
mikeonenine@web.de
Sun, Nov 17, 2024 5:15 AM

I’ve had a look at some of the codes posted above and actually got one to work. But the question remains:

In the image below, 60° triangles parallel to the z-axis linear_extruded to the origin give an angle of 90° between the flanks of a spline, which can be seen when one looks along a ridge towards the origin.

Are these then 60° splines or 90° splines?

I’ve had a look at some of the codes posted above and actually got one to work. But the question remains: In the image below, 60° triangles parallel to the z-axis linear_extruded to the origin give an angle of 90° between the flanks of a spline, which can be seen when one looks along a ridge towards the origin. Are these then 60° splines or 90° splines? ![](data:image/png;base64,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)
AM
Adrian Mariano
Sun, Nov 17, 2024 5:30 AM

I think it's tough to tell what the angles are in the fixed view like that
due to the distortion from perspective.  In my code the triangles that form
the teeth are constructed with the specified angle, but then they end up
getting projected at a different angle depending on the cone angle you
pick.  Furthermore, there's the question of where the angle is measured.  I
think the wikipedia page suggested it is measured relative to the cylinder
axis, but I'd normally expect tooth angle to be measured on the tooth,
which means the slope of the tooth will also lead to a change in the
effective angle.  (Maybe this factor is what you're talking about?)  I
decided for my implementation to treat the requested angle as "nominal" and
not worry about these various deviations.  As long as you pick the same
angle (and other parameters) for both sides of the joint, the parts will
mate.  And if you don't like the angle you get---change it.

On Sun, Nov 17, 2024 at 12:15 AM Caddiy via Discuss <
discuss@lists.openscad.org> wrote:

I’ve had a look at some of the codes posted above and actually got one to
work. But the question remains:

In the image below, 60° triangles parallel to the z-axis linear_extruded
to the origin give an angle of 90° between the flanks of a spline, which
can be seen when one looks along a ridge towards the origin.

Are these then 60° splines or 90° splines?


OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org

I think it's tough to tell what the angles are in the fixed view like that due to the distortion from perspective. In my code the triangles that form the teeth are constructed with the specified angle, but then they end up getting projected at a different angle depending on the cone angle you pick. Furthermore, there's the question of where the angle is measured. I think the wikipedia page suggested it is measured relative to the cylinder axis, but I'd normally expect tooth angle to be measured on the tooth, which means the slope of the tooth will also lead to a change in the effective angle. (Maybe this factor is what you're talking about?) I decided for my implementation to treat the requested angle as "nominal" and not worry about these various deviations. As long as you pick the same angle (and other parameters) for both sides of the joint, the parts will mate. And if you don't like the angle you get---change it. On Sun, Nov 17, 2024 at 12:15 AM Caddiy via Discuss < discuss@lists.openscad.org> wrote: > I’ve had a look at some of the codes posted above and actually got one to > work. But the question remains: > > In the image below, 60° triangles parallel to the z-axis linear_extruded > to the origin give an angle of 90° between the flanks of a spline, which > can be seen when one looks along a ridge towards the origin. > > Are these then 60° splines or 90° splines? > > > _______________________________________________ > OpenSCAD mailing list > To unsubscribe send an email to discuss-leave@lists.openscad.org >