Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

micycle1/Clipper2-java

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

142 Commits
142 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Clipper2-java

A Java port of Clipper2, an open source freeware library that performs robust 2D line and polygon clipping, and offsetting.

What is Clipper2-java?

Clipper2-java is a fast planar geometry library for:

  • Boolean clipping of polygons and polylines: Intersection, Union, Difference, Xor
  • Offsetting / buffering (inflate/deflate) of closed polygons and open polylines (ClipperOffset / Clipper.InflatePaths)
  • Rectangle clipping for polygons and polylines (RectClip, RectClipLines)
  • Minkowski sum/difference
  • Utilities: area, bounds, orientation, simplification (RDP), trimming duplicates/collinear vertices

Usage

Overview

The interface of Clipper2-java aims to match the original C# version closely.

For simple use cases, the static methods in Clipper class are sufficient.

For advanced scenarios (open paths, PolyTree nesting, reusing engines), use Clipper64 / ClipperD directly.

Coordinates & precision

Note Clipper2’s core algorithms operate on integer coordinates for numerical robustness.

  • Use Path64 / Paths64 (with long coordinates) for best performance and robustness.
  • Use PathD / PathsD (with double coordinates) for convenience. These are scaled and rounded to integers internally using a user-specified precision.

Example

Paths64 subj = new Paths64();
Paths64 clip = new Paths64();
subj.add(Clipper.makePath(new int[] { 100, 50, 10, 79, 65, 2, 65, 98, 10, 21 }));
clip.add(Clipper.makePath(new int[] { 98, 63, 4, 68, 77, 8, 52, 100, 19, 12 }));
Paths64 solution = Clipper.union(subj, clip, FillRule.NonZero);
solution.get(0).forEach(p -> System.out.println(p.toString()));

Installation (Maven / Gradle)

Clipper2-java is available as a Maven/Gradle artifact via Jitpack.

Benchmark

lightbringer's Java port of Clipper1 is benchmarked against this project in the benchmarks. Clipper2-java is faster, which becomes more pronounced input size grows.

Benchmark               (edgeCount)  Mode  Cnt  Score   Error  Units
Clipper1.Intersection         1000  avgt    2  0.209           s/op
Clipper1.Intersection         2000  avgt    2  1.123           s/op
Clipper1.Intersection         4000  avgt    2  9.691           s/op
Clipper2.Intersection         1000  avgt    2  0.130           s/op
Clipper2.Intersection         2000  avgt    2  0.852           s/op
Clipper2.Intersection         4000  avgt    2  3.465           s/op

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.