New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@thi.ng/geom

Package Overview
Dependencies
Maintainers
1
Versions
327
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@thi.ng/geom

Functional, polymorphic API for 2D geometry types & SVG generation

  • 8.1.28
  • latest
  • Source
  • npm
  • Socket score

Version published
Maintainers
1
Created
Source

@thi.ng/geom

npm version npm downloads Mastodon Follow

[!NOTE] This is one of 201 standalone projects, maintained as part of the @thi.ng/umbrella monorepo and anti-framework.

🚀 Please help me to work full-time on these projects by sponsoring me on GitHub. Thank you! ❤️

For the Clojure version, please visit: thi.ng/geom-clj

About

Functional, polymorphic API for 2D geometry types & SVG generation.

This project is a partially ported from the Clojure version of the same name. All polymorphic operations built on @thi.ng/defmulti.

Shape types

The following 2D/3D shape primitives are provided. All these types are implemented as basic data container classes with additional eponymous factory functions (e.g. Circle (class) => circle() (function)), which are encouraged to be used instead of calling class constructors directly. For many shapes there're multiple ways to create them, please also check linked sources and/or docs.

[!IMPORTANT] Support for 3D shapes is WIP and currently limited to the various operations provided by this package, but does not yet find any usage outside (e.g. for visualization). Sill, even the ops supported so far can be useful for many use cases...

Shape/FormDescriptionHiccup support
AABB3D Axis-aligned bounding box(1)
Arc2D elliptic arc
BPatch2D cubic bezier patch (4x4 points)
Circle2D circle
ComplexPolygon2D polygon w/ holes
Cubic2D cubic bezier
Cubic33D cubic bezier(1)
Ellipse2D ellipse
ExtraCustom embedded hiccup/SVG data
Groupgroup of 2D shapes
Group3group of 3D shapes(1)
Line2D line segment
Line33D line segment(1)
Path2D path (w/ optional holes/sub-paths)
Path33D path (w/ optional holes/sub-paths)(1),(2)
Plane3D plane(1)
Points2D point cloud
Points33D point cloud(1)
Polygon2D simple polygon (no holes)
Polygon33D simple polygon (no holes)
Polyline2D polyline
Polyline33D polyline(1)
Quad2D quad (4-gon)
Quad32D quad (4-gon)(1)
Quadratic2D quadratic bezier
Quadratic33D quadratic bezier(1)
Ray2D ray
Ray33D ray(1)
Rectangle2D rectangle
Sphere3D sphere(1)
TextBasic stub for text labels(3)
Triangle2D triangle
Triangle33D triangle(1)
  • (1) valid hiccup format, but currently still missing external tool/library support
  • (2) only lines, cubic & quadratic curve segments supported
  • (3) merely treated as a point in space (e.g. used for placing text labels), no geometry of text itself

Hiccup support

[!NOTE] Sidebar with background information for advanced usage only. Most users can safely ignore this.

With very few exceptions these all are implementing the IToHiccup interface and so can be easily converted (via hiccup) to a variety of other formats, incl. conversion to SVG.

By design, for more flexibility and for performance reasons, the hiccup flavor used by this package is not compatible with that used by thi.ng/hiccup-svg, though the latter provides a convertTree() function for that purpose. This is only needed for some cases of dynamic in-browser SVG DOM creation...

Instead, the hiccup format used here for interim interop is compatible with that used by the thi.ng/hiccup-canvas package (see its readme for details) and avoids extraneous stringification of geometry data and attrib values. A brief example to illustrate some differences:

import { circle, asSvg } from "@thi.ng/geom";
import { convertTree } from "@thi.ng/hiccup-svg";

// a circle with RGBA color attrib
const a = circle([100, 200], 300, { fill: [1, 0.5, 0, 1] });

// invocation of the IToHiccup interface (all shapes support it)
console.log(a.toHiccup());
// [ "circle", { fill: [ 1, 0, 0, 1 ] }, [ 100, 200 ], 300 ]

// convert shape into to a SVG compatible hiccup format
// (i.e. stringify attributes, convert colors etc.)
console.log(convertTree(a));
// [ "circle", { fill: "#ff8000", cx: "100", cy: "200", r: "300" } ]

// asSvg() automatically uses convertTree() when serializing shape(s) to SVG
console.log(asSvg(a));
// <circle fill="#ff8000" cx="100" cy="200" r="300"/>

SVG support

For 2D shape types only, SVG conversion is included via the asSvg() and svgDoc() functions.

Polymorphic operations

The following operations are provided (many also applicable to shape groups directly and/or perform automatic resampling/conversion if needed).

OperationDescription
applyTransforms()applies any spatial transformation attributes
arcLength()compute arc length / perimeter of shape boundary
area()signed/unsigned surface area
asCubic()convert shape boundary to cubic bezier segments
asPath()convert shape to path
asPolygon()convert shape to polygon(s)
asPolyline()convert shape to polyline(s)
asSector()convert arc to sector (path)
asSvg()serialize shape/group/hierarchy to SVG
bounds()compute bounding box
center()center shape around origin or point
centroid()compute shape centroid
classifyPoint()classify point in relation to shape boundary (in/out)
clipConvex()clip shape against convex boundary
closestPoint()compute closest point on shape boundary
convexHull()compute convex hull (2d only)
convolve()kernel based vertex convolution/filtering
edges()extract edges
edgesFromTessellation()extract unique edges from tessellation results
fitIntoBounds2()rescale/reposition a 2D shape into a destination boundary
fitIntoBounds3()rescale/reposition a 3D shape into a destination boundary
fitAllIntoBounds2()rescale/reposition multiple 2D shapes into a boundary
flip()reverse order (vertices or direction)
graphFromTessellation()create graph from tessellation results
intersects()pairwise shape intersection (various types)
mapPoint()transform world space point into local shape UV space
offset()shape/path offsetting
pointAt()compute point on shape boundary at parametric position
pointInside()check if point is inside shape
proximity()distance from point to shape boundary
resample()resample/convert shape
rotate()rotate shape (2D only)
rotateAroundAxis()rotate shape (3D only)
rotateX()rotate shape (3D only)
rotateY()rotate shape (3D only)
rotateZ()rotate shape (3D only)
scale()scale shape (uniformly/non-uniformly)
scaleWithCenter()scale shape with pivot point
scatter()create random points inside a shape boundary
simplify()simplify shape/boundary (Douglas-Peucker)
splitArcLength()split shapes & groups based on max. arc length
splitAt()split shape/boundary at parametric position
splitNearPoint()split shape/boundary near world position
subdivCurve()recursively apply curve subdivision kernel
tangentAt()compute tangent at parametric position
tessellate()(recursively) tessellate shape
transformVertices()apply custom function to each vertex
transform()apply transformation matrix
translate()translate shape
union()compute shape union
unmapPoint()transform local shape UV point into world space
vertices()extract/sample vertices from shape boundary
volume()compute shape volume (3D only)
warpPoint()transfer single point between the local spaces defined by 2 shapes
warpPoints()transfer points between the local spaces defined by 2 shapes
warpPointsBPatch()transfer points to the local spaces of a bezier patch
withAttribs()shallow copy of given shape with new attribs assigned

Shape factory functions

In addition to the above listed direct shape type functions, the following additional shape creation helpers are provided:

AABB
Arc
Bezier patch
Circle
Cubic
Group
Line
Path
Plane
Polygon
Polyline
Quad
Rect
Sphere
Triangle

Constants & presets

Some of the shape operations require configuration with specific algorithms and/or constants. In all cases this relies on a completely extensible mechanism, but the package provides presets for common options/implementations:

Curve subdivision kernels

To be used with subdivideCurve():

Polygon tessellation algorithms

To be used with tessellate():

See thi.ng/geom-tessellate readme for diagrams/illustrations of each algorithm!

Tessellation behaviors:

Tessellation post-processing:

Vertex convolution kernels

To be used with convolve():


This package acts as a higher-level frontend for most of the following related packages (which are more low-level, lightweight and usable by themselves too):

Support packages

Status

STABLE - used in production

Search or submit any issues for this package

Installation

yarn add @thi.ng/geom

ESM import:

import * as geom from "@thi.ng/geom";

Browser ESM import:

<script type="module" src="https://esm.run/@thi.ng/geom"></script>

JSDelivr documentation

For Node.js REPL:

const geom = await import("@thi.ng/geom");

Package sizes (brotli'd, pre-treeshake): ESM: 17.42 KB

Dependencies

Note: @thi.ng/api is in most cases a type-only import (not used at runtime)

Usage examples

37 projects in this repo's /examples directory are using this package:

ScreenshotDescriptionLive demoSource
Basic 2D boid simulation and spatial indexing neighbor lookupsDemoSource
Self-modifying, animated typographic grid with emergent complex patternsDemoSource
Fiber-based cooperative multitasking basicsDemoSource
Polygon point classification (inside/boundary/outside)DemoSource
Shape conversions & operations using polygons with holesDemoSource
Convex hull & shape clipping of 2D polygonsDemoSource
Piechart visualization of CSV dataDemoSource
Embedding thi.ng/hiccup data/elements in thi.ng/geom shape hierarchiesDemoSource
geom-fuzz basic shape & fill examplesDemoSource
Hex grid generation & tessellationsDemoSource
(Re)Constructing the thi.ng logo using a 2D signed-distance fieldDemoSource
SVG path to SDF, applying deformation and converting back to SVGDemoSource
2.5D hidden line visualization of digital elevation files (DEM)DemoSource
Animated, recursive polygon tessellationsDemoSource
Iterating the unique edges of a tessellationDemoSource
Poisson-disk shape-aware sampling, Voronoi & Minimum Spanning Tree visualizationDemoSource
Augmenting thi.ng/geom shapes for WebGL, using instancing & attribute buffersDemoSource
Converting thi.ng/geom shape types for WebGLDemoSource
Mouse gesture / stroke analysis, simplification, corner detectionDemoSource
2D Bezier curve-guided particle systemDemoSource
Animated arcs & drawing using hiccup-canvasDemoSource
Canvas based Immediate Mode GUI componentsDemoSource
Animated sine plasma effect visualized using contour linesDemoSource
k-means clustering visualizationDemoSource
Live coding playground for 2D geometry generation using @thi.ng/pointfree-langDemoSource
2D Poisson-disc sampler with procedural gradient mapDemoSource
Polygon to cubic curve conversion & visualizationDemoSource
Animated, iterative polygon subdivisions & visualizationDemoSource
Quasi-random lattice generatorDemoSource
Minimal rdom-canvas animationDemoSource
Animated Voronoi diagram, cubic splines & SVG downloadDemoSource
2D scenegraph & shape pickingDemoSource
2D scenegraph & image map based geometry manipulationDemoSource
Compute cubic spline position & tangent using Dual NumbersDemoSource
SVG path parsing & dynamic resamplingDemoSource
3D wireframe textmode demoDemoSource
Multi-layer vectorization & dithering of bitmap imagesDemoSource

API

Generated API docs

Authors

If this project contributes to an academic publication, please cite it as:

@misc{thing-geom,
  title = "@thi.ng/geom",
  author = "Karsten Schmidt",
  note = "https://thi.ng/geom",
  year = 2013
}

License

© 2013 - 2025 Karsten Schmidt // Apache License 2.0

Keywords

FAQs

Package last updated on 29 Jan 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc