blob: cba40d855298328df6e3cd97aca101dab5471d0f [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Commons Geometry</title>
</properties>
<body>
<section name="Apache Commons Geometry" href="summary">
<p>
Commons Geometry provides types and utilities for geometric processing. Key features include
</p>
<ul>
<li>Support for Euclidean space in 1, 2, and 3 dimensions</li>
<li>Support for spherical space in 1 and 2 dimensions</li>
<li>Support for geometric elements of infinite size</li>
<li>Support for boolean operations on regions (union, intersection, difference, xor)</li>
<li>Single external dependency (<a href="https://commons.apache.org/proper/commons-numbers/"
>commons-numbers</a>)</li>
</ul>
<p>The code below gives a small sample of the API by computing the difference of cube and an approximation
of a sphere. See the <a href="userguide/index.html">user guide</a> for more details.
</p>
<source class="prettyprint">
// construct a precision context to handle floating-point comparisons
DoublePrecisionContext precision = new EpsilonDoublePrecisionContext(1e-6);
// create a BSP tree representing the unit cube
RegionBSPTree3D tree = Parallelepiped.unitCube(precision).toTree();
// create a sphere centered on the origin
Sphere sphere = Sphere.from(Vector3D.ZERO, 0.65, precision);
// subtract a BSP tree approximation of the sphere containing 512 facets
// from the cube, modifying the cube tree in place
tree.difference(sphere.toTree(3));
// compute some properties of the resulting region
double size = tree.getSize(); // 0.11509505362599505
Vector3D centroid = tree.getCentroid(); // (0, 0, 0)
// convert to a triangle mesh for output to other programs
TriangleMesh mesh = tree.toTriangleMesh(precision);
</source>
<p>Below is an image of the triangle mesh rendered with
<a href="https://www.blender.org/" target="_blank">Blender</a>. The mesh was written as an OBJ file using the code in
<a href="commons-geometry-examples/commons-geometry-examples-io/apidocs/index.html"><em>commons-geometry-examples-io</em></a>.
</p>
<img src="images/cube-minus-sphere.png" />
</section>
<section name="Download Apache Commons Geometry">
<subsection name="Releases">
<p>
Download the
<a href="https://commons.apache.org/geometry/download_geometry.cgi">
latest release</a> of Apache Commons Geometry.
</p>
</subsection>
</section>
</body>
</document>