I mailed my postcards for this year’s plotter postcard exchange. The design this year is “63 of 255 possible broken 8 rung ladders (in order) + 1 complete 8 rung ladder.” I plotted the cards using an Axidraw SE/A3 with a Staedtler pigment liner for the black lines and a Sakura Pigma PN for the red.
Curated by Lauren Nye and Nandini Makrandi of the Hunter Museum of American Art, The Time Being is a group show in Chattanooga, Tennessee, of work from 2025 Stove Works residents. My work Spans (CMY), a set of three plotter prints, is included. All the work in the show is for sale with proceeds benefiting Stove Works. Pick up individual pieces (1, 2, 3) or buy the whole set. Act fast, because the show closes on Saturday, January 17!
I have a new set of bridge-related plotter art work in the faculty biennial show at the Sarah Moody Gallery of Art on the campus of the University of Alabama in Tuscaloosa, Alabama. The exhibition opens Thursday, January 15 and runs through February 20. There’s an opening reception tomorrow, January 15 from 4-6pm.
I made these letters using the loop drawing algorithm I created for my Loop Line Logics series of plots. The Processing function code is below.
void hhAdjustaLoop(float x, float y, float loopWidth, float loopHeight, float loopLean, float loopEnd) {
/* draws adjustable loops
* extra curves added to start and end points to smooth out transitions
*/
float loopCenter = 0.5 * loopEnd; //calculate center position for the loop proportional to the end point
//derive anchor and control points - this keeps c1c2 and c3c1 always in the middle
//in order keep straight lines between control points and prevent kinks
//curve1
PVector c1a1 = new PVector(0, 0);
PVector c1c1 = new PVector(0, 0);
PVector c1c2 = new PVector(loopCenter, 0);
//the next PVectors are all assigned dynamically based on loopHeight value
PVector c1a2 = new PVector(0, 0); //declare a new PVector
//curve2
PVector c2c1 = new PVector(0, 0); //declare a new PVector
PVector c2c2 = new PVector(0, 0); //declare a new PVector
PVector c2a2 = new PVector(0, 0); //declare a new PVector
if (loopHeight > 0) {
c1a2.set(loopCenter+loopWidth+(loopLean*1.0), loopHeight*0.5-(loopLean*0.5));
c2c1.set(loopCenter+(loopWidth*2.0)+(loopLean*2.0), loopHeight-(loopLean*1.0));
c2c2.set(loopCenter-(loopWidth*2.0)+(loopLean*2.0), loopHeight+(loopLean*1.0));
c2a2.set(loopCenter-loopWidth+(loopLean*1.0), loopHeight*0.5+(loopLean*0.5));
} else {
c1a2.set(loopCenter+loopWidth+(loopLean*1.0), loopHeight*0.5+(loopLean*0.5));
c2c1.set(loopCenter+(loopWidth*2.0)+(loopLean*2.0), loopHeight+(loopLean*1.0));
c2c2.set(loopCenter-(loopWidth*2.0)+(loopLean*2.0), loopHeight-(loopLean*1.0));
c2a2.set(loopCenter-loopWidth+(loopLean*1.0), loopHeight*0.5-(loopLean*0.5));
}
//curve3
//PVector c3c1 = new PVector(loopCenter-loopWidth+(loopLean*1.0), (loopHeight*0.5)+(loopLean*0.5));
PVector c3c1 = new PVector(loopCenter, 0);
PVector c3c2 = new PVector(loopEnd, 0);
PVector c3a2 = new PVector(loopEnd, 0);
pushMatrix();
translate(x, y); //move to starting point
beginShape();
vertex(c1a1.x, c1a1.y); //first point
bezierVertex(c1c1.x, c1c1.y, c1c2.x, c1c2.y, c1a2.x, c1a2.y); //transition from start to center curve
bezierVertex(c2c1.x, c2c1.y, c2c2.x, c2c2.y, c2a2.x, c2a2.y); //center curve
bezierVertex(c3c1.x, c3c1.y, c3c2.x, c3c2.y, c3a2.x, c3a2.y); //transition from center curve to end
endShape();
popMatrix();
} //end hhAdjustaLoop()