Resources Numerical accuracy
Calculations
Every calculation under our calculation policies: what it works out, its formula and the precision it runs at. Open one to see its code as it is in the released app.
Calculations
-
Is a matrix a rigid transform
Checks that a matrix is a pure rotation and shift before it is accepted.
|rᵢ·rⱼ − δᵢⱼ| ≤ tol; |det − 1| ≤ tol; last row 0 0 0 1 within tol
Scan registration register.js64-bit- CadCraft
- BimCraft
-
Rotation about an axis
The 4 × 4 matrix for a turn by an angle about an axis through a center.
R = c·I + s·[axis]ₓ + (1 − c)·axis·axisᵀ; t = center − R·center
Scan registration register.js64-bit- CadCraft
- BimCraft
-
Angle and shift of a transform in words
The rotation angle in degrees and the length of the shift that a result is reported with.
angle = acos((trace − 1) ÷ 2); shift = |t|
Scan registration register.js64-bit- CadCraft
- BimCraft
-
Working points of a scan
The thinned copy of a scan's points, measured from the session origin, that registration works on.
work = pos + cloud origin − session origin, every stride-th point
Scan registration register.js32-bit in part- CadCraft
- BimCraft
-
Nearest point in the fixed scans
For a moved point, the closest point of the fixed scans within the match distance.
d² = Δx² + Δy² + Δz², smallest over the grid cells searched ring by ring
Scan registration register.js64-bit- CadCraft
- BimCraft
-
Surface normals
The direction square to the surface at each fixed point, from its 10 nearest neighbors.
normal = eigenvector of the smallest eigenvalue of the neighbors' covariance
Scan registration register.js32-bit in part- CadCraft
- BimCraft
-
Matching and the error of a step
Pairs each moving point with its nearest fixed point and reports the root-mean-square distance, and the distance along the normals.
rms = √(Σ d² ÷ matched); plane rms = √(Σ ((p − q)·n)² ÷ matched)
Scan registration register.js32-bit in part- CadCraft
- BimCraft
-
Point-to-plane step
The small turn and shift that reduce the distances along the normals in one iteration.
minimize Σ ((ω × p + t + p − q)·n)²: 6 × 6 normal equations for (ω, t); R = rotation by |ω| about ω
Scan registration register.js32-bit in part- CadCraft
- BimCraft
-
Solving the 6 × 6 system
Solves the linear equations of the point-to-plane step.
Gaussian elimination with partial pivoting, then back substitution
Scan registration register.js64-bit- CadCraft
- BimCraft
-
When the iteration stops
Decides when a phase has settled and narrows the match distance for the next step.
stop when |previous − error| ≤ tol × max(error, 1e-12) or error < 1e-12; cut = min(start, max(2.5 × rms, 1e-6 × diagonal))
Scan registration register.js64-bit- CadCraft
- BimCraft
-
Pixels to drawing coordinates and back
Maps a pixel of a placed picture to the drawing, a drawing point back to a pixel, and gives the size of one pixel.
block = p + u·px + v·(h − py); drawing = M·block; pixel size = |M·u|
Scanned drawings: size, scale, align, crop and trace scan.js64-bit- CadCraft
-
Arc through three points
The counterclockwise arc through a start, a middle and an end point.
d = 2(aₓ(b_y − c_y) + bₓ(c_y − a_y) + cₓ(a_y − b_y)); center from |a|², |b|², |c|² ÷ d; r = |a − center|
Scanned drawings: size, scale, align, crop and trace scan.js64-bit- CadCraft
-
Traced lines and arcs as drawing objects
Turns a trace result in pixels into lines, arcs and circles in drawing coordinates.
circle r = r(px) × pixel size; arc through start, middle and end
Scanned drawings: size, scale, align, crop and trace scan.js64-bit- CadCraft
-
First size of an attached scan
The size of one pixel when a scan is attached.
per pixel = 25.4 ÷ dpi when the file states it and the drawing has units, else 1; typed width ÷ pixel width
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Scale from two points and a real distance
Rescales a scan so two picked points are a stated distance apart.
f = wanted ÷ |b − a|; insertion′ = a + f·(insertion − a); sx′ = sx·f
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Align by two pairs of points
Moves, turns and optionally scales a scan so two points on it land on two points of the drawing.
f = |d₂ − d₁| ÷ |s₂ − s₁|; θ = atan2(d₂ − d₁) − atan2(s₂ − s₁); insertion′ = d₁ + f·R(θ)·(insertion − s₁)
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Straightening a skewed scan
Turns the picture back by the skew angle that was found or typed.
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Crop window in pixels
The whole-pixel window of a crop and the new corner of the cropped picture.
x₀ = ⌊min⌋, y₀ = ⌊min⌋, x₁ = ⌈max⌉, y₁ = ⌈max⌉; corner = p + u·x₀ + v·(h − y₁)
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Trace tolerance
The tolerance of a trace, typed in drawing units and used in pixels.
tolerance (px) = typed ÷ pixel size, held to 0.5 … 20
Scanned drawings: size, scale, align, crop and trace scan-cmd.js64-bit- CadCraft
-
Outline moved inward
The outline offset inward by a distance, with mitered corners.
corner′ = corner + bisector × d ÷ cos(half angle)
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Signed volume and face direction
Works out whether the faces point outward and refuses a solid with no volume.
V = Σ p₀ · (pᵢ × pᵢ₊₁) ÷ 6 over fan triangles
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Tapered extrusion
A solid whose top is the outline inset by the height times the tangent of the taper angle.
inset = |h| × tan(angle); vertices relative to the outline's minimum x and y
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Revolution about an axis
A solid made by turning the outline about an axis in steps.
n = max(2, ⌈48 × |angle| ÷ 2π⌉); p′ = v·cos θ + (u × v)·sin θ + u(u·v)(1 − cos θ)
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Sweep along a path
A solid made by standing the outline across a path, with mitered corners.
centroid = Σ (pᵢ + pⱼ)wᵢ ÷ 3Σwᵢ, wᵢ = xᵢyⱼ − xⱼyᵢ; frame normal = bisector ÷ cos(half angle)
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Repeated path points
Drops path points that repeat the one before.
|pᵢ − pᵢ₋₁| ≤ 1e-9 → dropped
Tapered, revolved and swept solids shapes3d.js64-bit- CadCraft
-
Pen moves
Moves the pen by a displacement of the shape.
x′ = x + dx × mul ÷ div
SHX font text: strokes and width shx.js64-bit- CadCraft
-
Arcs as chords
Draws an arc of a shape as short straight pieces.
n = max(2, ⌈|sweep| ÷ 7.5°⌉); pointₖ = c + r(cos aₖ, sin aₖ), aₖ = a₀ + sweep × k ÷ n
SHX font text: strokes and width shx.js64-bit- CadCraft
-
Bulge arcs
An arc given by its chord and a bulge value.
θ = 4·atan(b); r = chord ÷ (2·sin(|θ| ÷ 2)); center = chord middle ± r·cos(θ ÷ 2) across the chord
SHX font text: strokes and width shx.js64-bit- CadCraft
-
Octant and fractional arcs
Arcs given by a radius, a starting octant and a span of octants, with optional fractions of an octant.
a₀ = (s₀ + so ÷ 256) × π ÷ 4; center = pen − r(cos a₀, sin a₀)
SHX font text: strokes and width shx.js64-bit- CadCraft
-
Text strokes and width
The strokes of a text for capitals of a given height, and the text's width.
k = h ÷ capital height of the font; width = Σ glyph advance × k
SHX font text: strokes and width shx.js64-bit- CadCraft
-
Width of a text in an SHX font
The width the text layout uses for a text whose style names a loaded .shx font.
width = advance × width factor
SHX font text: strokes and width shx-text.js64-bit- CadCraft
-
Strokes placed in the drawing
Each stroke point of a text taken to drawing coordinates with alignment, width factor, slant and rotation.
lx = x₀ + (gx + gy·tan(oblique)) × wf; X = x + lx·cos − gy·sin; Y = y + lx·sin + gy·cos
SHX font text: strokes and width shx-text.js64-bit- CadCraft
-
Circle through a stroke
The circle that best fits the stroke's points, with its root-mean-square error.
u = x − x̄, v = y − ȳ; solve [Σu² Σuv; Σuv Σv²]·(u_c, v_c) = ½(Σu³ + Σuv², Σv³ + Σvu²); r² = u_c² + v_c² + (Σu² + Σv²) ÷ n
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Turn of a stroke about a center
How far the stroke goes round the fitted center, signed.
Σ (aᵢ − aᵢ₋₁) with each step brought into (−π, π]
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Squaring a direction
Makes a direction level or plumb when it is within a few degrees of it.
q = round(a ÷ (π ÷ 2)) × (π ÷ 2); used when |a − q| ≤ deg × π ÷ 180
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Where two sides meet
The corner where two straight sides cross.
det = l × m; t = ((m₀ − l₀) × m) ÷ det; point = l₀ + l·t
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Distance from a point to a segment
How far a pen point is from the straight line between two others.
t = ((p − a)·(b − a)) ÷ |b − a|², held to [0, 1]; distance = |p − (a + t(b − a))|
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Straight sides and rectangles
Cuts a stroke at its corners, squares each side, and rebuilds the corners where the sides cross.
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
A stroke as a line
Makes a nearly straight stroke a line, exactly level or plumb when it is close to it.
straight when max distance ≤ max(eps, 3.5 % of the gap) and gap > 90 % of the length
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
A stroke as a circle or an arc
Makes a round stroke a circle, or an arc from the stroke's first point to its last.
accepted when rms ÷ r < 0.07 and r < 3 × box diagonal; circle when |turn| > 0.85 × 2π
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Joining loose ends
Pulls each loose end onto the nearest corner of another stroke or of the drawing.
nearest corner with distance ≤ tol; tol = 6 % of the sketch's box diagonal unless given
Pen sketch cleanup sketch.js64-bit- CadCraft
- MarkupCraft
-
Point on a spline
The curve's point at a parameter.
de Boor: dⱼ = (1 − a)·dⱼ₋₁ + a·dⱼ, a = (u − kᵢ) ÷ (kᵢ₊ₚ₋ᵣ₊₁ − kᵢ); point = (Σ w·P) ÷ Σ w
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
Clamped knots
The knot list for a spline that starts and ends on its first and last control points.
p + 1 zeros, 1 … n − p − 1, p + 1 values of n − p
Splines: curve points, fitting and editing spline.jsExact- CadCraft
-
Spline through fit points
Builds the spline that passes through the points picked.
two points: control points at 0, ⅓, ⅔ and 1 of the segment; more: clamped cubic with chord-length parameters
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
Spline from control points
Builds a spline with a given control polygon, clamped or closed.
closed: control points wrapped by the degree, knots 0, 1, 2, …
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
A spline as points
The curve as a list of points for drawing and for anything that works from points.
pieces per span = max(4·max(1, p − 1), ⌈√(polygon length ÷ tol)⌉), within a budget of 4000
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
A spline as a polyline
Points for converting a spline to a polyline, a set number of segments per knot span.
u = a + (b − a) × i ÷ n, n = 1 … 99 (10 unless given)
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
Adding a control point
The same curve with one more control point at a parameter.
Qᵢ = (1 − a)·Pᵢ₋₁ + a·Pᵢ, a = (u − kᵢ) ÷ (kᵢ₊ₚ − kᵢ), in weighted form
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
Reversing a spline
The same curve run the other way.
knot′ = (first + last) − knot, in reverse order
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
-
Control-point spline to fit points
Samples points on a spline and builds a fit-point spline through them.
n points evenly spaced in the parameter (12 unless given, at least 3)
Splines: curve points, fitting and editing spline.js64-bit- CadCraft
A calculation is added only after its source was read. Each statement can be checked in the code shown on its policy's page; the app repositories are public. When a release changes a calculation, its page says so until it has been read again.