discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

geometry help

DS
Dan Shriver
Fri, Sep 16, 2016 7:48 PM

I'm working on some code to build arches of various types.

I have some code working that builds arches using two circles (trivial).

I am now working on a general "four cirlce" arch (sometimes called "loin of
the donkey", or "ogee" arch).  My solution looks like it works when the
radii are equal but the angles of intersection (among other things) are
clearly off.  If the radii are not equal this becomes quickly evident (even
if they are equal and you zoom in a lot you can see there is some incorrect
overlap).

Anyone good with geometry who can point out my problem?

I also copied two routines from this list to aid me "pie_slice()" and
"point()"

module archSlice(x,y,r,fnNum,angleStarta=0, angleEnda=0, angleStartb=0,
angleEndb=0) {
translate([x,y,0]) {
pie_slice(r,angleStartb,angleEndb,fnNum);
}
translate([-x,y,0]) {
pie_slice(r,angleStarta,angleEnda,fnNum);
}
}

module archDbl(x,y,r,fnNum) {
intersection() {
translate([x,y,0]) {
circle(r, $fn=fnNum);
}
translate([-x,y,0]) {
circle(r, $fn=fnNum);
}
}
}

module arch(x,y,r,fnNum,angleStarta=0, angleEnda=0, angleStartb=0,
angleEndb) {
if (angleStarta == 0 && angleEnda == 0 && angleStartb == 0 && angleEndb
==0) {
difference() {
archDbl(x,y,r,fnNum);
translate([0,-r/2,0]) {
square([r,r],center=true);
}
}
}
else {
archSlice(x,y,r,fnNum,angleStarta, angleEnda, angleStartb, angleEndb);
}
}

module ogee(x,y,r1,r2,fnNum,width) {
angle = asin((r2+x)/(r1+r2)); //my problem is probably from how I use
this angle
x2 = x - (r1+r2)(sin(angle));
y2 = y + (r1+r2)
(cos(angle));

difference() {
  arch(x,y,r1,fnNum,0,angle,(180-angle),180); //for instance maybe it

shouldn't be 180-angle
arch(x,y,(r1-width),fnNum,0,angle,(180-angle),180);
}

translate([(x2),(y2),0]) {
    difference() {
      pie_slice((r2+width),(0-angle),0,fnNum);//or maybe it shouldn't

be 0-angle
pie_slice(r2,(0-angle),0,fnNum);
translate([(-2x2),0,0]) {
pie_slice(r2,180,(180+angle),fnNum);
}
}
}
translate([(-x2),(y2),0]) {
difference() {
pie_slice((r2+width),180,(180+angle),fnNum);//or maybe it
shouldn't be 180+angle
pie_slice(r2,180,(180+angle),fnNum);
translate([(2
x2),0,0]) {
pie_slice(r2,(0-angle),0,fnNum);
}
}
}
}

//if you change the fourth parameter to not be equal to the third (or zoom
in) you can see
//there is incorrect overlap etc...
ogee(10,0,20,20,100,2);

module point(x,y) translate([x,y]) circle(0.01);

module pie_slice(r, a0, a1, fnNum) {
//$fa = 5;
R = r * sqrt(2) + 1;
intersection() {
circle(r, $fn=fnNum);
hull() {
point(0,0);
for(i = [0:4])
//a = (((4 - i) * a0 + i * a1) / 4);
point(R * cos((((4 - i) * a0 + i * a1) / 4)), R *
sin((((4 - i) * a0 + i * a1) / 4)));
}
}
}

I'm working on some code to build arches of various types. I have some code working that builds arches using two circles (trivial). I am now working on a general "four cirlce" arch (sometimes called "loin of the donkey", or "ogee" arch). My solution looks like it works when the radii are equal but the angles of intersection (among other things) are clearly off. If the radii are not equal this becomes quickly evident (even if they are equal and you zoom in a lot you can see there is some incorrect overlap). Anyone good with geometry who can point out my problem? I also copied two routines from this list to aid me "pie_slice()" and "point()" module archSlice(x,y,r,fnNum,angleStarta=0, angleEnda=0, angleStartb=0, angleEndb=0) { translate([x,y,0]) { pie_slice(r,angleStartb,angleEndb,fnNum); } translate([-x,y,0]) { pie_slice(r,angleStarta,angleEnda,fnNum); } } module archDbl(x,y,r,fnNum) { intersection() { translate([x,y,0]) { circle(r, $fn=fnNum); } translate([-x,y,0]) { circle(r, $fn=fnNum); } } } module arch(x,y,r,fnNum,angleStarta=0, angleEnda=0, angleStartb=0, angleEndb) { if (angleStarta == 0 && angleEnda == 0 && angleStartb == 0 && angleEndb ==0) { difference() { archDbl(x,y,r,fnNum); translate([0,-r/2,0]) { square([r,r],center=true); } } } else { archSlice(x,y,r,fnNum,angleStarta, angleEnda, angleStartb, angleEndb); } } module ogee(x,y,r1,r2,fnNum,width) { angle = asin((r2+x)/(r1+r2)); //my problem is probably from how I use this angle x2 = x - (r1+r2)*(sin(angle)); y2 = y + (r1+r2)*(cos(angle)); difference() { arch(x,y,r1,fnNum,0,angle,(180-angle),180); //for instance maybe it shouldn't be 180-angle arch(x,y,(r1-width),fnNum,0,angle,(180-angle),180); } translate([(x2),(y2),0]) { difference() { pie_slice((r2+width),(0-angle),0,fnNum);//or maybe it shouldn't be 0-angle pie_slice(r2,(0-angle),0,fnNum); translate([(-2*x2),0,0]) { pie_slice(r2,180,(180+angle),fnNum); } } } translate([(-x2),(y2),0]) { difference() { pie_slice((r2+width),180,(180+angle),fnNum);//or maybe it shouldn't be 180+angle pie_slice(r2,180,(180+angle),fnNum); translate([(2*x2),0,0]) { pie_slice(r2,(0-angle),0,fnNum); } } } } //if you change the fourth parameter to not be equal to the third (or zoom in) you can see //there is incorrect overlap etc... ogee(10,0,20,20,100,2); module point(x,y) translate([x,y]) circle(0.01); module pie_slice(r, a0, a1, fnNum) { //$fa = 5; R = r * sqrt(2) + 1; intersection() { circle(r, $fn=fnNum); hull() { point(0,0); for(i = [0:4]) //a = (((4 - i) * a0 + i * a1) / 4); point(R * cos((((4 - i) * a0 + i * a1) / 4)), R * sin((((4 - i) * a0 + i * a1) / 4))); } } }
R
runsun
Fri, Sep 16, 2016 9:19 PM

This code:

r1=20;
r2=40;
rotate( [0,0,-45] ){
translate([-r1,0,0]) pie_slice(r1,0,45, 50);
translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) pie_slice(r2,0,45,
50);
}

gives a shape:

http://forum.openscad.org/file/n18394/160916-Ogee_math.png

You can go from there.


$  Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), runscad.py ( 2 , git ), synwrite ( 2 );   $ tips: hash ( 2 ), matrix ( 2 , 3 ), sweep ( 2 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf )

View this message in context: http://forum.openscad.org/geometry-help-tp18393p18394.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

This code: > r1=20; > r2=40; > rotate( [0,0,-45] ){ > translate([-r1,0,0]) pie_slice(r1,0,45, 50); > translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) pie_slice(r2,0,45, > 50); > } gives a shape: <http://forum.openscad.org/file/n18394/160916-Ogee_math.png> You can go from there. ----- $ Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), runscad.py ( 2 , git ), synwrite ( 2 ); &nbsp; $ tips: hash ( 2 ), matrix ( 2 , 3 ), sweep ( 2 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf ) -- View this message in context: http://forum.openscad.org/geometry-help-tp18393p18394.html Sent from the OpenSCAD mailing list archive at Nabble.com.
DS
Dan Shriver
Fri, Sep 16, 2016 10:49 PM

That code is infinitely more elegant than what I wrote.

I might need more help later on since I'm not sure how to make it do some
of the things I am thinking about, but I'll play around with it for now and
ask if I need more help.

On Fri, Sep 16, 2016 at 5:19 PM, runsun runsun@gmail.com wrote:

This code:

r1=20;
r2=40;
rotate( [0,0,-45] ){
translate([-r1,0,0]) pie_slice(r1,0,45, 50);
translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0])

pie_slice(r2,0,45,

50);
}

gives a shape:

http://forum.openscad.org/file/n18394/160916-Ogee_math.png

You can go from there.


$  Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ),
runscad.py ( 2 , git ), synwrite ( 2 );   $ tips: hash ( 2 ), matrix (
2 , 3 ), sweep ( 2 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib
), precision ( 2 ), xl-control , type , rounded polygon , chfont ,
tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ;
$ Apps: rollApp , blockscad , openjscad , on AWS ( pdf )

View this message in context: http://forum.openscad.org/
geometry-help-tp18393p18394.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

That code is infinitely more elegant than what I wrote. I might need more help later on since I'm not sure how to make it do some of the things I am thinking about, but I'll play around with it for now and ask if I need more help. On Fri, Sep 16, 2016 at 5:19 PM, runsun <runsun@gmail.com> wrote: > This code: > > > r1=20; > > r2=40; > > rotate( [0,0,-45] ){ > > translate([-r1,0,0]) pie_slice(r1,0,45, 50); > > translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) > pie_slice(r2,0,45, > > 50); > > } > > gives a shape: > > <http://forum.openscad.org/file/n18394/160916-Ogee_math.png> > > You can go from there. > > > > ----- > > $ Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), > runscad.py ( 2 , git ), synwrite ( 2 ); &nbsp; $ tips: hash ( 2 ), matrix ( > 2 , 3 ), sweep ( 2 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib > ), precision ( 2 ), xl-control , type , rounded polygon , chfont , > tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; > $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf ) > -- > View this message in context: http://forum.openscad.org/ > geometry-help-tp18393p18394.html > Sent from the OpenSCAD mailing list archive at Nabble.com. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
R
Ronaldo
Fri, Sep 16, 2016 11:03 PM

The math of your arcs:

Let O be the arc internal opening, t the arc thickness, r1 and r2 the
external radius of the lower and the internal radius of the upper circles,
then:

the center of the lower circle  C1 = [ O / 2 + t - r1, 0]
the center of the upper circle C2 = [ r2, r2sin(a)+r1sin(a) ]
the concordance point  CP = [C1[0] + r1cos(a), C2[1] - r2sin(a)]

where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )).

This will give you the outer border of the arc. For the inner border, the
angle a is the same.

Ogee_arc.PNG http://forum.openscad.org/file/n18397/Ogee_arc.PNG

--
View this message in context: http://forum.openscad.org/geometry-help-tp18393p18397.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

The math of your arcs: Let O be the arc internal opening, t the arc thickness, r1 and r2 the external radius of the lower and the internal radius of the upper circles, then: the center of the lower circle C1 = [ O / 2 + t - r1, 0] the center of the upper circle C2 = [ r2, r2*sin(a)+r1*sin(a) ] the concordance point CP = [C1[0] + r1*cos(a), C2[1] - r2*sin(a)] where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )). This will give you the outer border of the arc. For the inner border, the angle a is the same. Ogee_arc.PNG <http://forum.openscad.org/file/n18397/Ogee_arc.PNG> -- View this message in context: http://forum.openscad.org/geometry-help-tp18393p18397.html Sent from the OpenSCAD mailing list archive at Nabble.com.
DS
Dan Shriver
Fri, Sep 16, 2016 11:14 PM

When you say C1[0] and C2[1] do you just mean C1 and C2 or something else?

On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo rcmpersiano@gmail.com wrote:

The math of your arcs:

Let O be the arc internal opening, t the arc thickness, r1 and r2 the
external radius of the lower and the internal radius of the upper circles,
then:

the center of the lower circle  C1 = [ O / 2 + t - r1, 0]
the center of the upper circle C2 = [ r2, r2sin(a)+r1sin(a) ]
the concordance point  CP = [C1[0] + r1cos(a), C2[1] - r2sin(a)]

where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )).

This will give you the outer border of the arc. For the inner border, the
angle a is the same.

Ogee_arc.PNG http://forum.openscad.org/file/n18397/Ogee_arc.PNG

--
View this message in context: http://forum.openscad.org/
geometry-help-tp18393p18397.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

When you say C1[0] and C2[1] do you just mean C1 and C2 or something else? On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo <rcmpersiano@gmail.com> wrote: > The math of your arcs: > > Let O be the arc internal opening, t the arc thickness, r1 and r2 the > external radius of the lower and the internal radius of the upper circles, > then: > > the center of the lower circle C1 = [ O / 2 + t - r1, 0] > the center of the upper circle C2 = [ r2, r2*sin(a)+r1*sin(a) ] > the concordance point CP = [C1[0] + r1*cos(a), C2[1] - r2*sin(a)] > > where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )). > > This will give you the outer border of the arc. For the inner border, the > angle a is the same. > > Ogee_arc.PNG <http://forum.openscad.org/file/n18397/Ogee_arc.PNG> > > > > -- > View this message in context: http://forum.openscad.org/ > geometry-help-tp18393p18397.html > Sent from the OpenSCAD mailing list archive at Nabble.com. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
RP
Ronaldo Persiano
Sat, Sep 17, 2016 7:31 PM

C1[0] is the first component fo C1, C2[1] the second of C2. Then:

CP = [ O / 2 + t - r1 + r1cos(a),  r1sin(a)]

2016-09-16 20:14 GMT-03:00 Dan Shriver tabbydan@gmail.com:

When you say C1[0] and C2[1] do you just mean C1 and C2 or something else?

On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo rcmpersiano@gmail.com wrote:

The math of your arcs:

Let O be the arc internal opening, t the arc thickness, r1 and r2 the
external radius of the lower and the internal radius of the upper circles,
then:

the center of the lower circle  C1 = [ O / 2 + t - r1, 0]
the center of the upper circle C2 = [ r2, r2sin(a)+r1sin(a) ]
the concordance point  CP = [C1[0] + r1cos(a), C2[1] - r2sin(a)]

where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )).

This will give you the outer border of the arc. For the inner border, the
angle a is the same.

Ogee_arc.PNG http://forum.openscad.org/file/n18397/Ogee_arc.PNG

--
View this message in context: http://forum.openscad.org/geom
etry-help-tp18393p18397.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

C1[0] is the first component fo C1, C2[1] the second of C2. Then: CP = [ O / 2 + t - r1 + r1*cos(a), r1*sin(a)] 2016-09-16 20:14 GMT-03:00 Dan Shriver <tabbydan@gmail.com>: > When you say C1[0] and C2[1] do you just mean C1 and C2 or something else? > > On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo <rcmpersiano@gmail.com> wrote: > >> The math of your arcs: >> >> Let O be the arc internal opening, t the arc thickness, r1 and r2 the >> external radius of the lower and the internal radius of the upper circles, >> then: >> >> the center of the lower circle C1 = [ O / 2 + t - r1, 0] >> the center of the upper circle C2 = [ r2, r2*sin(a)+r1*sin(a) ] >> the concordance point CP = [C1[0] + r1*cos(a), C2[1] - r2*sin(a)] >> >> where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )). >> >> This will give you the outer border of the arc. For the inner border, the >> angle a is the same. >> >> Ogee_arc.PNG <http://forum.openscad.org/file/n18397/Ogee_arc.PNG> >> >> >> >> -- >> View this message in context: http://forum.openscad.org/geom >> etry-help-tp18393p18397.html >> Sent from the OpenSCAD mailing list archive at Nabble.com. >> >> _______________________________________________ >> OpenSCAD mailing list >> Discuss@lists.openscad.org >> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >> > > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > >
DS
Dan Shriver
Sun, Sep 18, 2016 1:37 AM

I'm going to play around with both solutions because runsun's is extremely
elegant but might be a huge challange to my brain to get it to do a
generalized ogee.

runsun:  I'm trying to move what you did so the bottom is lying on the x
axis and the top is on the y axis.  I can get the bottom on the x axis via
a translate with y value: (r2*(cos(45)))  but when I try to do something
similar to get the top in line I can't get it right.

Ronaldo: I'm not sure what "first component for C1" is

On Sat, Sep 17, 2016 at 3:31 PM, Ronaldo Persiano rcmpersiano@gmail.com
wrote:

C1[0] is the first component fo C1, C2[1] the second of C2. Then:

CP = [ O / 2 + t - r1 + r1cos(a),  r1sin(a)]

2016-09-16 20:14 GMT-03:00 Dan Shriver tabbydan@gmail.com:

When you say C1[0] and C2[1] do you just mean C1 and C2 or something else?

On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo rcmpersiano@gmail.com wrote:

The math of your arcs:

Let O be the arc internal opening, t the arc thickness, r1 and r2 the
external radius of the lower and the internal radius of the upper
circles,
then:

the center of the lower circle  C1 = [ O / 2 + t - r1, 0]
the center of the upper circle C2 = [ r2, r2sin(a)+r1sin(a) ]
the concordance point  CP = [C1[0] + r1cos(a), C2[1] - r2sin(a)]

where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )).

This will give you the outer border of the arc. For the inner border, the
angle a is the same.

Ogee_arc.PNG http://forum.openscad.org/file/n18397/Ogee_arc.PNG

--
View this message in context: http://forum.openscad.org/geom
etry-help-tp18393p18397.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

I'm going to play around with both solutions because runsun's is extremely elegant but might be a huge challange to my brain to get it to do a generalized ogee. runsun: I'm trying to move what you did so the bottom is lying on the x axis and the top is on the y axis. I can get the bottom on the x axis via a translate with y value: (r2*(cos(45))) but when I try to do something similar to get the top in line I can't get it right. Ronaldo: I'm not sure what "first component for C1" is On Sat, Sep 17, 2016 at 3:31 PM, Ronaldo Persiano <rcmpersiano@gmail.com> wrote: > C1[0] is the first component fo C1, C2[1] the second of C2. Then: > > CP = [ O / 2 + t - r1 + r1*cos(a), r1*sin(a)] > > 2016-09-16 20:14 GMT-03:00 Dan Shriver <tabbydan@gmail.com>: > >> When you say C1[0] and C2[1] do you just mean C1 and C2 or something else? >> >> On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo <rcmpersiano@gmail.com> wrote: >> >>> The math of your arcs: >>> >>> Let O be the arc internal opening, t the arc thickness, r1 and r2 the >>> external radius of the lower and the internal radius of the upper >>> circles, >>> then: >>> >>> the center of the lower circle C1 = [ O / 2 + t - r1, 0] >>> the center of the upper circle C2 = [ r2, r2*sin(a)+r1*sin(a) ] >>> the concordance point CP = [C1[0] + r1*cos(a), C2[1] - r2*sin(a)] >>> >>> where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )). >>> >>> This will give you the outer border of the arc. For the inner border, the >>> angle a is the same. >>> >>> Ogee_arc.PNG <http://forum.openscad.org/file/n18397/Ogee_arc.PNG> >>> >>> >>> >>> -- >>> View this message in context: http://forum.openscad.org/geom >>> etry-help-tp18393p18397.html >>> Sent from the OpenSCAD mailing list archive at Nabble.com. >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> Discuss@lists.openscad.org >>> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >>> >> >> >> _______________________________________________ >> OpenSCAD mailing list >> Discuss@lists.openscad.org >> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >> >> > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > >
RP
Ronaldo Persiano
Sun, Sep 18, 2016 2:28 AM

C1 is a 2D point; it has two components or coordinates; C1[0] is the first;
C1[1] is the second.

2016-09-17 22:37 GMT-03:00 Dan Shriver tabbydan@gmail.com:

I'm going to play around with both solutions because runsun's is extremely
elegant but might be a huge challange to my brain to get it to do a
generalized ogee.

runsun:  I'm trying to move what you did so the bottom is lying on the x
axis and the top is on the y axis.  I can get the bottom on the x axis via
a translate with y value: (r2*(cos(45)))  but when I try to do something
similar to get the top in line I can't get it right.

Ronaldo: I'm not sure what "first component for C1" is

On Sat, Sep 17, 2016 at 3:31 PM, Ronaldo Persiano rcmpersiano@gmail.com
wrote:

C1[0] is the first component fo C1, C2[1] the second of C2. Then:

CP = [ O / 2 + t - r1 + r1cos(a),  r1sin(a)]

2016-09-16 20:14 GMT-03:00 Dan Shriver tabbydan@gmail.com:

When you say C1[0] and C2[1] do you just mean C1 and C2 or something
else?

On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo rcmpersiano@gmail.com wrote:

The math of your arcs:

Let O be the arc internal opening, t the arc thickness, r1 and r2 the
external radius of the lower and the internal radius of the upper
circles,
then:

the center of the lower circle  C1 = [ O / 2 + t - r1, 0]
the center of the upper circle C2 = [ r2, r2sin(a)+r1sin(a) ]
the concordance point  CP = [C1[0] + r1cos(a), C2[1] - r2sin(a)]

where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )).

This will give you the outer border of the arc. For the inner border,
the
angle a is the same.

Ogee_arc.PNG http://forum.openscad.org/file/n18397/Ogee_arc.PNG

--
View this message in context: http://forum.openscad.org/geom
etry-help-tp18393p18397.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

C1 is a 2D point; it has two components or coordinates; C1[0] is the first; C1[1] is the second. 2016-09-17 22:37 GMT-03:00 Dan Shriver <tabbydan@gmail.com>: > I'm going to play around with both solutions because runsun's is extremely > elegant but might be a huge challange to my brain to get it to do a > generalized ogee. > > runsun: I'm trying to move what you did so the bottom is lying on the x > axis and the top is on the y axis. I can get the bottom on the x axis via > a translate with y value: (r2*(cos(45))) but when I try to do something > similar to get the top in line I can't get it right. > > Ronaldo: I'm not sure what "first component for C1" is > > On Sat, Sep 17, 2016 at 3:31 PM, Ronaldo Persiano <rcmpersiano@gmail.com> > wrote: > >> C1[0] is the first component fo C1, C2[1] the second of C2. Then: >> >> CP = [ O / 2 + t - r1 + r1*cos(a), r1*sin(a)] >> >> 2016-09-16 20:14 GMT-03:00 Dan Shriver <tabbydan@gmail.com>: >> >>> When you say C1[0] and C2[1] do you just mean C1 and C2 or something >>> else? >>> >>> On Fri, Sep 16, 2016 at 7:03 PM, Ronaldo <rcmpersiano@gmail.com> wrote: >>> >>>> The math of your arcs: >>>> >>>> Let O be the arc internal opening, t the arc thickness, r1 and r2 the >>>> external radius of the lower and the internal radius of the upper >>>> circles, >>>> then: >>>> >>>> the center of the lower circle C1 = [ O / 2 + t - r1, 0] >>>> the center of the upper circle C2 = [ r2, r2*sin(a)+r1*sin(a) ] >>>> the concordance point CP = [C1[0] + r1*cos(a), C2[1] - r2*sin(a)] >>>> >>>> where a = acos((r2 - O/2 - t - r1)/( r1 + r2 )). >>>> >>>> This will give you the outer border of the arc. For the inner border, >>>> the >>>> angle a is the same. >>>> >>>> Ogee_arc.PNG <http://forum.openscad.org/file/n18397/Ogee_arc.PNG> >>>> >>>> >>>> >>>> -- >>>> View this message in context: http://forum.openscad.org/geom >>>> etry-help-tp18393p18397.html >>>> Sent from the OpenSCAD mailing list archive at Nabble.com. >>>> >>>> _______________________________________________ >>>> OpenSCAD mailing list >>>> Discuss@lists.openscad.org >>>> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >>>> >>> >>> >>> _______________________________________________ >>> OpenSCAD mailing list >>> Discuss@lists.openscad.org >>> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >>> >>> >> >> _______________________________________________ >> OpenSCAD mailing list >> Discuss@lists.openscad.org >> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >> >> > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org > >
M
MichaelAtOz
Sun, Sep 18, 2016 5:35 AM

DanS wrote

Ronaldo: I'm not sure what "first component for C1" is

See https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/General#Vectors


Admin - PM me if you need anything, or if I've done something stupid...

Unless specifically shown otherwise above, my contribution is in the Public Domain; to the extent possible under law, I have waived all copyright and related or neighbouring rights to this work. Obviously inclusion of works of previous authors is not included in the above.

The TPP is no simple “trade agreement.”  Fight it! http://www.ourfairdeal.org/  time is running out!

View this message in context: http://forum.openscad.org/geometry-help-tp18393p18408.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

DanS wrote > Ronaldo: I'm not sure what "first component for C1" is See https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/General#Vectors ----- Admin - PM me if you need anything, or if I've done something stupid... Unless specifically shown otherwise above, my contribution is in the Public Domain; to the extent possible under law, I have waived all copyright and related or neighbouring rights to this work. Obviously inclusion of works of previous authors is not included in the above. The TPP is no simple “trade agreement.” Fight it! http://www.ourfairdeal.org/ time is running out! -- View this message in context: http://forum.openscad.org/geometry-help-tp18393p18408.html Sent from the OpenSCAD mailing list archive at Nabble.com.
R
runsun
Sun, Sep 18, 2016 4:40 PM

DanS wrote

I'm trying to move what you did so the bottom is lying on the x
axis and the top is on the y axis.  I can get the bottom on the x axis via
a translate with y value: (r2*(cos(45)))  but when I try to do something
similar to get the top in line I can't get it right.

Just translate the whole thing with the correct formula:

r1=20;
r2=40;
a =60;

translate( [0, r2*(sin(a)), 0] ){
rotate( [0,0,-a] ){
translate([-r1,0,0]) pie_slice(r1,0,a, 50);
translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0])
pie_slice(r2,0,a, 50);
}
}


$  Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), runscad.py ( 2 , git ), synwrite ( 2 );   $ tips: hash ( 2 ), matrix ( 2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf )

View this message in context: http://forum.openscad.org/geometry-help-tp18393p18409.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

DanS wrote > I'm trying to move what you did so the bottom is lying on the x > axis and the top is on the y axis. I can get the bottom on the x axis via > a translate with y value: (r2*(cos(45))) but when I try to do something > similar to get the top in line I can't get it right. Just translate the whole thing with the *correct* formula: > r1=20; > r2=40; > a =60; > > translate( [0, r2*(sin(a)), 0] ){ > rotate( [0,0,-a] ){ > translate([-r1,0,0]) pie_slice(r1,0,a, 50); > translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) > pie_slice(r2,0,a, 50); > } > } ----- $ Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), runscad.py ( 2 , git ), synwrite ( 2 ); &nbsp; $ tips: hash ( 2 ), matrix ( 2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid , animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf ) -- View this message in context: http://forum.openscad.org/geometry-help-tp18393p18409.html Sent from the OpenSCAD mailing list archive at Nabble.com.
DS
Dan Shriver
Sun, Sep 18, 2016 4:56 PM

runsun I think I finally got it correct when I translated by twice the
width of the curve (at least it worked on the one case I tested).  Earlier
I was trying trigonometric translations which all failed

On Sun, Sep 18, 2016 at 12:40 PM, runsun runsun@gmail.com wrote:

DanS wrote

I'm trying to move what you did so the bottom is lying on the x
axis and the top is on the y axis.  I can get the bottom on the x axis

via

a translate with y value: (r2*(cos(45)))  but when I try to do something
similar to get the top in line I can't get it right.

Just translate the whole thing with the correct formula:

r1=20;
r2=40;
a =60;

translate( [0, r2*(sin(a)), 0] ){
rotate( [0,0,-a] ){
translate([-r1,0,0]) pie_slice(r1,0,a, 50);
translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0])
pie_slice(r2,0,a, 50);
}
}


$  Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ),
runscad.py ( 2 , git ), synwrite ( 2 );   $ tips: hash ( 2 ), matrix (
2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid ,
animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont ,
tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ;
$ Apps: rollApp , blockscad , openjscad , on AWS ( pdf )

View this message in context: http://forum.openscad.org/
geometry-help-tp18393p18409.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

runsun I think I finally got it correct when I translated by twice the width of the curve (at least it worked on the one case I tested). Earlier I was trying trigonometric translations which all failed On Sun, Sep 18, 2016 at 12:40 PM, runsun <runsun@gmail.com> wrote: > DanS wrote > > I'm trying to move what you did so the bottom is lying on the x > > axis and the top is on the y axis. I can get the bottom on the x axis > via > > a translate with y value: (r2*(cos(45))) but when I try to do something > > similar to get the top in line I can't get it right. > > Just translate the whole thing with the *correct* formula: > > > > r1=20; > > r2=40; > > a =60; > > > > translate( [0, r2*(sin(a)), 0] ){ > > rotate( [0,0,-a] ){ > > translate([-r1,0,0]) pie_slice(r1,0,a, 50); > > translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) > > pie_slice(r2,0,a, 50); > > } > > } > > > > > > ----- > > $ Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), > runscad.py ( 2 , git ), synwrite ( 2 ); &nbsp; $ tips: hash ( 2 ), matrix ( > 2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid , > animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , > tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; > $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf ) > -- > View this message in context: http://forum.openscad.org/ > geometry-help-tp18393p18409.html > Sent from the OpenSCAD mailing list archive at Nabble.com. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
DS
Dan Shriver
Sun, Sep 18, 2016 5:54 PM

runsun: I spoke too soon translating by twice the width only works if
r1=20,r2=10,w=1.  I'm trying to put the top point for the r2 pie wedge on
the y axis

On Sun, Sep 18, 2016 at 12:40 PM, runsun runsun@gmail.com wrote:

DanS wrote

I'm trying to move what you did so the bottom is lying on the x
axis and the top is on the y axis.  I can get the bottom on the x axis

via

a translate with y value: (r2*(cos(45)))  but when I try to do something
similar to get the top in line I can't get it right.

Just translate the whole thing with the correct formula:

r1=20;
r2=40;
a =60;

translate( [0, r2*(sin(a)), 0] ){
rotate( [0,0,-a] ){
translate([-r1,0,0]) pie_slice(r1,0,a, 50);
translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0])
pie_slice(r2,0,a, 50);
}
}


$  Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ),
runscad.py ( 2 , git ), synwrite ( 2 );   $ tips: hash ( 2 ), matrix (
2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid ,
animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont ,
tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ;
$ Apps: rollApp , blockscad , openjscad , on AWS ( pdf )

View this message in context: http://forum.openscad.org/
geometry-help-tp18393p18409.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

runsun: I spoke too soon translating by twice the width only works if r1=20,r2=10,w=1. I'm trying to put the top point for the r2 pie wedge on the y axis On Sun, Sep 18, 2016 at 12:40 PM, runsun <runsun@gmail.com> wrote: > DanS wrote > > I'm trying to move what you did so the bottom is lying on the x > > axis and the top is on the y axis. I can get the bottom on the x axis > via > > a translate with y value: (r2*(cos(45))) but when I try to do something > > similar to get the top in line I can't get it right. > > Just translate the whole thing with the *correct* formula: > > > > r1=20; > > r2=40; > > a =60; > > > > translate( [0, r2*(sin(a)), 0] ){ > > rotate( [0,0,-a] ){ > > translate([-r1,0,0]) pie_slice(r1,0,a, 50); > > translate([r2,0,0]) mirror( [0,1,0]) mirror( [1,0,0]) > > pie_slice(r2,0,a, 50); > > } > > } > > > > > > ----- > > $ Runsun Pan, PhD $ libs: doctest , faces ( git ), offline doc ( git ), > runscad.py ( 2 , git ), synwrite ( 2 ); &nbsp; $ tips: hash ( 2 ), matrix ( > 2 , 3 ), sweep ( 2 , 3 ), var ( 2 ), lerp , animation ( gif , prodVid , > animlib ), precision ( 2 ), xl-control , type , rounded polygon , chfont , > tailRecur ( 2, 3 ), isosphere ( 2 ), area , vol/center , RGB , CurvedImg ; > $ Apps: rollApp , blockscad , openjscad , on AWS ( pdf ) > -- > View this message in context: http://forum.openscad.org/ > geometry-help-tp18393p18409.html > Sent from the OpenSCAD mailing list archive at Nabble.com. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
R
Ronaldo
Sun, Sep 18, 2016 9:47 PM

DanS wrote

runsun: I spoke too soon translating by twice the width only works if
r1=20,r2=10,w=1.  I'm trying to put the top point for the r2 pie wedge on
the y axis

Well, applying my math to runsun code I got:

loin(opening=25, thickness=2, r1=25, r2=40,$fn=60);

module loin(opening, thickness, r1, r2) {
// right hand half
intersection() {
mirror([-1,0]) half_loin(opening, thickness, r1, r2);
square(2*(r1+r2));
}
// mirroring it
intersection() {
half_loin(opening, thickness, r1, r2);
mirror([-1,0]) square(2*(r1+r2));
}
}

// half arc before cutting
module half_loin(opening, thickness, r1, r2) {
// my math
c1x = opening/2 + thickness - r1;
c1y = 0;
c2x = r2;
a = acos((c2x-c1x)/(r1+r2));
translate([-r1cos(a)-c1x, r1sin(a)])
// runsun's code
rotate( [0,0,-a] ){
translate([-r2,0,0]) pie_arc(r2,a,thickness);
translate([r1,0,0])
mirror( [0,1,0])
mirror( [1,0,0]) pie_arc(r1,a,-thickness);
}
}

module pie_arc(r,a,t)
difference() {
pie_slice(max(r,r+t),0,a,50);
pie_slice(min(r,r+t),0,a,50);
}

module pie_slice(r, a0, a1)
intersection(){
circle(r);
rotate( a0) translate([-2r,0]) square(4r);
rotate(-a1) translate([-2r,0]) square(4r);
}

Note that $fn is a global variable. See the OpenSCAD manual
https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Other_Language_Features#.24fa.2C_.24fs_and_.24fn
.

--
View this message in context: http://forum.openscad.org/geometry-help-tp18393p18412.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

DanS wrote > runsun: I spoke too soon translating by twice the width only works if > r1=20,r2=10,w=1. I'm trying to put the top point for the r2 pie wedge on > the y axis Well, applying my math to runsun code I got: > loin(opening=25, thickness=2, r1=25, r2=40,$fn=60); > > module loin(opening, thickness, r1, r2) { > // right hand half > intersection() { > mirror([-1,0]) half_loin(opening, thickness, r1, r2); > square(2*(r1+r2)); > } > // mirroring it > intersection() { > half_loin(opening, thickness, r1, r2); > mirror([-1,0]) square(2*(r1+r2)); > } > } > > // half arc before cutting > module half_loin(opening, thickness, r1, r2) { > // my math > c1x = opening/2 + thickness - r1; > c1y = 0; > c2x = r2; > a = acos((c2x-c1x)/(r1+r2)); > translate([-r1*cos(a)-c1x, r1*sin(a)]) > // runsun's code > rotate( [0,0,-a] ){ > translate([-r2,0,0]) pie_arc(r2,a,thickness); > translate([r1,0,0]) > mirror( [0,1,0]) > mirror( [1,0,0]) pie_arc(r1,a,-thickness); > } > } > > module pie_arc(r,a,t) > difference() { > pie_slice(max(r,r+t),0,a,50); > pie_slice(min(r,r+t),0,a,50); > } > > module pie_slice(r, a0, a1) > intersection(){ > circle(r); > rotate( a0) translate([-2*r,0]) square(4*r); > rotate(-a1) translate([-2*r,0]) square(4*r); > } Note that $fn is a global variable. See the OpenSCAD manual <https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Other_Language_Features#.24fa.2C_.24fs_and_.24fn> . -- View this message in context: http://forum.openscad.org/geometry-help-tp18393p18412.html Sent from the OpenSCAD mailing list archive at Nabble.com.