[OpenJDK 2D-Dev] java.awt.geom.Area produces extraneous short segments

Jim Graham james.graham at oracle.com
Tue Mar 6 23:53:08 UTC 2012


Hi Alex,

Are you interested in working on Area?  I'd love to see some 
improvements made to this, but it can get to be a bit like whack-a-bug 
at times with a fix here causing problems over there.  Some areas where 
it could use some "love" would be:

- trying to keep original vertex values around so that when a curve is 
sliced up and then meets copies of itself, they can be mended back into 
larger curves to reduce the amount of "geometry dust" created.  This is 
a subtle improvement, but helps with a lot of repeated operations. 
Basically, when we come up with a new set of curves for the result of an 
operation we may subdivide a curve, but a subsequent Area op might 
require us to compare that new piece of the curve against a piece of 
another curve that we already found the intersection point for.  Due to 
slight rounding errors when subdividing both of the original curves the 
math of comparing them might find a slightly different intersection 
point causing us to subdivide them further - even when those curves were 
not in contention during the subsequent operation.  My thought was that 
if the original vertices were kept around and all comparisons done on 
the original curves (plus start and end t parameters) then the answers 
would remain stable over repeated operations - we'd then do the actual 
subdivision only when force to iterate the answer in a PathIterator.

- caching results of finding the intersection between pairs of curves

- faster convergence on intersection points (or non-intersection) of 
very close, but not quite parallel, curves due to better curve 
comparison math and algorithms

- finally tuning isClose() as a last resort if the above don't help with 
many of the current problems, but I'm hoping that they will help enough 
that isClose() will no longer be seen as the culprit and can remain at a 
high precision

My original test case for working on this code was a basher that 
combined dozens or hundreds of displaced circles orbiting a central 
point (sort of like spirograph except it was many circles rather than a 
spiral) and you could see the performance bog down as the number of 
circles increased.  Test cases with a number of "circle minus 
arc-of-same-circle" tests would also be useful since that is a common 
operation that people try and eventually give up on because we don't 
always notice that the curves are essentially the same with IEEE 
rounding errors...

			...jim


On 3/5/2012 6:06 AM, Alex Lam S.L. wrote:
> I have been using java.awt.geom.Area extensively in my project and
> have been hit hard by the problems due to rounding:
>
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4818309
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724141
>
> There may be a few other reported issues as well which I missed.
>
> I have since found a workaround which at least works well for me - by
> modifying AreaIterator (see attached). Obvious place for improvement
> would be to isClose(), as it is hard-coded to handle a fixed precision
> for now.
>
>
> Regards,
> Alex.



More information about the 2d-dev mailing list