script QuickStart {
T = Slider(0, 10, 0, 0.1)
Art = pointcloud for i in -20..20 {
xValue = i / 4
P_i = (xValue, sin(xValue + T))
}
}
Braces define the script and loop blocks. Indentation is encouraged for readability, but it does not change semantics.
1. FluxGeo Syntax and ScriptBlocks
FluxGeo Syntax is the exact, editable language used by the ScriptBlock system and the desktop Input Bar. A ScriptBlock groups durable sliders, scalar expressions, user-defined scalar functions, generated loops, and generated-group styles into one source document.
Use the canonical brace form for all new work:
script Example {
T = Slider(0, 10, 0, 0.1)
Art = pointcloud for i in -20..20 {
P_i = (i, sin(i + T))
}
style Art {
pointSize = 2
visible = true
}
}
Braces define blocks; indentation is cosmetic. Zero indentation is valid, regular indentation is recommended, and tabs or spaces do not change meaning. Braces inside strings and comments do not define blocks. FluxGeo retains the exact submitted source formatting for editing, diagnostics, and save/load.
2. Running a ScriptBlock
Open Run Script... from the CLI panel, paste a complete script Name { ... } wrapper, and choose Run. Desktop compact mode runs on Enter; the expanded editor uses Enter for new lines and Ctrl+Enter to run.
3. Brace-scoped blocks
Script wrappers, generated loops, and style blocks use braces. A missing closing brace produces a structural diagnostic. Legacy script Name:, loop-colon, and inline style-colon forms remain compatibility syntax where the parser still accepts them; they are not the recommended form and all examples in this guide use braces.
4. Scalars and expressions
Scalar expressions support +, -, *, /, %, and ^, plus comparisons <, <=, >, >=, ==, and !=. Logical operators are !, &&, and ||. Boolean values are numeric: true is 1 and false is 0.
if(condition, whenTrue, whenFalse) is lazy: only the selected branch is evaluated. Likewise, && and || short-circuit. Trigonometric functions use radians. The evaluator provides isfinite, isnan, and isvalid checks.
SafeDivide(a, b) = if(b != 0, a / b, 0)
SafeDivide(4, 0) # returns 0 without evaluating 4 / 0
Do not use and, or, not, ?:, or if ... then ... else; those are not v1.4-beta forms.
5. Sliders and animation
Both positional and named Slider forms are supported:
T = Slider(0, 120, 0, 0.05)
T = Slider(
min=0,
max=120,
value=0,
step=0.05,
speed=1,
direction=forward,
mode=bounce
)
direction is forward or backward. mode is stop, wrap, or bounce; the parser also accepts the verified compatibility aliases both, both-directions, and loop. Sliders expose inline Algebra play/pause and speed controls. Script-created Sliders start paused. A Slider at a stop mode ends at its boundary; wrap loops to the other boundary; bounce reverses direction.
Slider values and dependent numeric variables, points, and generated clouds update through their dependency bindings. Slider definitions and values persist through save/load.
6. Conditions and safe expressions
Use comparisons and short-circuit logic to keep generated samples finite. A where clause rejects a tuple before its point output is emitted. Put division guards in the condition or use lazy if for a bounded result.
7. User-defined scalar functions
Square(x) = x^2
Scale(x) = x * T
SafeDivide(a, b) = if(b != 0, a / b, 0)
User functions return scalar values only, require at least one parameter, and use exact argument counts. Parameters are local. Nested calls are supported, but define callees before callers; forward references, recursion, silent redefinition, zero-argument functions, and point-valued returns are rejected. Function names and calls are case-sensitive, while collisions with built-ins, constants, and booleans are rejected case-insensitively.
For dense animated clouds, calculate shared intermediate values as loop-local variables. Repeated nested function calls are readable, but results are not automatically memoized per sample.
# readable, but repeats work at every sample
P_i_j = (Scale(sin(i) + cos(j)), Scale(sin(i) + cos(j)))
# preferred for dense animation
sharedValue = sin(i) + cos(j)
P_i_j = (Scale(sharedValue), Scale(sharedValue))
8. Generated loops
Ranges are inclusive integer ranges. One or two indices are supported, with optional integer step. If the start is greater than the end, the implicit step is -1; explicit descending steps must be negative.
Curve = for i in -20..20 step 2 {
yValue = i^2
P_i = (i, yValue)
}
SafeGrid = pointcloud for i in -5..5, j in -5..5 where j != 0 {
ratio = i / j
P_i_j = (i, ratio)
}
Loop-local scalar assignments and expression-point assignments are evaluated sequentially for each tuple. External sliders and scalars may be referenced. A loop-local assignment is parsed as one physical line; keep each local assignment on one line when the expression itself spans multiple tokens. The body can contain multiple statements separated by lines or semicolons.
9. where, step, and loop-local values
where belongs to the loop header and is evaluated from the loop indices plus external scalar/Slider and function bindings. It runs before the body-local scalar values are computed, so it cannot read ratio, height, or another name assigned inside the body. The filter is useful for safe index conditions such as j != 0; body-local safety belongs in if.
10. for versus pointcloud for versus objects for
Art = for i in -20..20 {
P_i = (i, i^2)
}
Art = pointcloud for i in -20..20 {
P_i = (i, i^2)
}
Art = objects for i in -20..20 {
P_i = (i, i^2)
}
for: automatic representation. Expression-only point output resolves to a compact virtual point cloud; real-object statements resolve to a materialized generated group.
pointcloud for: one compact virtual cloud, no individual scene Points, efficient rendering, sample-aware hover/context information, and empty holes where where filters remove tuples. Virtual samples are not ordinary Point snapping targets and do not create individual DAG nodes.
objects for: one owner group with real generated child objects, ObjectIds, normal selection/snapping/references/dependencies, and child ownership retained by the group.
Verified aliases are cloud for pointcloud and materialized for objects. v1.4-beta has no Materialize command, no Explode command, and no virtual-sample snapping.
11. Styling generated outputs
style Art {
color = rgba(80, 160, 255, 0.75)
opacity = 0.75
pointSize = 2
visible = true
}
Static colors support rgb(r,g,b), rgba(r,g,b,a), #RRGGBB, and #RRGGBBAA. Supported generated-group properties are color, opacity, pointSize, and visible. There is no per-sample styling syntax; labels is intentionally rejected by the generated-group style applicator. Unsupported properties produce a diagnostic. Object Properties is the preferred interactive styling workflow; style blocks are convenient for self-contained scripts.
12. Scripts browser and editor
The Scripts section in the Algebra/Object Browser lists ScriptBlocks, status, revision, source preview, dependencies, and artifacts. Use Edit to open the editor. Editing happens in a transient draft, so typing never changes the last successful construction.
13. Apply, Revert, Undo, and Redo
Apply replaces a ScriptBlock atomically. Revert Draft discards unapplied edits. Closing a dirty editor asks for confirmation. If Apply fails, the previous successful construction remains intact. One Undo restores that previous successful script version; one Redo reapplies the new version.
14. Save/load behavior
Project save/load restores ScriptBlock source and its attached artifacts. Loading does not rerun the script and does not add an extra undo entry. Exact source formatting, including comments and whitespace, is retained for later editing.
15. Reserved names
The application rejects user scalar function names and parameters that collide with built-ins, constants, booleans, or the explicit core command-reserved set below. Built-in and reserved collisions are checked case-insensitively. The larger command-catalog and representation lists are included as authoritative names to avoid in scripts; they are syntax/dispatch tokens, not all hard-rejected by the scalar-function registry. A user function must also be defined before it is called and cannot be silently redefined.
arcsin, arccos, arctan normalize to their a... counterparts. The parser also recognizes asec, acsc, and acot as function identifiers; do not rely on those three as callable v1.4-beta evaluator functions.
Explicit function-reserved command tokens
slider, point, line, segment, circle, polygon, style, for, plot, delete
E(j) = ... is rejected because E matches the reserved constant e without regard to case. Prefer descriptive names such as Eta, RadiusTerm, AngleTerm, OutX, and OutY; avoid relying on one-letter function names.
16. Limits and current restrictions
Compact virtual point clouds are limited to 250,000 samples.
Materialized generated groups are limited to 10,000 children.
User scalar call depth is limited to 64 nested calls; recursion is rejected.
Script source is capped at 1 MiB by the analysis scanner.
Materialized membership cannot depend dynamically on a Slider or external scalar in where; choose a static membership condition or use a virtual cloud.
Point-cloud loops accept loop-local scalar and expression-point statements. Real-object statements require automatic or materialized representation.
17. Troubleshooting
Reserved name: if the diagnostic says function name E is reserved, rename it to Eta.
Unknown function: define called functions earlier in the same script; forward references are not resolved.
Unknown style target: this can be a cascading error when an earlier object or group failed to create.
Empty or malformed brace block: provide both the opening and closing braces and at least one body statement.
Multiline loop-local expression: keep the assignment on one physical line; the generated-body parser splits statements at newlines.
Point cloud versus real Points: use objects for when real child objects are needed.
Failed Apply: the previous successful construction is preserved; correct the diagnostic and Apply again.
Dense animation: compute shared intermediate values once as loop-local scalars to avoid repeated nested function evaluation.
18. Complete examples
Beginner · virtual
Animated wave curve
Purpose: learn one Slider, one loop-local value, and a compact animated cloud.
Creates: one Slider and 201 mathematical samples in a virtual point cloud.
Copyable script
script AnimatedWave {
T = Slider(min=0, max=6.28318, value=0, step=0.05, speed=1, direction=forward, mode=wrap)
Wave = pointcloud for i in -100..100 {
xValue = i / 10
yValue = sin(xValue + T)
P_i = (xValue, yValue)
}
}
Expected result: press play on T; the wave moves through the cloud while the sample count stays fixed. Use Object Properties to adjust point size and color.
Try changing:step, the phase term, or the range. Troubleshooting: if the script is valid but nothing animates, use the Algebra play control; scripts start paused.
Intermediate · virtual
Safe reciprocal field
Purpose: combine two indices, a where filter, and lazy if.
Creates: a virtual 41×41 field with the zero-denominator row removed.
Copyable script
script SafeReciprocal {
Field = pointcloud for i in -20..20, j in -20..20 where j != 0 {
ratio = i / j
height = if(abs(ratio) < 10, ratio, 0)
P_i_j = (i / 4, height)
}
}
Expected result: the middle row is empty, while large reciprocal values are clipped safely to zero. Hover a sample to inspect its virtual index context.
Try changing: the abs(ratio) threshold or the coordinate scale. Troubleshooting: keep j != 0 in the header; body-local ratio is not available to where.
Intermediate · real objects
Real generated parabola points
Purpose: see the difference between a virtual cloud and real generated children.
Creates: one owning generated group with 21 real Point children.
Copyable script
script RealParabolaPoints {
RealPoints = objects for i in -10..10 {
P_i = (i, i^2 / 10)
}
}
Expected result: each child has a real ObjectId and participates in normal generated-object selection, snapping, references, and dependencies. The group remains the owner.
Try changing: the range or the divisor. Troubleshooting: use objects for; pointcloud for intentionally creates no ordinary scene Points.
Advanced · virtual
Optimized ParametricWarp
Purpose: animate a dense parametric field while sharing expensive intermediate values.
Creates: 81 × 361 = 29,241 mathematical samples in one compact cloud; no real Point children.
Expected result: animate with T and scale live with S. Rendering uses internal viewport culling/LOD. Object Properties remains available for presentation changes.
Performance note: the loop-local form avoids repeating nested function work and was measured faster in the project’s dense-cloud profiling; treat that as an optimization principle, not a universal benchmark.
Troubleshooting: if it exceeds the cloud limit after range changes, reduce one range or use a smaller sample grid.
This guide covers triangle center, line, circle, and derived shape constructions.
If you find a bug in v1.4-beta, please report it with:
your .fgeo file
exact steps
expected result vs actual result
1. Choosing triangle inputs
Triangle constructions accept three point-like objects in order, or a single Triangle object, or a compatible 3-vertex Polygon.
The three points define the triangle vertex order:
first selected point = A
second selected point = B
third selected point = C
This ordering matters for excenters and excircles, which are named relative to their opposite vertex.
2. Triangle Centers
2.1 Basic centers
Menu: Triangle → Centers → Basic
Centroid — intersection of the three medians.
Circumcenter — center of the circumcircle (equidistant from all three vertices).
Orthocenter — intersection of the three altitudes.
Incenter — center of the incircle (equidistant from all three sides).
Nine-point center — center of the nine-point circle (midpoint of the orthocenter and circumcenter).
2.2 Excenters
Menu: Triangle → Centers → Excenters
Excenter opposite A — center of excircle A, opposite vertex A (intersection of the external angle bisectors at B and C and the internal bisector at A).
Excenter opposite B — center of excircle B, opposite vertex B.
Excenter opposite C — center of excircle C, opposite vertex C.
2.3 Advanced centers
Menu: Triangle → Centers → Advanced
Symmedian point / Lemoine point — intersection of the three symmedians (reflections of the medians across the angle bisectors).
Gergonne point — intersection of the lines from each vertex to the touchpoint of the incircle with the opposite side.
Nagel point — intersection of the lines from each vertex to the point where the excircle opposite that vertex touches the opposite side.
Spieker center — center of the incircle of the medial triangle (also the incenter of the medial triangle).
2.4 CLI commands
All triangle centers have CLI commands usable from the Input Bar:
Center
CLI command
Centroid
Centroid(A, B, C)
Circumcenter
Circumcenter(A, B, C)
Orthocenter
Orthocenter(A, B, C)
Incenter
Incenter(A, B, C)
Nine-point center
NinePointCenter(A, B, C)
Excenter A
ExcenterA(A, B, C)
Excenter B
ExcenterB(A, B, C)
Excenter C
ExcenterC(A, B, C)
Symmedian / Lemoine point
SymmedianPoint(A, B, C) or LemoinePoint(A, B, C)
Gergonne point
GergonnePoint(A, B, C)
Nagel point
NagelPoint(A, B, C)
Spieker center
SpiekerCenter(A, B, C)
A = (0, 0)
B = (4, 0)
C = (0, 3)
G = Centroid(A, B, C)
O = Circumcenter(A, B, C)
N = NinePointCenter(A, B, C)
3. Triangle Lines
3.1 Euler line
Menu: Triangle → Lines → Euler line
The Euler line passes through the centroid, circumcenter, orthocenter, and nine-point center. It is generated as a line object that updates when the source triangle moves.
There is no dedicated CLI command for the Euler line; use the menu or right-click context menu.
4. Triangle Circles
4.1 Circumcircle
Menu: Triangle → Circles → Circumcircle. Passes through all three vertices. Its center is the circumcenter.
4.2 Incircle
Menu: Triangle → Circles → Incircle. Tangent to all three sides. Its center is the incenter.
4.3 Nine-point circle
Menu: Triangle → Circles → Nine-point circle. Passes through the midpoints of the three sides, the feet of the three altitudes, and the midpoints of the segments from the orthocenter to each vertex. Its center is the nine-point center.
4.4 Excircles
Menu: Triangle → Circles → Excircle opposite ...
Excircle opposite A — tangent to side BC and the extensions of AB and AC. Opposite vertex A.
Excircle opposite B — opposite vertex B.
Excircle opposite C — opposite vertex C.
5. Triangle Derived Shapes
5.1 Medial triangle
Menu: Triangle → Derived Shapes → Medial triangle
The medial triangle connects the three side midpoints of the source triangle. It updates live when the source triangle changes.
6. Desktop workflow
Create or select a triangle input (three points in order, a Triangle object, or a compatible 3-vertex Polygon).
Open the Triangle menu and choose the target construction.
The construction appears on the canvas immediately.
Right-click a compatible selected triangle input to open the context menu. While a construction tool is active, the status bar or hint area shows the current step.
7. Mobile and tablet workflow
Choose the tool from the triangle constructions drawer.
Tap point 1 of 3 (vertex A).
Tap point 2 of 3 (vertex B).
Tap point 3 of 3 (vertex C).
The construction appears immediately.
In dense scenes, a candidate chooser may appear to help you select the correct point.
8. Live behavior, copy/paste, and macros
All triangle constructions are live: moving any source point updates the generated center, line, circle, or medial triangle in real time.
No manual refresh or rebuild is needed.
Triangle companion constructions preserve their live dependencies when copied with their source points.
Generated helper centers and internal vertices remain hidden or internal where applicable.
Triangle centers and companion constructions can be captured in macro definitions. See the Macro / User-defined Tools Guide for details.
This guide covers creating, using, and managing user-defined tools (macros). Macros let you capture a construction as a reusable tool. They replay live semantic geometry — not static coordinate snapshots. When inputs move, macro outputs update in real time.
If you find a bug in v1.4-beta, please report it with:
your .fgeo file
exact steps
expected result vs actual result
1. What macros are
A macro is a user-defined tool built from an existing construction. Macro definition captures:
the construction recipe (ordered creation steps)
ordered input slots (point-like boundary objects)
marked output objects (the visible results)
When you apply a macro, FluxGeo replays the recipe using the picked inputs. Intermediate support geometry is recreated as hidden support objects; it does not clutter the canvas. Outputs receive fresh editable labels on each replay.
Macro definitions persist in the project file (.fgeo) and in a user-wide macro library (~/.config/FluxGeo/macros.json on Linux).
2. Creation workflows
Full-selection path:
Build the construction on the canvas (points, lines, circles, etc.).
Select the entire construction (all objects you want captured).
Open Tools → Macros → Create....
Click "Use selection as inputs" — FluxGeo assigns all free (non-dependent) point-like objects as ordered inputs. You can reorder inputs with the ^/v buttons, or toggle input/output checkboxes in the table.
Click "Use selection as outputs" — FluxGeo marks the final visible objects as outputs.
Enter a Name for the macro.
Click "Create".
Canvas-pick path:
Open Tools → Macros → Create....
Click "Pick input from canvas" — the dialog minimises and the hint area says "Pick input: select a point-like object on the canvas."
Click the desired input in order on the canvas. The dialog reopens.
Click "Pick output from canvas" and click the desired output objects.
Click "Stop picking" when done.
Enter a Name and click "Create".
Terminology:
Inputs — boundary point-like objects the user supplies each time the macro is applied.
Outputs — the visible result objects created by the macro.
Intermediate support — hidden geometry that the recipe requires but that is not marked as output. Support objects are recreated and hidden automatically.
3. Using macros
Open Tools → Macros. The menu lists all defined macros.
Choose a macro name, then click "Use".
The canvas hint area shows: "Select input 1/N: <label>".
Click an existing point-like object, or click empty space to create a new point at that position.
Repeat for each input slot. The hint updates to show the current step.
After the final input, the macro replays the construction. Outputs appear with fresh labels.
Escape or right-click cancels the macro tool. Selecting a different tool also cancels the macro tool.
Managing macros
Rename — Tools → Macros → <name> → Edit.... Change the name in the dialog and click "Save".
Delete — Tools → Macros → <name> → Delete. Confirm deletion in the popup.
Edit (inputs/outputs) — Tools → Macros → <name> → Edit... opens the full macro editor. You can add or remove inputs and outputs, reorder slots, or recapture the recipe from the current canvas selection.
All management actions are undoable.
4. Supported macro families
Category
Specific types
Supported transforms
Points
Free point, ObjectPoint, IntersectionPoint, Midpoint, TriangleCenter, HarmonicConjugate
Inverted line (ReflectCircle), Inverted circle (ReflectCircle), Inverted segment (ReflectCircle)
Transformed inversion images supported
Supported input types
Only point-like objects can be macro inputs: Free Point, ObjectPoint, IntersectionPoint, Midpoint, TriangleCenter, HarmonicConjugate. Slider objects are not accepted as macro inputs.
5. Unsupported and rejected families
Object family
Reason / diagnostic
Analytic (coefficient-only) conics
Conic through 6 coefficients without driver points is not semantically replayable
Conic intersections
Intersection points involving conic parents are not captured
Inverted polygons
Inverted polygon objects are not yet supported
Regular polygons
RegularPolygon capture is deferred
Rigid polygons
RigidPolygon capture is deferred
Transformed triangle-companion circles
Transformed incircle, nine-point circle, excircles, compass, or semicircle circles are rejected
Projective/affine map carriers
ProjectiveMatrix objects are kept as placeholders and rejected
Slider-bound scalar matrices
ScalarMatrix with slider bindings is rejected
Function plots, parametric plots
Plot objects are out of scope for macro capture
Text labels, text objects
Text objects are out of scope
Generated groups
Generated group macro capture is deferred
Sequence generators
Sequence macro capture is deferred
Snapshot fallback objects
Visual-only snapshots (non-semantic) are rejected
6. Good macro examples
6.1 Perpendicular bisector / midpoint helper
Goal: Create a tool that takes two points and produces the midpoint and perpendicular bisector line.
Inputs: A, B (2 points). Outputs: Midpoint M of A and B, Perpendicular bisector line through M.
Construction (build once): Create points A and B. Create Midpoint(A, B). Create PerpendicularBisector(A, B).
6.2 Napoleon triangle macro
Goal: Build the outer Napoleon triangle (equilateral triangles outward on each side of an arbitrary triangle).
Inputs: A, B, C (3 points). Outputs: The three centers of the outward equilateral triangles or the Napoleon triangle itself.
6.3 Five-point conic macro
Goal: Create a tool that takes five points and produces the unique conic through all five.
Inputs: A, B, C, D, E (5 points). Outputs: The conic object through all five points.
6.4 Conic with transform or inversion image macro
Goal: Build a conic, then transform it (rotate/translate) or invert it in a circle.
Example: Create F1, F2 (foci) and P (curve point). Create ellipse1 = Ellipse(F1, F2, P). Create rotation center O. Create r = Rotate(ellipse1, 45°, O). Macro: inputs = F1, F2, P, O; output = r.
6.5 Golden rectangle / pentagon builder
Goal: Build a macro that creates a golden-ratio rectangle from two seed points.
Watch for: Use durable numeric variable GoldenRatio = (1 + sqrt(5))/2 for the golden ratio in your construction. The macro will capture this variable as part of the recipe.
7. Best practices
Pick inputs in intended order.
Only mark final objects as outputs.
Use the full-selection path for complex constructions.
This guide documents the desktop Input Bar / CLI syntax currently supported in FluxGeo v1.4-beta. The ScriptBlock chapter above is the canonical reference for brace-scoped syntax.
1. Quick Start
Type one command per line in the Input Bar.
A = (0, 0)
B = (4, 0)
lineAB = Line(A, B)
m = 0.5
P = A + m * Vector(A, B)
O = (1, 1)
R = Rotate(P, 45°, O)
You can also call commands directly:
Point(2, 3)
Segment(A, B)
Circle(O, A)
2. Numeric Variables and Missing Variables
Durable numeric variables:
m = 0.5
k = 2 + 3
alpha = pi / 4
p = pi
p2 = π
GoldenRatio = pi*(3 - sqrt(5))
theta = 45°
Supported numeric constants: pi/π, e, tau, and phi. Numeric variables are durable scene objects (not temporary parser locals). They can depend on sliders and existing durable numeric variables. Self-dependencies and dependency cycles are rejected.
Missing-variable slider prompt: If an expression uses unknown scalar identifiers, FluxGeo opens a slider prompt instead of creating partial objects.
P = A + t * Vector(A, B)
If t does not exist yet, you get a prompt to create slider t, then command retry.
Scalar measurement functions:
Distance(A, B)
Distance(segmentOrVector)
Length(segmentOrVector)
SquaredDistance(A, B)
SquaredDistance(segmentOrVector)
SquaredLength(segmentOrVector)
3. Point and Coordinate Assignment
A = (2, 3)
B = (2*a, sin(a))
C = (sqrt(t^2+1), min(max(t,0),1))
Point(2, 3)
Coordinate extractors:x(P), y(P) create live dependencies in point expressions.
4. Vectors and Affine Point Expressions
v = Vector(A, B)
P = A + t * Vector(A, B)
Q = A + t * v
R = A - v
S = A + t*v + s*w
Unicode multiplication operators · and × are supported. Nested transforms work:
X = Rotate(Translate(Rotate(A, 30°, O), Vector(B, C)), -45°, O)
5. Barycentric Forms
P = (1-t)*A + t*B
P = t*A + (1-t)*B
P = 0.2*A + 0.3*B + 0.5*C
P = (1-b-c)*A + b*B + c*C
6. Core Construction Commands
Line(A, B)
Segment(A, B)
Ray(A, B)
Vector(A, B)
Circle(Center, RadiusPoint)
Circle(Center, RadiusValue)
Triangle(A, B, C)
Rectangle(A, B)
Polygon(A, B, C, D)
RigidPolygon(A, B, C, ...)
RegularPolygon(A, B, n)
Square(A, B)
Midpoint(A, B)
PerpendicularBisector(A, B)
AngleBisector(Vertex, Arm1, Arm2)
Polar(P, Circle1)
Tangent(P, Circle1, 0)
Intersect(Object1, Object2)
One-line colon syntax is retained only for compatibility. New multiline loops use brace-scoped blocks:
for n in -5..5: P_n = A + n * Vector(B, C)
for i in -2..2, j in -2..2: P_i_j = O + i*u + j*v
Multi-statement form:
for n in -5..5 {
P_n = A + n*v
Q_n = B + n*v
s_n = Segment(P_n, Q_n)
}
Named groups:
Grid = for i in 0..10, j in 0..10 {
P_i_j = A + u*(i/10) + v*(j/10)
}
Supported statement kinds in classic generated loop bodies: Affine point, Rotate, Dilate, Reflect, Segment, Polygon, and Circle. The ScriptBlock pointcloud subset remains limited to loop-local scalars and expression points; use objects for for real generated outputs.
G = for n in 0..11 {
P_n = Rotate(A, (n * 30)°, O)
Q_n = Dilate(P_n, (1 + n * 0.15), O)
s_n = Segment(P_n, Q_n)
}
Batch paste and mobile expanded CLI: All generated loop commands can be submitted as a multi-line batch by pasting multiple commands at once. On desktop, paste directly into the Input Bar and press Enter. On mobile/web, use the + button to open the CLI Batch Input overlay.
Generated groups expose style sections in Properties: generated points (visible, color, size), generated segments (color and thickness), generated polygons (fill color, fill alpha, outline color, outline thickness). Styles persist across regeneration and save/load.
Range editing: edit start, end, step, click Apply range changes.
11. Unit Graph / Distance Graph Workflow
In Algebra → Unit Graph: Compute Unit Distance Graph (transient overlay), Create Unit Graph (persistent object), Exact unit distance toggle, Clear overlay.
Sequence(...) creates a SequenceGenerator object. Generated loops create labeled generated children inside a GeneratedObjectGroup. These are different systems.
Loop syntax errors: missing opening or closing brace, non-integer range bounds, or a label template missing loop variables.
Barycentric rejection: use supported two-point form or constrained three-point form (1-b-c)*A + b*B + c*C.
Locus command rejected: ensure target depends on driver, provide explicit min/max for infinite hosts, use integer sample counts.
15. GUI Locus Tool Workflow
Slider-driven: Create a target point depending on a slider, select the Locus tool, click the target point, click/select the slider driver.
ObjectPoint-driven: Create an ObjectPoint on a supported host, create a dependent target point, select the Locus tool, click the target point, click the driver ObjectPoint.
16. Deferred / Future Features
Not available in v1.4-beta: let m = ... syntax, native Sequence[...] bracket syntax, vector literal shortcuts, and virtual-sample snapping. The supported generated-loop forms are documented in the ScriptBlock chapter above.
17. Example Gallery Files
Use these included scene files for reference and validation: erdos-style-unit-distance-projected-lattice.fgeo, unit-distance-square-lattice.fgeo, generated-affine-cell-grid.fgeo, sequence-spiral-dilate-rotate-triangle.fgeo, function-bell-curve-locus-comparison.fgeo, coordinate-locus-butterfly.fgeo, and more.
4. Object Properties Guide
Object Properties is where you inspect and edit the currently selected object.
If you find a bug in v1.4-beta, please report it with:
your .fgeo file
exact steps and commands
expected result vs actual result
1. What this guide is for
rename object labels
control label display
change style (color, point size, thickness, line style)
edit generated group ranges
adjust Sequence Generator objects
edit function, parametric, and implicit plot properties
inspect Unit Graph properties
create and pin text notes to geometry
2. Opening Object Properties
Select an object on the canvas (or in Algebra).
Object Properties opens for that selection.
Edit the controls shown for that object type.
3. Selecting what you want to edit
Single selection: full object-specific properties are shown.
Multi-selection: shared style controls are shown, then a selected-count summary.
Generated child selection: direct child mutation is blocked. Select the generated group instead.
No selection: Object Properties does not show an object editor.
4. Basic properties
Label — editable for most objects.
Show Label — toggle display.
Read-only information: construction/definition text, exact and approximate coordinates.
5. Style properties
Color, Outline Color (only for object types that support outlines)
Point Size (for point-like selections)
Thickness (for non-point selections)
Line Style: Solid, Dashed, Dotted, TightDashed, WideDashed
Dash Length and Gap Length (when style is not Solid)
Line Type: Infinite Line, Segment, Ray, Vector (line-like objects)
For persistent graph objects: Source, Definition, Target distance, Mode (Exact or Tolerance), Epsilon, Point cap, Points, Edges, Max degree, Average degree. Style controls: Edge Color, Edge Opacity, Edge Thickness.
10. Text objects and pinned text
Creating text: Toolbar category Annotations & UI → Text or right-click a point-like object → Text → Add pinned note.
Editing text content: Content, Font Size, Background Box, Show Bounding Box, Background Color.
Pinning text to an object: Select text object → Pin to point... → Click a point-like host. Moving the host moves the text (offset preserved). To unpin: click Detach.
11. Practical mini-workflows
Rename and show a point label: Select point → edit Label → enable Show Label.
Change a segment color and thickness: Select segment → set Color → set Thickness → adjust Line Style.
Grow a generated grid: Select generated group → edit Start/End/Step → click Apply range changes.
Adjust a Sequence object: Select Sequence → edit expression/range or transform-chain fields.
Edit a plotted function: Select function plot → edit f(x) → click Apply Expression.
Pin a note to an object: Create/select text object → Pin to point... → click a point-like host.
12. Troubleshooting
Properties did not change: Make sure exactly one object is selected.
Cannot edit generated child: Select the generated group for range edits, or use Detach(...).
Changed Start/End/Step but nothing happened: Click Apply range changes.
Text does not stay attached: Confirm Pin to point... completed; check text is not in Pin to screen placement.
This guide explains how to arrange your FluxGeo workspace for different tasks.
If you find a UI bug in v1.4-beta, report it with: your .fgeo file, exact steps, screenshots if possible, expected result vs actual result.
1. What this guide is for
Workspace customization helps you stay focused on: construction, generated geometry and Unit Graph analysis, sequence and plotting work, conjecture and discovery workflows, narrative and project workflows.
UI behavior can differ between desktop, web DOM shell, and touch layouts.
2. The main workspace areas
Tools — tool palette
Global Settings
Algebra — object list and Unit Graph controls (Objects, Unit Graph with actions: Exact unit distance, Compute Unit Distance Graph, Create Unit Graph, Clear)
Object Properties — selection editor
CLI — input bar and command workflow
Project Navigator — narrative projects (opens as separate window)
Tools, Global Settings, Algebra, Object Properties, and CLI are docked or floating windows. You can drag panel title bars or tabs to rearrange docking positions. You can resize docked panel boundaries.
Default arrangement: Global Settings and Object Properties on the left, Tools in the lower-left area, Algebra on the right side, CLI docked near the bottom.
4. Closing and reopening panels
Verified View menu panel toggles: Tools, Global Settings, Algebra, CLI, Project Navigator, Conjecture Observer (if available), Global Styles, Matrix Lab (build-dependent).
Object Properties opens when you select an object and hides when no object is selected. There is no verified Reset Layout menu item in the current UI.
5. Basic construction layout
Keep canvas central and large, keep Tools visible, keep Algebra visible on one side, keep Object Properties visible, keep CLI visible for quick typed commands.
6. Generated geometry and Unit Graph layout
Keep Algebra open and expanded to Objects and Unit Graph, keep Object Properties open for generated range edits, keep CLI visible for loop commands, keep canvas large enough to inspect overlays and dense point sets.
7. Sequence and plotting layout
Keep CLI open, keep Object Properties open, keep Algebra visible for object browsing, leave enough canvas space for curve shape inspection.
8. Discovery and prover layout
If present: Conjecture Observer visible, Algebra visible, Object Properties visible, canvas kept large for geometric context.
9. Narrative project layout
Project Navigator open, Algebra visible, Object Properties visible, canvas centered for step-by-step scene updates. Project Navigator is a dedicated window and may not behave like normal docked panels.
10. Web, mobile, and tablet notes
Desktop and tablet use docked and floating panel workflow. Touch-oriented mobile mode skips desktop dock layout initialization. Web DOM shell mode uses web shell ownership. Do not expect every desktop docking behavior to match web and mobile layouts.
11. Recovering from a confusing layout
Re-enable needed panels from View.
Select an object to bring Object Properties back.
Resize panel boundaries to reclaim canvas space.
Close extra panels not needed for the current task.
Restart the app if panel placement still feels broken.
In this tutorial you will build repeated geometry with command-driven generated loops, reuse generated children in later commands, detach editable snapshots, and inspect unit-distance relationships with Unit Graph tools.
If you hit a bug in v1.4-beta, please report it with: the scene file (.fgeo), the exact commands you typed, what you expected vs what happened.
1. What this guide is for
create repeated geometry quickly with command-driven generated loops
build point families, grids, and multi-output generated structures
reuse generated children in later constructions
detach specific generated children into independent editable objects
run Unit Graph analysis (transient overlay and persistent UnitGraph object)
2. Generated loops vs Sequence Generator
Generated loops: typed as for ... commands, create a generated group with deterministic child labels, support child references like Seq1[2] and Grid.A[0,0], support range edits from Object Properties.
Sequence Generator (Sequence(...)): separate dedicated Sequence object workflow.
3. First generated line of points
A = (0, 0)
B = (1, 0)
C = (0, 1)
u = Vector(A, B)
v = Vector(A, C)
for n in -5..5 { P_n = A + n * u }
4. Two-index grids and lattices
for i in -2..2, j in -2..2 { P_i_j = O + i*u + j*v }
5. Multi-statement generated blocks
for n in -5..5 {
P_n = A + n*v
Q_n = B + n*v
s_n = Segment(P_n, Q_n)
}
Detach currently supports generated point, segment, and polygon children.
8. Editing generated ranges from Object Properties
Select the generated group → edit Start/End/Step under Loop variables → review Preview object count → click Apply range changes.
Range edits are apply-based, not slider-live. Large ranges can make scenes dense/slower.
9. Unit Graph basics
In Algebra → Unit Graph:
Exact unit distance — toggles exact vs tolerance mode
Compute Unit Distance Graph — runs a transient overlay analysis
Create Unit Graph — creates a persistent UnitGraph object
Clear — clears the transient overlay
Overlay can analyze selected points or a selected generated group. Persistent UnitGraph creation requires a selected generated group.
10. Distance Graph basics
For persistent graph objects, Object Properties shows: Source, Definition, Target distance, Mode (Exact or Tolerance), Epsilon, Point cap, Points, Edges, Max degree, Average degree.
11-13. Walkthroughs
Square unit lattice: Open unit-distance-square-lattice.fgeo, select the generated group, run Unit Graph controls, edit Start/End/Step in Object Properties.
Affine cell grid: Open generated-affine-cell-grid.fgeo, inspect generated outputs, select the generated group, edit range values.
Erdos-style projected lattice: Open erdos-style-unit-distance-projected-lattice.fgeo, inspect scene structure, reduce ranges if needed, run Unit Graph analysis.
14. Generated loop body statement reference
Supported statements per iteration: Affine point, Rotate, Dilate, Reflect, Segment, Polygon.
ScriptBlock boundary: real-object statements are materialized outputs, not compact point-cloud samples. Line, Ray, Vector, FunctionPlot, Parametric, ImplicitPlot, and Sequence are not part of the brace-scoped expression-cloud examples in this chapter.
16. Troubleshooting
Loop syntax error: Check for opening and closing braces, non-integer ranges, and valid variable names.
Generated child not found: Verify group label and child index/key syntax.
Scene too dense: Reduce ranges or increase step size.
Unit Graph empty: Verify points are selected, check mode (Exact vs Tolerance).
This guide teaches the dedicated Sequence Generator workflow in FluxGeo. You will learn how to create Sequence objects from the Input Bar, drive them with variables/sliders, edit Sequence properties, and explore the Sequence gallery files.
If you find a bug in v1.4-beta, please report it with: the .fgeo file, the exact commands you typed, what you expected vs what happened.
1. What this guide is for
Use this guide when you want repeated patterns from Sequence(...), including: transform chains (rotate, dilate, translate), point-pattern sequences from coordinate expressions, slider-driven visual experiments.
2. Sequence Generator vs generated loops
Sequence(...) creates a dedicated Sequence object evaluating an expression over an index/range. Generated loops (for ...) create generated groups with generated child references. These are different tools.
Important: GeoGebra-style Sequence[...] is not native FluxGeo v1.4-beta input syntax. Use Sequence(...).
3-4. First Sequence and explicit range
Sequence(30)
Sequence(1, 30, 1)
5-6. Transform-based Sequence patterns
A = (0, 0)
B = (1, 0)
C = (0, 1)
O = (0, 0)
T = Triangle(A, B, C)
s = 0.05
a = 10°
Sequence(Rotate(Dilate(T, 1 + s*k, O), a*k, O), k, 1, 30, 1)
Sequence(Translate(T, q*k*Vector(O,A)), k, 1, 40, 1)
Sequence expressions can use variables. If a variable used in Sequence(...) is missing, FluxGeo can open a slider prompt for missing variables.
9. Editing Sequence properties
Select the Sequence object → open Object Properties → Sequence Generator section. Fields: Body expression, Index variable, Start/End/Increment expression, Visible copies expression, Fill colour. Sequence property edits apply as you edit.
10-14. Walkthroughs
Spiral dilate-rotate triangle:sequence-spiral-dilate-rotate-triangle.fgeo. Expression: Rotate(Dilate(T, 1 + s*k, O), a*k, O). Adjust sliders a and s.
Function Plot section: f(x) expression field, Apply Expression, compile status, bound-slider summary, Use As Default.
Parametric Plot section: x(t) and y(t) expression fields, Apply Expressions, t min and t max range fields.
10. ObjectPoints and Loci on Function Plots
f = Plot(x^2)
P = ObjectPoint(f)
Q = (x(P), f(x(P)))
L = Locus(Q, P, 80)
ObjectPoint(f) is supported for function plots. Parametric plot ObjectPoints are supported. Implicit-plot ObjectPoint/locus drivers are deferred.
11. Implicit plotting status (v1.4-beta)
There is no documented native CLI Implicit(...) command. Use implicit plotting UI/tooling if your build exposes it. Object Properties includes an Implicit Plot f(x,y) section.
This guide explains the user-facing Conjecture Observer workflow for discovery runs, result review, and optional generated-object creation. This panel is explicitly labeled as an experimental observation engine in the UI.
If you find a bug in v1.4-beta, report it with: your .fgeo file, exact steps and settings, screenshots when possible, expected result vs actual result.
1. What this guide is for
run discovery trials on the current construction
review conjectures grouped by verification status
inspect result families such as collinearity, parallelism, concyclicity, and triangle relations
focus and preview selected conjectures on canvas
generate supported integrated objects from selected conjectures
use advanced virtual-helper scanning when needed
2. Availability and opening the panel
Open from View → Conjecture Observer. If present in your desktop default dock layout, it is docked with the right-side panel group.
3. Panel map and primary controls
Trials — number of random trials
Aux lines — auxiliary lines to add
Show obvious / collapsed — toggle visibility of lower-priority results
This guide explains how to turn a geometry construction into a teachable narrative project using Project Navigator, narrative step snapshots, notes, and optional HTML report export.
If you find a bug in v1.4-beta, report it with: your .fgeo and/or .fgproj file, exact steps, screenshots when possible, expected result vs actual result.
1. What this guide is for
Use this guide when you want to present geometry as a structured story — classroom explanation, theorem exploration notes, step-by-step construction walkthrough, research presentation draft, shareable narrative report.
2. What is a narrative project?
In FluxGeo, a narrative project is a sequence of saved step snapshots plus explanatory text. Verified user-facing elements: Project/Proof title, step timeline cards, per-step Step Description, Hypothesis/Given text, Assertion/Proof text, saved narrative project file (.fgproj), optional HTML report export.
3. Opening the narrative UI
Open from View → Project Navigator. Save/load: File → Save Narrative Project... / Load Narrative Project.... Project Navigator opens as its own dedicated window.
4. Recommended workflow
Build or load a construction (the "scene").
Open Project Navigator from View.
Set a project title. (If your Project Navigator editing opens from a form/button, use that.)
Add steps: each construction/observation action becomes a narrative step. For each step, record: Step Description, Hypothesis/Given, Assertion/Proof.
Navigate back and forth through step timeline cards to review the story.
Optionally export the project to an HTML report.
5-6. Preparing the construction, using labels and pinned notes
Before building narrative steps: label key objects clearly with meaningful names, use pinned notes to annotate geometry, organize object hierarchy in Algebra. Keep the scene clean for clearer step snapshots.
7-8. Saving and loading narrative projects
Save Narrative Project... — saved as .fgproj file. Load Narrative Project... — loads a previously saved .fgproj file. The .fgproj file references the .fgeo scene file. If the scene file moves, loading the project may fail.
9. Exporting or generating output (HTML reports)
FluxGeo can export narrative steps to an HTML report for sharing or review. The generated HTML includes step descriptions, hypotheses, and assertions. The export may not include full canvas renders; saved step previews reflect the scene state at capture time.
10. Using discovery/prover results responsibly
If your build includes Conjecture Observer, you can incorporate discovery results into narrative steps. Only use VERIFIED or manually reviewed results in teaching contexts.
11. Example projects
Triangle construction walkthrough: Create a construction step by step (points, segments, triangle, circumcircle, Euler line). Each construction step becomes a narrative step with observations.
Generated geometry investigation: Build a generated lattice or grid, add Unit Graph analysis, note observed patterns.
12. Beta limitations
.fgproj is a separate file from .fgeo. Moving the scene file may break the reference.
HTML export is text-focused and may not include full canvas renders.
No built-in slide-show mode for narrative playback.
Step reordering and editing may be limited in the current panel.
13. Troubleshooting
Cannot open Project Navigator: Check View menu. Not all builds expose it.
Project loads but steps are empty: The .fgproj might reference a moved .fgeo file.
Export HTML shows no content: Check that steps have descriptions saved.
FluxGeo includes example .fgeo scenes that help you learn major workflows quickly.
Use examples to practice: Input Bar and CLI commands, generated geometry and Unit Graph workflows, Sequence Generator patterns, discovery/prover exploration on real scenes, narrative/project write-up workflows.
2. How to open examples
Open FluxGeo.
Use File → Load....
Open a file from the examples/ folder.
Inspect scene objects in Algebra and object settings in Object Properties.
3. Recommended learning order
Basic command/input workflow: start with CLI User Guide.
Generated geometry and Unit Graph: unit-distance-square-lattice.fgeo, generated-affine-cell-grid.fgeo, erdos-style-unit-distance-projected-lattice.fgeo.
A collection of paste-ready CLI batch scripts for the Input Bar (desktop) or the + expanded CLI overlay (mobile/web). Each example is a self-contained block. Paste it as-is, then press Enter / Run. The brace-scoped ScriptBlock examples in the chapter above are the v1.4-beta validation set.
1. ObjectPoint and Locus
Parabola from segment driver
A = (-4, 0)
B = (4, 0)
s = Segment(A, B)
P = ObjectPoint(s)
f = Plot(0.4 * x^2)
Q = (x(P), f(x(P)))
L = Locus(Q, P, 500)
Expected: smooth parabola locus. Drag P along the segment to watch Q trace the curve.
Circle ObjectPoint — Limaçon
O = (0, 0)
R = (3, 0)
c = Circle(O, R)
P = ObjectPoint(c)
K = (1, 0)
Q = Rotate(P, 90°, K)
L = Locus(Q, P, 500)
Expected: a limaçon curve.
Two loci from one driver
O = (0, 0)
A = (3, 0)
c = Circle(O, A)
P = ObjectPoint(c)
K = (1, 0)
Q1 = Rotate(P, 90°, K)
Q2 = Rotate(P, 60°, K)
L1 = Locus(Q1, P, 400)
L2 = Locus(Q2, P, 400)
Sine curve — ObjectPoint on function plot
O = (0, 0)
f = Plot(2 * sin(x))
P = ObjectPoint(f)
Q = Rotate(P, 90°, O)
L = Locus(Q, P, 500)
2. Affine Loops — Flexible Scale
String art parabola envelope
O = (0, 0)
A = (4, 0)
B = (0, 4)
u = Vector(O, A)
v = Vector(O, B)
G = for n in 0..10 {
P_n = O + (n/10)*u
Q_n = O + (n/10)*v
s_n = Segment(P_n, Q_n)
}
Two-index segment grid
O = (0, 0)
A = (1, 0)
B = (0, 1)
u = Vector(O, A)
v = Vector(O, B)
Grid = for i in -2..2, j in -2..2 {
P_i_j = O + i*u + j*v
Q_i_j = P_i_j + u
s_i_j = Segment(P_i_j, Q_i_j)
}
3. Rotate in Loops
Wheel spokes
O = (0, 0)
A = (3, 0)
G = for n in 0..11 {
P_n = Rotate(A, (n * 30)°, O)
s_n = Segment(O, P_n)
}
Maurer rose (d = 71, p = 10)
O = (0, 0)
A = (3, 0)
G = for n in 0..36 {
P_n = Rotate(A, (n * 10)°, O)
Q_n = Rotate(A, (n * 71)°, O)
s_n = Segment(P_n, Q_n)
}
4. Dilate in Loops
Growing spiral arms
O = (0, 0)
A = (1, 0)
G = for n in 0..23 {
P_n = Rotate(A, (n * 15)°, O)
Q_n = Dilate(P_n, (1 + n * 0.1), O)
s_n = Segment(P_n, Q_n)
}
Phyllotaxis sunflower (golden angle)
O = (0, 0)
A = (0.4, 0)
G = for n in 0..29 {
P_n = Rotate(A, (n * 137.5)°, O)
Q_n = Dilate(P_n, (1 + n * 0.12), O)
s_n = Segment(O, Q_n)
}
5. Reflect in Loops
Symmetric string art — reflect over line
O = (0, 0)
A = (4, 0)
B = (0, 4)
u = Vector(O, A)
v = Vector(O, B)
axis = Line(O, A)
G = for n in 0..8 {
P_n = O + (n/8)*u
Q_n = O + (n/8)*v
R_n = Reflect(P_n, axis)
T_n = Reflect(Q_n, axis)
s1_n = Segment(P_n, Q_n)
s2_n = Segment(R_n, T_n)
}
6. Chained Transforms
Rotate then Dilate — expanding fan
O = (0, 0)
A = (3, 0)
G = for n in 0..11 {
P_n = Rotate(A, (n * 30)°, O)
Q_n = Dilate(P_n, (1 + n * 0.2), O)
s_n = Segment(P_n, Q_n)
}
7. Two-Index Loops with Transforms
Grid with Rotate
O = (0, 0)
A = (1, 0)
B = (0, 1)
u = Vector(O, A)
v = Vector(O, B)
Grid = for i in -2..2, j in -2..2 {
P_i_j = O + i*u + j*v
Q_i_j = Rotate(A, (i * 20 + j * 15)°, O)
s_i_j = Segment(P_i_j, Q_i_j)
}
Notes
All angle expressions accept ° suffix. Without it, the value is treated as radians.
pi and π are equivalent in all expressions.
Loop variable n is an integer; divide with / for fractional steps: (n/10).
Same-iteration generated points can be used as the source for Rotate, Dilate, Reflect, and Segment in later statements of the same loop body.
On mobile, paste each example block into the + expanded CLI overlay and press Run.
13. FluxGeo Plotting Examples
This page collects ready-to-paste plotting examples for FluxGeo. It covers explicit functions, parametric plots, implicit plots, generated function families, and points whose coordinates are defined by expressions.
The heavy mixed stress scene (8) combines 12 harmonic sine plots, 22 rational/arctangent plots, 5 implicit plots, 1 parametric spiral, and 81 spiral points. Use only after basic scenes are working smoothly.
14. Tangential Circle Tools Guide
FluxGeo v1.4-beta adds three Tangential Circle construction tools:
2P + Tangent Circle,
P + 2 Tangents Circle, and
3 Tangents Circle.
These let you construct circles that pass through points and are
tangent to lines, segments, rays, or circles.
A tangential circle construction is an
Apollonius-type problem: find a circle that satisfies a
mix of point-passing and tangency constraints.
2P + Tangent Circle — circle through two
points, tangent to one object.
P + 2 Tangents Circle — circle through one
point, tangent to two objects.
3 Tangents Circle — circle tangent to
three objects.
Because these are geometric constraints rather than unique
definitions, there can be multiple valid solution
circles for a given input set. FluxGeo shows all available
solutions as previews and lets you choose the one you want.
Why there can be multiple solutions
Geometric constraints often admit more than one solution. For
example, two points and a line can produce two valid circles
(one on each side of the line), while a point and two circles
can have up to six solutions. The 3 Tangents
Circle (Apollonius problem) can yield up to eight
distinct solution circles.
FluxGeo computes all real solutions within the visible canvas
area and presents them as preview circles before you commit.
Selecting a solution
When a construction has more than one valid solution, FluxGeo
shows ghost preview circles for each candidate:
Preview circles appear in a translucent style so you can
see the underlying geometry through them.
The active candidate is highlighted more
brightly.
Press Tab or Shift+Tab to
cycle forward or backward through candidates.
Press Enter to confirm the highlighted
candidate.
Press Escape to cancel the construction.
Click directly on a preview circle to
select the nearest candidate to your click point.
The confirmed circle is created as a permanent circle object in
the scene.
Smart point input
During any point-input step you can:
Click an existing point to select it.
Click empty canvas to create a free point
at the click location.
Click an object (line, segment, ray,
circle) to create an ObjectPoint on that object. The created
point stays constrained to its host and updates when the
host moves.
Tangent stage behaviour
When the tool expects a tangent object rather than a point:
Clicking a line or circle during a tangent
stage selects that object as the tangent parent.
The click does not create an ObjectPoint
— it selects the object directly for tangency.
This distinction is important: during a tangent stage you cannot
create a point. The next stage determines whether a click
creates a point or selects a tangent parent.
Tool 1: 2P + Tangent Circle
Creates a circle through two points and tangent to one object.
Workflow:
Select or create the first point on the
circle.
Select or create the second point on the
circle.
Select the tangent object (line, segment,
ray, or circle).
If multiple solutions exist, choose a candidate from the
preview.
Confirm with Enter or by clicking the
preview circle.
Example — two points and a line:
Place Point A and Point B.
Draw a Line L.
Activate 2P + Tangent Circle.
Click A, then B, then L.
Two preview circles appear — one on each side of the line.
Tab to the one you want, then Enter.
Example — two points and a circle:
Place Point A and Point B.
Create Circle C.
Activate 2P + Tangent Circle.
Click A, then B, then C.
Browse the preview candidates and confirm.
Tool 2: P + 2 Tangents Circle
Creates a circle through one point and tangent to two objects.
Workflow:
Select or create the point on the circle.
Select the first tangent object.
Select the second tangent object.
Choose a candidate from the preview.
Confirm.
Example — one point, one line, and one circle:
Place Point A.
Draw a Line L and a Circle C.
Activate P + 2 Tangents Circle.
Click A, then L, then C.
Multiple preview circles appear. Choose one.
Tool 3: 3 Tangents Circle
Creates a circle tangent to three objects. This is the
classical Apollonius problem — a circle tangent
to three given circles (where a line is treated as a circle
with infinite radius).
Workflow:
Select the first tangent object.
Select the second tangent object.
Select the third tangent object.
Choose a candidate from the preview.
Confirm.
Example — three lines (incircle and excircles):
Draw three non-concurrent lines forming a triangle.
Activate 3 Tangents Circle.
Click each of the three lines.
Four preview circles appear: the incircle and three
excircles of the triangle formed by the three lines.
Example — two lines and one circle:
Activate 3 Tangents Circle.
Click two lines and one circle.
Up to eight solution circles may appear.
Example — three circles (Apollonius):
Create three circles that do not contain each other.
Activate 3 Tangents Circle.
Click each circle.
Browse the solutions — up to eight circles are tangent to
all three given circles.
Supported tangent objects
Object type
Tangency support
Line
Full support
Segment
Uses supporting-line semantics for tangency
Ray
Uses supporting-line semantics for tangency
Circle
Full support
Conic, function plot, parametric plot, and implicit plot
tangency is not yet supported.
Current limitations
Segment and Ray tangency uses the
supporting full line of the object. The solution circle is
tangent to the infinite line containing the segment or ray,
not to the bounded portion. Tangent-domain validation is
not applied.
Conic tangency is not yet supported.
Function plot, parametric plot, and implicit plot
tangency is not yet supported.
Macro support for tangential circle tools
is not yet available. These tools cannot be captured in
macro definitions.
In dense scenes with many overlapping preview circles,
cycling with Tab / Shift+Tab is the most
reliable selection method.
Troubleshooting — no solution found
If no solution circle is found, FluxGeo displays a brief
notification. This can happen when:
Two points are too far from the tangent object to form a
valid circle.
The geometry constraints are contradictory (e.g., a point
lies inside all circles and no tangent circle through that
point exists).
The input objects are arranged so all real solutions lie
outside the visible canvas area.
Try adjusting the positions of your input objects and retry.
15. Tool Reference
Tool Reference — coming soon
A comprehensive reference of all FluxGeo tools, organized by category, with keyboard shortcuts and expected behavior.
This section will be published in a future update.
Beta note: v1.4-beta features may evolve. When reporting issues, include the file name plus exact steps/commands, your FluxGeo version/build, operating system and browser (for web use), expected result, and actual result.