63 Broken Ladders

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.

Opening and Closing

Detail view of line drawings of bridge spans arranged in rows. Each row contains overlapping spans of various sizes in cyan, magenta and yellow ink
Spans (CMY) 2025 – detail

I have work in two exhibitions–one opening this week and one closing:

Closing – The Time Being

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!

Opening – UA Art & Art History 2026 Faculty Biennial Exhibition

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.

Genuary 5

Write “Genuary”. Avoid using a font.

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()