ddownn
August 9, 2019, 5:22pm
1
I’m having trouble figuring out how to set “r” so that the small circle is inscribed within the sector. The number of sectors will vary. I would also appreciate help with math to calculate the points where the small circles will be tangent to the sector sides. Any help would be appreciated
I have been looking at this link as a guide. https://math.stackexchange.com/questions/2745269/find-the-radius-of-a-circle-inscribed-in-a-pendant
PVector c;
float d, R, r, n, sectorAngle, offset;
void setup() {
size(400,600);
c = new PVector(width/2, height/2);
d = 300;
R = d/2;
r = R * 0.8; // how to calculate "r" based on different values of "n"
n = 3;
sectorAngle = TWO_PI/n;
offset = -HALF_PI;
}
void draw() {
background(127);
strokeWeight(5);
stroke(0);
fill(175);
pushMatrix();
//
translate(c.x, c.y);
// the circle
ellipse(0, 0, d, d);
// the sector
for(int i = 0; i < n; i++) {
pushMatrix();
///
rotate(i*sectorAngle);
drawSector();
///
popMatrix();
}
// center point
strokeWeight(10);
stroke(0);
point(0, 0);
//
popMatrix();
}
void drawSector() {
PVector a = new PVector(R*cos(0+offset), R*sin(0+offset));
PVector b = new PVector(R*cos(sectorAngle+offset), R*sin(sectorAngle+offset));
PVector bisector = new PVector(R*cos(sectorAngle/2+offset), R*sin(sectorAngle/2+offset));
PVector incircleCenter = new PVector((R-r/2)*cos(sectorAngle/2+offset), (R-r/2)*sin(sectorAngle/2+offset));
// draw sector points
strokeWeight(20);
stroke(200,0,0);
point(a.x, a.y);
point(b.x, b.y);
// draw sector lines
strokeWeight(3);
stroke(200,0,0);
line(0, 0, a.x, a.y);
line(0, 0, b.x, b.y);
// draw sector angle bisector
strokeWeight(1);
stroke(0);
line(0, 0, bisector.x, bisector.y);
//draw incircle
noFill();
ellipse(incircleCenter.x, incircleCenter.y, r, r);
// incircle center point
strokeWeight(10);
stroke(0);
point(incircleCenter.x, incircleCenter.y);
}
1 Like
kll
August 10, 2019, 12:49am
2
looks like the answer is given in the link you provided.
sin(tau/2) = r/(R−r)
but i had to change the r thinking later in your code,
in draw ellipse use ( 2 * r )
in centerpoint use ( R - r )
// https://discourse.processing.org/t/how-to-calculate-the-center-of-a-circle-inscribed-in-a-circle-sector/13279
// https://math.stackexchange.com/questions/2745269/find-the-radius-of-a-circle-inscribed-in-a-pendant
// say sin(tau/2) = r/(R-r)
// try to find r
// sin(tau/2) = 1/(R/r -1)
// R/r = 1/sin(tau/2) + 1
// r = R / (1/sin(tau/2) + 1 )
PVector c;
float d=300, R = d/2, r, n=2, sectorAngle=TWO_PI/n, offset = -HALF_PI;
void setup() {
size(400, 600);
c = new PVector(width/2, height/2);
r = R /(1/sin(sectorAngle/2) + 1 );
println("use key [+] [-]");
}
void draw() {
background(127);
strokeWeight(5);
stroke(0);
fill(175);
pushMatrix();
translate(c.x, c.y);
ellipse(0, 0, d, d); // the circle
for (int i = 0; i < n; i++) { // the sector
pushMatrix();
rotate(i*sectorAngle);
drawSector();
popMatrix();
}
strokeWeight(10); // center point
stroke(0);
point(0, 0);
popMatrix();
}
void drawSector() {
PVector a = new PVector(R*cos(0+offset), R*sin(0+offset));
PVector b = new PVector(R*cos(sectorAngle+offset), R*sin(sectorAngle+offset));
PVector bisector = new PVector(R*cos(sectorAngle/2+offset), R*sin(sectorAngle/2+offset));
PVector incircleCenter = new PVector((R-r)*cos(sectorAngle/2+offset), (R-r)*sin(sectorAngle/2+offset));
// draw sector points
strokeWeight(20);
stroke(200, 0, 0);
point(a.x, a.y);
point(b.x, b.y);
// draw sector lines
strokeWeight(3);
stroke(200, 0, 0);
line(0, 0, a.x, a.y);
line(0, 0, b.x, b.y);
// draw sector angle bisector
strokeWeight(1);
stroke(0);
line(0, 0, bisector.x, bisector.y);
// incircle center point
strokeWeight(10);
stroke(0);
point(incircleCenter.x, incircleCenter.y);
//draw incircle
noFill();
strokeWeight(1);
ellipse(incircleCenter.x, incircleCenter.y, 2*r, 2*r);
}
void keyPressed() {
if ( key == '+' ) n++;
if ( key == '-' & n > 2 ) n--;
println("new n "+n);
sectorAngle=TWO_PI/n;
r = R /(1/sin(sectorAngle/2) + 1 );
}
is that what you need?
2 Likes
ddownn
August 10, 2019, 1:57am
3
Yes, that’s what I was trying for, thank you! I tried all kinds of ways to rearrange that equation, like a bear playing badminton.
Thanks for showing how to rearrange it to solve “r”
The Wolfram online rearranger widget says r = (R sin(tau/2)) / (sin(tau/2) + 1)
but that didn’t work.
2 Likes
kll
August 10, 2019, 9:16am
4
you can divide that by sin(tau/2)
and you get
r = R / ( 1 + 1/sin(tau/2) )
what is same like i used.
ddownn:
but that didn’t work.
possibly because of the 2 problems i mentioned above,
in draw ellipse use ( 2 * r ) / you used ( r )
in centerpoint use ( R - r ) / you used ( R -r/2 )
1 Like