Commit graph

513 commits

Author SHA1 Message Date
Jan
04cab797db Improve clipConvexHullPart()
Separately handle special cases
2015-10-06 15:25:40 +02:00
Jan
ea035bd9e4 New getConvexHull() 2015-10-06 15:19:33 +02:00
Jürg Lehni
b3d45b6624 Some code clean-up in addCurveIntersections() 2015-10-05 19:32:13 +02:00
Jürg Lehni
c8132584b9 Pass on original curves to addLocation(), to correctly determine p1 and p2.
This fixes one glitch in @iconexperience's test suite.
2015-10-05 19:31:38 +02:00
Jürg Lehni
1f03b00f99 Remove handling of converged fat-line, as it causes issues.
Example 23 in #784 was caused by this, and the code's removal has not produced any new issues, while it solved 6 issues in @iconexperience's test suite.

Closes #795
2015-10-05 17:20:56 +02:00
Jürg Lehni
86b1b74869 Prevent detection of tiny overlaps and streamline addOverlap() code. 2015-10-03 12:55:32 -05:00
Jürg Lehni
2bed611648 Improve Curve#getPart() to directly handle reversed curves and write docs for it. 2015-10-03 12:55:05 -05:00
Jürg Lehni
6fb4b7e3c4 Change the way overlaps are detected in lines.
We don't really care weather they are actually fully collinear, we only really care about the distances from the beginnings- and end-points of one line from the other, since that proximity will affect results elsewhere.
2015-10-03 11:46:50 -05:00
Jürg Lehni
2167e458ae Since we're using sorting now, we can add all start- / end-point intersections before finding the ones within the curves. 2015-10-03 10:38:45 -05:00
Jürg Lehni
c0bb6890bd Switch back to CURVETIME_EPSILON now that overlap edge-case appears to be handled. 2015-10-01 20:47:56 -05:00
Jürg Lehni
9b883e5fb6 Introduce new TRIGONOMETRIC_EPSILON with higher precision than GEOMETRIC_EPSILON. 2015-10-01 20:44:27 -05:00
Jürg Lehni
f5012a78e9 Reformat nested ternary operators again.
This got messed up in a recent refactoring.
2015-10-01 20:24:47 -05:00
Jürg Lehni
72f9705615 Fix overeager refactoring in c77165be3a 2015-10-01 08:49:26 -05:00
Jürg Lehni
fee3a90329 Fixed leaked globals. 2015-10-01 07:05:00 -05:00
Jürg Lehni
b8c6eb46ad Fix weirdness of Curve#divide() modifying the wrong Curve object. 2015-10-01 06:52:08 -05:00
Jürg Lehni
c77165be3a Fix issue in Curve#divide() that lead to intersection segments being linked up wrongly.
Relates to #784
2015-10-01 06:21:17 -05:00
Jürg Lehni
53dd726057 Rename ignoreStraight argument to _setHandles 2015-10-01 05:55:22 -05:00
Jürg Lehni
75a004187e Improve Line.intersect() to more reliably find interesctions at the beginnings / ends.
Relates to #784
2015-10-01 04:38:48 -05:00
Jürg Lehni
53ff973f06 Perform the faster check first. 2015-10-01 03:38:35 -05:00
Jürg Lehni
5f706a4a5d Use lower tolerance in bezier clipping code.
This really should be Numerical.CURVETIME_EPSILON, but I get better results using Numerical.GEOMETRIC_EPSILON. Perhaps Numerical.CURVETIME_EPSILON / 2 is the right value to use though.
2015-09-30 14:19:40 -05:00
Jürg Lehni
9bcf369e6a Ony split potentially self-intersecting curves if there are actual canditates. 2015-09-30 13:44:51 -05:00
Jürg Lehni
45040abc53 More clean-ups for #773
- Use local variables instead of array lookups for values used repeatetly, and merge with pre-existing variables.
- Add some more comments and reference to long explaining post in issue.
2015-09-30 13:40:01 -05:00
Jürg Lehni
1231153553 Start cleaning up code from #773
- Use Line object isntead of static methods
- Do not rely on Math.sign() as it's not supported on all browsers
- Wrap lines at 80 char width.
2015-09-30 13:07:55 -05:00
Jürg Lehni
07874034e9 Merge pull request #793 from iconexperience/Fix-for-#773
Fix for #773
2015-09-30 11:51:37 -05:00
Jan
ec70fa1806 Fix for #773
Indroduced more reliable method for finding self intersection on curves.
2015-09-30 12:19:09 +02:00
Jürg Lehni
317b809fee Only calculate non-parametric bezier curve if values are actually used. 2015-09-26 11:46:54 -05:00
Jürg Lehni
ea3cc63e2e Reformat code a bit. 2015-09-26 07:41:03 -04:00
Jan
3fa810a557 Bugfix for #791 and performance improvement
Prevent infinite loop for degenerate curve. Additionally only calculate sy if necessary and save one call to `Curve.solveCubic`
2015-09-26 07:36:12 -04:00
Jürg Lehni
fd927cbe22 Properly solve issues with self-intersecting special case.
(e.g. shapes resembling the infinity sign)
2015-09-24 12:49:39 -04:00
Jürg Lehni
cc7e60e51a Revert db1ecdddd5 and fix issue properly this time.
Hopefully?
2015-09-23 12:44:00 -04:00
Jürg Lehni
20f950ac65 Implement #isFirst() / #isLast() tests on Segment and Curve. 2015-09-23 12:26:44 -04:00
Jürg Lehni
db1ecdddd5 Fix filtering of locations at ends of curves in addCurveLineIntersections()
Only occured when the line / curve had to be flipped.
2015-09-21 16:56:08 -04:00
Jürg Lehni
84bcc537e1 Simplify addCurveLineIntersections() and exclude end points. 2015-09-21 12:13:53 -04:00
Jürg Lehni
e36319b71a Give PathItem#getIntersections() a way to filter found intersections right away.
And use it in #getCrossings()
2015-09-21 10:41:59 -04:00
Jürg Lehni
b5af47a7b1 Implement a better approach to calculate Path#clockwise...
...merging code with Path#area.

Closes #788
2015-09-18 21:41:54 +02:00
Jürg Lehni
10eafccd1a Implement 0.75 * handle scaling in curve bounds checks. 2015-09-18 21:09:57 +02:00
Jürg Lehni
17dc5eb51a Allow gettings of unstyled bounds on curves without paths. 2015-09-18 20:15:18 +02:00
Jürg Lehni
ae93652b56 Clean up getIntersection() methods.
Now that they filter the results on the fly.
2015-09-18 17:31:23 +02:00
Jürg Lehni
9c812335e5 Curve._filterIntersections() is now without a job. 2015-09-17 09:39:22 +02:00
Jürg Lehni
2750c34090 Improve the way intersections are sorted and merged.
Use a binary search to determine insertion index and compare with neighbours to eliminate doubles.
2015-09-17 01:03:13 +02:00
Jürg Lehni
30f1441c26 Various boolean code clean-ups. 2015-09-16 18:34:35 +02:00
Jürg Lehni
d0332f843f Renamed Curve#reverse() and Segment#reverse() to #reversed()
Since they don't modify the object. Also introduce new Segment#reverse(), which does.
2015-09-16 18:16:48 +02:00
Jürg Lehni
e548391276 Use the zero-epsilon when checking beginnings and ends of curves for overlaps.
Relates to #786 and #777
2015-09-16 02:33:56 +02:00
Jürg Lehni
7aef20ae6b Compare intersection points instead of curve time when deciding to merge.
Use same precision indepenent of curve length.
2015-09-14 15:18:44 +02:00
Jürg Lehni
e2d2c836e5 Some boolean code clean-up. 2015-09-13 14:19:56 +02:00
Jürg Lehni
ea2ff5ec28 Increase precision in Curve.getParameterOf()
Usually only requires 0-1 more iteration.
2015-09-13 13:45:20 +02:00
Jürg Lehni
d84a84c67f Change the way winding contributions are propagated
The new approach preserves segment sequence.

Relates to #777
2015-09-13 13:06:01 +02:00
Jürg Lehni
19c9a0e722 Use the correct points on curve2 when checking intersections at beginnings and ends. 2015-09-13 11:52:17 +02:00
Jürg Lehni
d62caf6faa Introduce CURVETIME_EPSILON, to be used when handling curve time parameters.
Relates to #777
2015-09-12 22:55:58 +02:00
Jürg Lehni
4f04dae20f Use the correct GEOMETRIC_EPSILON when matching beginnings and ends of curve in Curve.getParameterOf()
Relates to #777
2015-09-12 22:26:16 +02:00
Jürg Lehni
a0730756c1 Use correct term for curve parameter renormalization. 2015-09-12 22:13:18 +02:00
Jürg Lehni
085cdd74a2 Use GEOMETRIC_EPSILON when comparing curve start / end points.
Relates to #777
2015-09-12 21:56:53 +02:00
Jürg Lehni
3da921a0b0 Improve CompoundPath#reduce() to properly reduce suppaths.
Relates to #779
2015-09-12 11:43:41 +02:00
Jürg Lehni
fb5f8c0115 Introduce GEOMETRIC_EPSILON, for isOrthogonal(), isCollinear() and overlap checks.
Relates to #777
2015-09-12 10:35:47 +02:00
Jürg Lehni
35f3ac87bf Change checks for startConnected / endConnected to support compound-paths.
Closes #778
2015-09-12 10:12:17 +02:00
Jürg Lehni
86f404123e Minor code tweaks. 2015-09-11 12:07:27 +02:00
Jürg Lehni
04452730dd Simplify CurveLocation data structures.
Directly creating and linking intersections simplifies things a lot.
2015-09-09 17:17:49 +02:00
Jürg Lehni
abf70378fe Some more code fixes.
One was breaking unit tests.
2015-09-09 08:15:43 +02:00
Jürg Lehni
70f8f1912f Some code clean-up. 2015-09-09 08:06:59 +02:00
Jürg Lehni
332b09c534 More curve interesection optimizations.
Only evaluate points if locations are actually added.
2015-09-09 07:46:48 +02:00
Jürg Lehni
dae8bb630b Avoid checking curves if completely out of control bounds.
This leads to a huge speed increase! Relates to #765
2015-09-09 07:34:28 +02:00
Jürg Lehni
1c1e19614e Avoid matching connected start- and end points when self-intersecting curves.
Partial fix for #765.
2015-09-09 07:28:08 +02:00
Jürg Lehni
3f53aa78ce Do not access curve objects for geometry since they might be subdivided.
Partial fix for #765
2015-09-09 07:26:39 +02:00
Jürg Lehni
b96036fb03 Fix strange curve check.
Something went wrong in prior refactoring here. Also, no need to check curve beginnings and ends again, just handles.
2015-09-09 06:25:37 +02:00
Jürg Lehni
98d7703b5c Finish implementing Curve#isStraight and #isLinear()
Closes #652
2015-09-06 18:02:15 +02:00
Jürg Lehni
31d9e1cd6e Implement Curve#isLinear() to check for parametrical linearity.
Along with some unit tests for it.
2015-09-06 17:56:12 +02:00
Jürg Lehni
9d12a0a82c Rename Curve#isLinear() to #isStraight()
Relates to #652
2015-09-06 17:35:27 +02:00
Jürg Lehni
9dab662a1f Clean-up various Segment and Curve tests.
Moving functionality back to Path#toShape() since it was too specific, and missleading as part of the exposed Segment API.
2015-09-06 17:27:33 +02:00
Jürg Lehni
b52d343527 Use same notation for all injection scopes. 2015-09-06 16:48:23 +02:00
Jürg Lehni
cf813faa75 Remove all mention of points and square points as units.
And some other doc clean-ups.
2015-09-06 16:37:10 +02:00
Jürg Lehni
3d89cd71bd Some clean-up work on documentation. 2015-09-06 15:54:11 +02:00
Jürg Lehni
66717868cd Address failing #isLinear() tests. 2015-09-06 14:10:15 +02:00
Jürg Lehni
26e35322a4 Some reworking of code and comments. 2015-09-06 13:20:57 +02:00
Jürg Lehni
8b67d8a1dc Remove #isStraight() in favor of #hasHandles() and implement #clearHandles()
Relates to #652
2015-09-06 12:47:35 +02:00
Jürg Lehni
3fa385ac7c Fix typo in previous commit. 2015-09-05 09:56:37 +02:00
Jürg Lehni
af355dc82c Fix false positives in Curve#isLinear() and Segment#isLinear(). 2015-09-03 09:01:07 +02:00
Jürg Lehni
041c31a88a Prevent variable leackage. 2015-09-02 15:54:14 +02:00
Jürg Lehni
b9a07ca538 Address code comments by @iconexperience in #762. 2015-08-31 22:01:18 +02:00
Jürg Lehni
20222be5c6 Minor clean-up in fat-line code. 2015-08-30 19:59:13 +02:00
Jürg Lehni
bd61390f9d improve break-off condition in curve interesection code.
To prevent arbitrary incorrect solutions occuring when tDiff is very close to zero.
Closes #762.
2015-08-30 14:37:21 +02:00
Jürg Lehni
27aae8b261 Add support for values array and toString object format to Curve constructor. 2015-08-30 14:14:52 +02:00
Jürg Lehni
0cbce044aa Define Curve#_serialize() 2015-08-28 16:18:28 +02:00
Jürg Lehni
d85b4f0c80 Fix issues with wrong sorting of CurveLocation in Curve.filterIntersections() 2015-08-26 16:56:28 +02:00
Jürg Lehni
815991d556 Some minor adjustments and fixes. 2015-08-26 11:43:39 +02:00
Jürg Lehni
2c4dcb96c2 Streamline addOverlap() code a bit. 2015-08-26 11:26:55 +02:00
Jürg Lehni
3946bcb04e Remove unnecessary segments between two collinear curves in Path#reduce() 2015-08-24 12:49:33 +02:00
Jürg Lehni
75f669d839 Implement proper method to determine which segment to choose when encountering overlaps. 2015-08-24 04:36:49 +02:00
Jürg Lehni
85d21c84b8 Start implementing support for touching and overlapping shapes in boolean operations.
Relates to #449, #450, #648, #719
2015-08-23 21:19:19 +02:00
Jürg Lehni
9bd399b5b8 Introduce Curve#isStraight() and use it in splitPath() and divide() to keep the result of splitting straight curves straight.
Do not use Curve#isLinear(), as that would include curves with collinear handles, and we don't want to set these straight.
2015-08-22 22:06:42 +02:00
Jürg Lehni
bddff95fe3 Remove workarounds in splitPath() thanks to improved precision of Numerical.solveCubic(). 2015-08-22 14:24:31 +02:00
Jürg Lehni
716d21e369 Always use fat-line clipping since fallback doesn't behave the same way. 2015-08-21 16:39:41 +02:00
Jürg Lehni
0436b2749a Fix some comments. 2015-08-19 17:28:41 +02:00
Jürg Lehni
84b202fd79 Expose and reuse Curve evaluation method names. 2015-08-19 17:26:52 +02:00
Jürg Lehni
9fe93d1434 Move Curve evaluate() method to private scope. 2015-08-19 17:19:42 +02:00
Jürg Lehni
da82116501 Rework handling of weighted and normalized curve tangents and normals.
Relates to #563
2015-08-19 17:15:41 +02:00
Jürg Lehni
59eec1f27b Implement Curve#isLinear(), #isCollinear() & co without depending on the segments being part of a path. 2015-08-19 11:43:37 +02:00
Jürg Lehni
e476672748 Use better epsilon values in Numerical.solveQuadratic() and solveCubic()
To finally satisfy both #541 and #708.

With this change in place, https://github.com/paperjs/boolean-test is also finally back to run with 0 errors. Woop!
2015-08-18 23:47:28 +02:00
Jürg Lehni
4ee68e5782 Various changes to #isCollinear(), #isOrthogonal(), #isArc()
- Rename #isArc() - > #isOrthogonalArc()
- Implement versions for Curve
- Write proper documentation
2015-08-17 14:33:48 +02:00
Jürg Lehni
f8314f927e Various changes on #isLinear(), #hasHandles() & co
Relates to #652

- Implement #hasHandles() on Path, Segment and Curve
- Remove Path#isPolygon()
- Define #isLinear() consistently across Path, Segment and Curve.
- Introduce new Segment#isStraight()
2015-08-17 14:31:23 +02:00
Jürg Lehni
19bcd19b49 Implement path versioning for segment changes.
And use it to keep CurveLocation objects up to date. Closes #682
2015-06-16 19:36:22 +02:00