Zalgorithm

Drawing a point from the slope of two points in the Cartesian plane

This is not a math tutorial. See Why am I writing about math?

Related to notes / Drawing dotted lines between points with Processing.

Get the rise by subtracting the y value of point “a” from the y value of point “b”. Get the run by subtracting the x value of point “a” from the x value of point “b”. Get the slope by dividing rise/run.

The slope is the ratio of rise over run. If the slope is known, a new y value that falls on the line can be calculated for any run.

size(400, 400);
textSize(8);
background(235);
fill(25);

translate(width/2, height/2);
scale(1, -1);

int x1 = -123;
int y1 = -44;
int x2 = 157;
int y2 = 99;

int rise = y2 - y1;
int run = x2 - x1;
float slope = float(rise)/float(run);

pushMatrix();
scale(1, -1);
text("slope: " + str(slope), -width/2 + 8, -height/2 + 8);
popMatrix();

strokeWeight(8);
stroke(158, 41, 28);
point(x1, y1);

stroke(46, 28, 158);
point(x2, y2);

float xOffset = 111;
float calculatedX = float(x1) + xOffset;
float calculatedY = float(y1) + slope * xOffset;
stroke(50, 168, 82);
point(calculatedX, calculatedY);

// visually confirm
stroke(122);
strokeWeight(1);
line(x1, y1, x2, y2);

A dynamic version #

Sets the x and y values of the calculated point with the mouseDragged() event:

int x2 = 0;
int y2 = 0;

void setup() {
  size(400, 400);
  textSize(8);
  background(235);
  fill(25);
}

void draw() {
  translate(width/2, height/2);
  scale(1, -1);

  background(235);

  int x1 = -173;
  int y1 = -184;

  strokeWeight(8);
  stroke(158, 41, 28);
  point(x1, y1);
  stroke(46, 28, 158);
  point(x2, y2);

  int rise = y2 - y1;
  int run = x2 - x1;
  float slope = float(rise)/float(run);

  float xOffset = 100;

  float calculatedX = float(x1) + xOffset;
  float calculatedY = float(y1) + xOffset * slope;

  stroke(50, 168, 82);
  point(calculatedX, calculatedY);

  // confirm
  strokeWeight(1);
  stroke(165);
  line(x1, y1, x2, y2);

  pushMatrix();
  scale(1, -1);
  stroke(125);
  text("slope: " + str(slope), -width/2 + 8, -height/2 + 8);
  popMatrix();
}

void mouseDragged() {
  x2 = mouseX - width/2;
  y2 = -1 * (mouseY - height/2);
}

A limitation of relying on the slope to set the new point #

The new point is being calculated from the slope some new run value. For example, if the run is 50, the new x is originalX1 + run, the new y is originalY1 + run * slope. This doesn’t make it possible to accurately do something like always have the new point halfway between the original points. There’s a solution to this problem in notes / Drawing a point from the parametric representation of a line.