We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I am modeling this robotic arm and it looks great.
I am also trying to display each angle next to each point of inflexion. In the case of the elbow, I am trying to move the text with the elbow position along with the inflexion point. That works, but I cant find a method to keep the writing horisontal. It rotates with the first segment angle...
here is my function
thanks
void ArmDepiction()
{ ///////////////////////////Base orientation
fill(201, 0, 211); // magenta //text("Y:", LS, spaceDown*3 ); text( (nf(degrees(BaseAngRad), 0, 1)), 630, 1050); //text( "0", 85, 0);
strokeWeight(10); stroke(238,242, 0); noFill ();
// Form: arc(x, y, width, height, start, stop, type); arc(550, 1000, 100, 100, (PI/2), (BaseAngRad+(PI/2)), PIE); //stroke(#71B28F); //arc(100, 1000, 175, 175, 0, 2*PI, 0);
//drawArrow(100,160,50,130);
///////////////////////Arm Depiction strokeWeight(40); stroke(255, 160); strokeCap(ROUND);
float x, y;
x = 550; y = 800;
pushMatrix(); strokeWeight(40); segment(x, y, PI+ShoAngRad); strokeWeight(30); segment1(segLength, 0, PI+ElbowAngRad); // 120 is the starting point segment3(segLength, 0, (2*PI)+ElbowAngRad-0.58); // 100 is the segment length popMatrix();
translate(x, y); strokeWeight(10); strokeJoin(ROUND); beginShape(); vertex(-40, 0);
vertex(-65, segLength); vertex(65, segLength);
vertex(40, 0); endShape(CLOSE);
DisplayElAngle(x, y);
}
void segment(float x, float y, float a) { translate(x, y); fill(201, 0, 211); // magenta //text("Y:", LS, spaceDown*3 ); text( (nf(degrees(ShoAngRad), 0, 1)), 30, 0); //text( "0", 85, 0); noFill ();
rotate(a); line(0, 0, segLength, 0); // 100 is the segment length
}
void DisplayElAngle(float x, float y) { translate(x, y); rotate(2PI); fill(201, 0, 211); // magenta //text("Y:", LS, spaceDown3 ); text( (nf(degrees(ElbowAngRad), 0, 1)), 20, -10); noFill (); //
} void segment1(float x, float y, float a) { translate(x, y); fill(201, 0, 211); // magenta //text("Y:", LS, spaceDown*3 ); text( (nf(degrees(ElbowAngRad), 0, 1)), 20, -10); noFill (); rotate(a); line(0, 0, segLength, 0); // 100 is the segment length // rotate(a);
}
void segment3(float x, float y, float a) { translate(x, y); rotate(a); line(0, 0, (segLength/5), 0); // 100 is the segment length
}
Answers
Solved it myself. Had to make a function just for the letter display.
void segment1(float x, float y, float a) { translate(x, y); fill(201, 0, 211); // magenta //text("Y:", LS, spaceDown*3 ); // text( (nf(degrees(ElbowAngRad), 0, 1)), 20, -10); noFill (); rotate(a); line(0, 0, segLength, 0); // 100 is the segment length DisplayElAngle(x, y);
} void DisplayElAngle(float x, float y) { pushMatrix(); // translate(x, y); rotate (-ElbowAngRad); //Keeping the text horizontal- Compensate for elbow rotation rotate (-ShoAngRad); // Keeping the text Horiz - compensate for Shoulder rot fill(201, 0, 211); // magenta text( (nf(degrees(ElbowAngRad), 0, 1)), 20, -10); noFill (); popMatrix(); // Cancelling all rotations for future text use }
Well done.
Please note that there is a new forum
See also:
https://www.openprocessing.org
Make sure to format your code better in future
Also:
pushMatrix
andpopMatrix
form a block that essentially isolate the translations and rotations etc. inside it against what’s going on after itpushMatrix
stores the current situation of the matrix (coordinate system) on an internal stack,popMatrix
takes the last entry of the stack and restores it, so that the previous translations and rotations etc. are overwrittenChrisir ;-)