I've been working on the new commons-geometry component for a while
now and I wanted to share with everyone the current state of the
project and what I'm picturing for the future, up to a 1.0 release.
Here is where we are now:
1. All of the original geometry code from commons-math has been
moved to commons-geometry.
2. Code has been split into a number of distinct modules, per Java
3. The old Vector classes have been completely redesigned and
refactored into separate Point and Vector classes to better reflect
the underlying math.
4. All Point and Vector classes are now VALJOs.
5. Support for spherical and polar coordinates has been added.
Here is what I'd like to still accomplish before a 1.0 release (in
order of priority):
1. Add additional Vector methods (GEOMETRY-9) -- This includes
methods like lerp, project, and reject among others. A pull request
has been submitted for this and is in discussion.
2. Vector normalization optimizations (GEOMETRY-10) -- We can
avoid a lot of computation by making some tweaks here. I've started
this but do not yet have a pull request.
3. Add matrix-based AffineTransform?D classes (GEOMETRY-14) -- We
are sorely lacking an API to translate, rotate, and scale.
4. Encapsulate concept of tolerance (GEOMETRY-11) -- We currently
use raw double tolerance values to help determine equality between
floating point numbers. I think we should encapsulate this into a
GeometryContext class to ensure that this is done consistently and to
allow us to easily tweak the algorithm if needed. If anyone has any
ideas for how to best maintain floating point accuracy here, that
would be great.
5. API cleanup for Region, Hyperplane, and BSPTree (no JIRA issue
yet) -- This is a big one and kind of ill-defined. One of the main
gripes I and other people at my work have had with the old
commons-math geometry code was that it was awkward to use. You had to
jump through a bunch of hoops to do things like get the vertices of
the union of two 2D shapes. I'd like to try to clean this up and
streamline some of the common use cases. Comments and feedback on
would be great.
6. BSPTree optimizations (no JIRA issue yet) -- I have some ideas
I'd like to try out to speed up the BSP tree code. My unofficial
benchmark is to convert a model of the Utah teapot I have with ~1000
facets into a PolygonsSet and back. The current code cannot do this.
It takes forever and then fails, I believe due to accumulated
point errors. If we can get the code to be able to do this correctly
and in a reasonable amount of time, then I'd feel good about making a
Thoughts? Comments? I have a project at work coming up near the end
of the year that I'd really love to use commons-geometry on, so
what I'm aiming for in terms of a timeline.