Arc by 3 Points

Original Post : https://forums.cgsociety.org/t/how-to-create-a-arc-through-3-points-with...

(
	local p1 = point pos:[0,0,0], p2 = point pos:[20,80,0], p3 = point pos:[100,100,0]
	local a = p1.pos, b = p2.pos, c = p3.pos
	fn intersection2d p1 r1 p2 r2 = (
		local dx = p2.x - p1.x, dy = p2.y - p1.y,
		det = r2.x * r1.y - r2.y * r1.x
		p1 + r1 * (dy * r2.x - dx * r2.y) / det
	)
	fn Make_Arc a b c ccw:false = (
		local ab = b - a, bc = c - b, mab = a + 0.5 * ab, mbc = b + 0.5 * bc,
		ab = normalize ab; bc = normalize bc
		if dot ab bc == 1.0 then ( -- draw line if the points are at the same line
			local sp = splineshape(), sl = addnewSpline sp
			addKnot sp sl #Corner #line a; addKnot sp sl #Corner #line c
			updateShape sp ; CenterPivot sp
		)
		else (
			local r1 = [-ab.y, ab.x, ab.z], r2 = [-bc.y, bc.x, bc.z],
			p = intersection2d mab r1 mbc r2, r = distance p a,
			atc = atan2 (p.y - c.y) (p.x - c.x), ata = atan2 (p.y - a.y) (p.x - a.x)
			if ccw then (atc2 = ata ; ata = atc ; atc = atc2)
			arc radius:r pos:p from:(180 + atc) to:(180 + ata)
		)
	)
	Make_Arc a b c
-- 	Make_Arc a b c ccw:true -- in case of arc is inversed points order is ccw
	clearListener()
)