I have written generic Point classes, line/line intersection algorithms and Layer administration code more times than I can remember. I don't like menial programming, so this is effectively my code library. But you can use it too!
The language used is Processing, which is a mostly-Java-syntax language. I hardly ever use Java-specific ninja code, so rewriting any of these snippets to your favourite language is less than a minute's worth of work, typically.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73  | /**
 * Let's find out which quadrant a point lies in with respect 
 * to its unit circle axis system. This is very useful for 
 * things like determining whether a point is "above" a line.
 */
void setup() {
  size(400,400);
  ellipseMode(CENTER);
  noCursor();
}
void draw() {
  background(255);
  // line, at an angle
  float ox=20,oy=280,tx=380,ty=180;
  stroke(0,0,255);
  line(ox,oy,tx,ty);
  // mouse line
  float mx=(ox+tx)/2,my=(oy+ty)/2;
  stroke(255,0,0);
  line(mx,my, mouseX, mouseY);
  
  // step 1: get the normalised mouse vector 
  float dx = mouseX-mx,
        dy = mouseY-my,
        len = sqrt(dx*dx+dy*dy);
  dx /= len;
  dy /= len;
  // step 2: get the normalised line vector 
  float dxl = tx-ox,
        dyl = ty-oy,
        llen = sqrt(dxl*dxl+dyl*dyl);
  dxl /= llen;
  dyl /= llen;
  
  // step 3: get the normal (perpendicular) to the line vector
  float p = PI/2;
  float pdx = dxl * cos(p) - dyl * sin(p);
  float pdy = dxl * sin(p) + dyl * cos(p);
  // show what each of these normalised vectors look like
  float cx = 35, cy = 40;
  stroke(255,0,0);
  line(cx,cy,cx+10*dx,cy+10*dy);
  stroke(0,0,255);
  line(cx,cy,cx+10*dxl,cy+10*dyl);
  stroke(255,0,255);
  line(cx,cy,cx+10*pdx,cy+10*pdy);
  stroke(0);
  noFill();
  ellipse(cx,cy,20,20);
  fill(0);
  text("UNIT CIRCLE", cx-30, cy-25);
  text("red: normalised mouse", cx+15, cy-9);
  text("blue: normalised line", cx+15, cy+5);
  text("magenta: perpendicular",cx+15, cy+18);
  // dot product magic: First, the dot product with
  // the original line tells us whether we're to the
  // "left" or "right" of our reference line's anchor,
  // irrespective of whether we're above or below the line.
  float dotproduct = dx*dxl + dy*dyl;
  text("blue: "+(dotproduct<0? "-":"+"),    mouseX+10, mouseY-5);
  // more dot product magic: First, the dot product with
  // the line's normal (perpendicular line) tells us whether
  // we're "above" or "below" the line, irrespective of
  // whether we're left or right of the anchor.
  dotproduct = dx*pdx + dy*pdy;
  text("magenta: "+(dotproduct<0? "-":"+"), mouseX+10, mouseY+5);
} | 
Written and maintained by Mike "Pomax" Kamermans. All code snippets on this site are "do whatever you want with it" licensed.