Coincident
coincident makes two points the same point, or holds a point on an entity. It is the constraint that closes profiles: consecutive lines and arcs are separate entities until their ends are made coincident.
In the viewport
- Click two points (the end of one line and the start of the next), or a point and a line / arc / circle.
- Click Coincident. Two points snap together and share one dot; a point on an entity shows the
⊙badge and slides along it.
With Auto-constraints → Infer while drawing on, snapping a new segment's end onto an existing vertex writes this statement for you — most corners never need the button.


Six loose lines. The corners are drawn near each other, but nothing joins them, and the hole floats beside the centreline.

coincident(base.end(), toe.start()) …Every corner closed into one shared dot, and the hole's center held on the centreline.
The code behind it
Six coincident statements close the bracket's corners (2 DOF each); without them the outline is six loose segments. The last one holds the fixing hole's center on a guide centreline — the point-on-entity form removes 1 DOF, so the hole can still slide up and down the upright.
import { sketch, line, circle } from 'fluidcad/core';
import { coincident, horizontal, vertical, fix, distance, diameter } from "fluidcad/constraints";
sketch("xy", () => {
// An L-bracket outline drawn as six loose lines — the corners do
// not meet yet.
const base = line([0, 0], [70, 0]);
const toe = line([76, 6], [72, 16]);
const inner = line([66, 11], [16, 9]);
const rise = line([10, 15], [8, 62]);
const top = line([13, 66], [-5, 63]);
const back = line([-2, 57], [3, -6]);
coincident(base.end(), toe.start()); // point ↔ point: close each corner
coincident(toe.end(), inner.start());
coincident(inner.end(), rise.start());
coincident(rise.end(), top.start());
coincident(top.end(), back.start());
coincident(back.end(), base.start());
horizontal(base);
horizontal(inner);
horizontal(top);
vertical(toe);
vertical(rise);
vertical(back);
fix(base.start());
distance(base.start(), base.end(), 70);
distance(back.start(), back.end(), 60);
distance(base, inner, 12); // leg thickness
distance(back, rise, 12);
// A point can also be held ON an entity: the fixing hole's center
// stays on the upright's centreline, free to slide along it.
const centreline = line([6, 20], [6, 50]).guide();
vertical(centreline);
distance(back, centreline, 6);
const hole = circle([10, 40], 5);
coincident(hole.center(), centreline); // point ↔ line
diameter(hole, 5);
distance(base, centreline.start(), 20);
distance(centreline.start(), centreline.end(), 30);
})
In code
coincident(l1.end(), l2.start()) // point ↔ point: 2 DOF
coincident(c.center(), l) // point on a line's infinite extension: 1 DOF
coincident(p, c) // point on a circle / arc's circumference: 1 DOF
coincident(p, l.mid()) // point at a line's midpoint (lowers to midpoint())
coincident(c.center(), origin()) // point on a datum
The point-on-line form uses the infinite line, not just the segment. l.mid() is accepted only by coincident; it is written out as a midpoint constraint.