Perpendicular
perpendicular holds two lines at 90° to each other. Unlike horizontal + vertical, it says nothing about the sketch axes — tilt one line and the other follows, still square.
In the viewport
- Click two lines.
- Click Perpendicular. The pair gets a
⊥badge at their junction (or on the second line when they do not meet).


The bracket's corners are drawn roughly; none of them is square.

perpendicular(foot, upright) …Every corner square to the foot and the upright, on the 20° incline.
The code behind it
The foot is held at 20° by an angle against the X axis. Five perpendicular statements (1 DOF each) square every corner of the bracket to the foot and the upright rather than to the sketch axes; two line–line distance dimensions set the leg thickness. Change the incline and the whole bracket rotates, still square.
import { sketch, line, xAxis } from 'fluidcad/core';
import { perpendicular, coincident, fix, distance, angle } from "fluidcad/constraints";
sketch("xy", () => {
// An L-bracket that bolts to a 20° incline. Its foot follows the
// incline, so its corners must be square to the foot — not to the
// sketch axes.
const foot = line([0, 0], [90, 30]);
const upright = line([90, 30], [72, 75]);
const cap = line([72, 75], [64, 72]);
const inner = line([64, 72], [79, 35]);
const back = line([79, 35], [-2, 8]);
const heel = line([-2, 8], [0, 0]);
coincident(foot.end(), upright.start());
coincident(upright.end(), cap.start());
coincident(cap.end(), inner.start());
coincident(inner.end(), back.start());
coincident(back.end(), heel.start());
coincident(heel.end(), foot.start());
fix(foot.start());
angle(xAxis(), foot, 20); // the incline
distance(foot.start(), foot.end(), 95);
distance(upright.start(), upright.end(), 50);
perpendicular(foot, upright); // the bracket's corner
perpendicular(foot, heel); // the foot's end face
perpendicular(upright, cap); // the upright's end face
perpendicular(heel, back); // inner wall square to the heel …
perpendicular(cap, inner); // … and to the cap
distance(foot, back, 8); // leg thickness
distance(upright, inner, 8);
})
In code
perpendicular(a, b) // 1 DOF
Both arguments are lines; the segments do not need to touch. For a fixed 90° that should also follow the sketch axes, use horizontal and vertical instead — they are cheaper for the solver and read better in the timeline.