[OpenJDK 2D-Dev] CubicCurve2D.solveCubic and containment/intersection bugs.

Jim Graham james.graham at oracle.com
Thu Jan 13 02:17:45 UTC 2011


Also, on the testing of the return value, I wouldn't bother with testing 
"% 2".  If you look at Path2D it just assumes that it is an even number 
(or the INTERSECT constant) and does the test based on whether it is 
INTERSECT or non-zero (for WIND_NON_ZERO which is compatible with 
CubicCurve and QuadCurve - I don't think there can be interior holes in 
a either single curve's outline)...

			...jim

On 1/12/2011 6:00 PM, Jim Graham wrote:
> One general comment about the new helper method. I probably wouldn't
> bother loading the control points into local variables since you only
> use them once in the function. It might be wasted effort if the cubic
> function isn't called, and meanwhile you are forcing the compiler to
> find some local storage to stuff them into for no good reason (the
> compiler can't optimize those fetches out or around since it has no
> concept of the potential side effects, or lack thereof, of calling the
> abstract getters)...
>
> ...jim
>
> On 1/12/2011 2:33 PM, Denis Lila wrote:
>> Hi Jim.
>>
>>> I replaced that test with
>>>
>>> if (!getBounds2D().contains(x, y, w, h)) {
>>> return false;
>>> }
>>>
>>> and that fixed both the bug and the performance of (1) without making
>>> (3) worse.
>>
>> It turns out that that test actually slows it down a bit. It was helping
>> us when we were using the PathIterator, but after the introduction of
>> the rectCrossings method you suggested, it's faster in all cases (even
>> (1))
>> to just do the general thing all the time. I've updated the webrev
>> with this.
>>
>> Eliminating the PathIterator also had a large impact on the
>> intersect(rect)
>> method. Now it's about 20% faster in cases (1) and (3). (2) is still
>> slower
>> but only by a factor of 2-3. Here's the webrev for it:
>> http://icedtea.classpath.org/~dlila/webrevs/intersectsFix/webrev/
>> I think the reason (2) is slow is because rectCrossingsForCubic
>> recursively
>> searches through subdivisions of the input curve starting at t=0 and
>> in increasing t. Do you think it would be worth it to switch the order
>> of the recursive calls depending on the distances of the two
>> subdivided curves relative to the rectangle (so that perhaps we would get
>> to the subdivided curve that crosses one of the rectangle sides sooner)?
>>
>> Regards,
>> Denis.



More information about the 2d-dev mailing list