Jürg Lehni
648985fcd2
Fix yet another issue with Path#curves and Path#_add()
...
Including a unit test to prevent regression.
2015-10-24 18:11:30 +02:00
Jürg Lehni
19e3136892
Address small issue in Path#getLocationAt() when paths are empty.
2015-10-24 17:46:20 +02:00
Jürg Lehni
fcd4fe824c
Pass Item.NO_INSERT to internally created paths and do not rely on insertAbove() to always return a result.
...
If `this` itself is not in the DOM, insertAbove() will fail.
2015-10-24 17:45:22 +02:00
Jürg Lehni
1fc17766fb
Address remaining issue with curves being wrongly linked up after adding new segments.
2015-10-24 17:43:22 +02:00
Jürg Lehni
ae2bed9cf0
Fix issue of faulty curves list after inserting segments at the end of open paths.
2015-10-24 17:00:37 +02:00
Jürg Lehni
39731808b8
Switch from imprecise trigonometric method to Curve.getParameterOf()
...
And from !hasHandles() to isStraight(), as we can now handle all straight curves.
2015-10-24 12:23:25 +02:00
Jürg Lehni
780b999220
Fix typo.
2015-10-24 11:55:59 +02:00
Jürg Lehni
b9a0f5f659
Further simplify code.
2015-10-24 11:29:15 +02:00
Jürg Lehni
4678697638
Some refactoring and added comments to @sapics code in Curve.getNearestParameter()
2015-10-24 11:14:08 +02:00
sapics
89a45a6682
Use cubic equation solution for faster calculation
2015-10-24 14:54:57 +09:00
sapics
294904eac7
Faster curve.getNearestParameter when curve has no handles
2015-10-24 11:39:50 +09:00
Jürg Lehni
c8cc653004
Merge Path#_getOffset() with CurveLocation#getOffset()
2015-10-23 19:57:25 +02:00
sapics
502558a321
Fix variable leaks
2015-10-23 09:45:39 +09:00
Jürg Lehni
5be9e1dde5
Remove unused variable.
2015-10-22 15:30:29 +02:00
Jürg Lehni
813ea48932
Remove unused local reference.
2015-10-22 14:46:17 +02:00
Jürg Lehni
85f7134fe6
Reduce curve-time epsilon, and improve comments about other epsilon values.
2015-10-22 10:34:49 +02:00
Jürg Lehni
bafb6794a6
Introduce separate epsilon for fat-line clipping code, and reduce curve-time epsilon.
2015-10-21 23:44:24 +02:00
Jürg Lehni
e9c3e72f60
Simplify handling of winding overlap-adjustment in isValid()
2015-10-21 15:02:53 +02:00
Jürg Lehni
a79212b920
Make handling of points on infinite lines in Line.getSide() more clear.
2015-10-21 10:00:11 +02:00
Jürg Lehni
a9710cf7c0
Fix Line.getSide() call.
2015-10-21 09:35:55 +02:00
Jürg Lehni
0cb792de93
Reverse sign of Line.getSignedDistance()
...
Closes #789
2015-10-21 09:35:40 +02:00
Jürg Lehni
7c37a4a4d2
Revert "No need for special length handling in propagateWinding()"
...
This reverts commit 8c702ce5b4
.
2015-10-21 09:35:17 +02:00
Jürg Lehni
f8595e93c6
Improve some comments.
2015-10-21 02:45:57 +02:00
Jürg Lehni
169f18617c
Address more pending TODOs.
2015-10-21 02:40:12 +02:00
Jürg Lehni
7a95625a13
Remove debug code and TODO from CurveLocation#isCrossing()
2015-10-21 02:36:43 +02:00
Jürg Lehni
8c702ce5b4
No need for special length handling in propagateWinding()
2015-10-21 02:32:56 +02:00
Jürg Lehni
3daa7f78b4
Some comment clean-ups.
2015-10-21 02:24:54 +02:00
Jürg Lehni
341fe1ab4e
Remove all boolean debugging and streamline code.
2015-10-21 02:16:17 +02:00
Jürg Lehni
2cf637d13b
Merge remote-tracking branch 'origin/boolean-fix' into develop
2015-10-21 01:44:15 +02:00
Jürg Lehni
43cf20096a
Implement Curve.getNearestParameter()
2015-10-21 01:43:14 +02:00
Jürg Lehni
8c3d9df06c
Further fine-tune the various EPSILON values based on edge-case tests.
2015-10-21 01:42:26 +02:00
Jürg Lehni
5d6b761d3a
Introduce separate WINDING_EPSILON and improve GEOMETRIC_EPSILON.
...
New values are based on a lot of testing.
2015-10-21 01:16:52 +02:00
Jürg Lehni
eb62530958
Improve CurveLocation#equals().
2015-10-21 01:15:46 +02:00
Jürg Lehni
1f476c2107
Improve CurveLocation#isTouching() to better handle straight lines.
2015-10-21 01:10:24 +02:00
Jürg Lehni
1073340eeb
Do not use GEOMETRIC_EPSILON in Curve.getParameterAt()
...
This caused issues in some rare edge-cases.
2015-10-21 01:09:03 +02:00
Jürg Lehni
d543658c43
Remove old version of Curve#getParameterOf()
2015-10-21 00:17:05 +02:00
Jürg Lehni
140fba56cc
Fix Line#isCollinear() and #isOrthogonal()
2015-10-20 23:37:37 +02:00
Jürg Lehni
bcd6520e66
Merge handling of self-intersection crossings with normal crossings.
...
Shorter code and no additional glitches.
2015-10-20 23:03:40 +02:00
Jürg Lehni
08122131dc
Use isOverlap() instead of _overlap everywhere.
2015-10-20 23:02:50 +02:00
Jürg Lehni
6ccd78e8af
Go back to simpler code to handle visited segments.
...
It appears that the imprecisions addressed in 6cdead0e8c
have since disappeared.
2015-10-20 23:02:19 +02:00
Jürg Lehni
7422e0710f
Some changes to boolean debug logging.
2015-10-20 22:04:30 +02:00
Jürg Lehni
3aa7507ce1
Avoid issues with imprecision in CurveLocation#getCurve() / trySegment()
2015-10-20 22:04:04 +02:00
Jürg Lehni
447feea1da
Improve Curve#getParameterOf() to first check curve points with zero epsilon.
2015-10-20 22:03:45 +02:00
Jürg Lehni
60109e897a
Use 'preserve' to protect #getPoint() against overriding.
2015-10-20 19:22:33 +02:00
Jürg Lehni
3ae0ca6c94
Remove dependency on curve-time comparisons when comparing locations.
...
Locations on consecutive short curves (< 1e-7) where unable to merge due to diff > 1.
Relates to #805
2015-10-20 17:53:40 +02:00
Jürg Lehni
7cea3488c0
Remove dependency on curve-time parameter when figuring out which locations to merge.
2015-10-20 17:17:31 +02:00
Jürg Lehni
5dac7e9d29
Reduce maximum recursion again in addCurveIntersections()
...
32 has lead to many deadlocks.
2015-10-20 16:35:30 +02:00
Jürg Lehni
da43953828
For curves with only one segment, pick the smaller diff between the two locations.
...
Addresses point 1. in https://github.com/paperjs/paper.js/issues/805#issuecomment-147770300
2015-10-20 16:34:40 +02:00
Jürg Lehni
93e9e54ae5
Make sure we cannot find two intersections between two lines.
...
Adresses point 2. in https://github.com/paperjs/paper.js/issues/805#issuecomment-148503018
2015-10-20 15:34:09 +02:00
Jürg Lehni
f2cce4c84d
Rename variable to be less ambiguous.
2015-10-20 15:21:03 +02:00
Jürg Lehni
63303a59f4
Change PathItem#getIntersections() so that the simply circularity checks in addLocations() work.
...
This should address the concerns outlined in https://github.com/paperjs/paper.js/issues/805#issuecomment-147850806
2015-10-20 15:18:09 +02:00
Jürg Lehni
e0c31e4a50
Make static getIntersections() methods 'private'.
2015-10-20 10:02:33 +02:00
Jürg Lehni
f1debf401b
Streamline overlap handling code.
2015-10-20 10:02:00 +02:00
Jürg Lehni
eb2f7e293a
Streamline mouse event handling between View and Item.
...
Consolidating code and making View#onMouseDown/Up/Move/... events work.
2015-10-17 18:13:00 +02:00
sapics
8dfb5191fa
Fix curve evaluate function to finite
2015-10-17 14:38:27 +09:00
Jürg Lehni
3314668a0c
Streamline mouse event handling between View and Item.
...
Consolidating code and making View#onMouseDown/Up/Move/... events work.
2015-10-14 16:25:36 +02:00
Jürg Lehni
9762d2c9e6
Revert "Simplify circular neighbor checks."
...
This reverts commit 2bb3df3314
.
2015-10-13 09:35:13 +02:00
Jürg Lehni
b5c59c881c
Revert "One more simplification."
...
This reverts commit 0ce825f8c9
.
2015-10-13 09:35:08 +02:00
Jürg Lehni
0ce825f8c9
One more simplification.
2015-10-13 08:34:48 +02:00
Jürg Lehni
2bb3df3314
Simplify circular neighbor checks.
...
Relates to #805 .
2015-10-13 08:32:05 +02:00
Jürg Lehni
9de6aa97f2
Third attempt at correctly handling paths as circular lists.
...
Relates to #805 .
2015-10-13 07:59:19 +02:00
Jürg Lehni
f6f6a58fe6
Improve handling of paths as circular lists.
2015-10-13 07:27:25 +02:00
Jürg Lehni
2e552853fd
Handle paths as circular lists in CurveLocation.insert() as well.
...
Relates to #805
2015-10-13 07:23:15 +02:00
Jürg Lehni
0553201de8
Add forgotten semi-colon.
2015-10-13 00:11:24 +02:00
Jürg Lehni
3d33bbdfa3
Clean-up CurveLocation#equals()
2015-10-13 00:10:21 +02:00
Jürg Lehni
f77579079e
Improve CurveTime#equals() to handle locations that wrap around beginnings / ends of paths.
...
See https://github.com/paperjs/paper.js/issues/805#issuecomment-147470240 for details.
2015-10-13 00:06:34 +02:00
iconexperience
f8edf5d8a7
Small refactoring in getConvexHull()
...
Make calculations of distances more concise.
2015-10-12 08:42:36 +02:00
Jürg Lehni
588ddbe011
Add comments to Curve#getParameterOf()
2015-10-11 17:09:04 +02:00
Jürg Lehni
bbc0029252
Go back to simple overlap handling.
...
It appears to produce less glitches.
2015-10-11 17:05:23 +02:00
Jürg Lehni
4500e520ea
Minor code clean-up.
2015-10-11 17:00:23 +02:00
Jürg Lehni
c9f5c02ee4
Decrease GEOMETRIC_EPSILON
...
This appears to be better aligned with the new Curve#getParameterOf() behavior.
2015-10-11 17:00:01 +02:00
Jürg Lehni
c1d0bd21b8
Improve Curve#getParameterOf() to better handle very small curves.
...
See #799
2015-10-11 16:59:03 +02:00
Jürg Lehni
61db3d9d01
Improve handling of boolean debug options.
2015-10-11 16:57:43 +02:00
Jürg Lehni
6cdead0e8c
Add fallback strategy when ending up in a dead-end in tracePaths().
...
This simple fix appears to be able to catch quite a few glitches with very small curves.
2015-10-11 16:56:41 +02:00
Jürg Lehni
247e80f569
Update to latest prepro.js with proper support for strings and scientific numbers.
2015-10-11 15:50:25 +02:00
Jürg Lehni
841381f520
Reactivate new overlap handling.
...
It appears to work better with the new Curve.getParameterOf()
2015-10-11 10:17:03 +02:00
Jürg Lehni
d20cdf5b73
There can only be one self-intersection per curve.
2015-10-11 09:48:55 +02:00
Jürg Lehni
8a122e19d8
Split self-intersection handling into separate method.
...
Increasing readability of both methods.
2015-10-11 09:26:04 +02:00
Jürg Lehni
7aed221801
Some refactoring in static methods of CurveLocation.
2015-10-11 09:18:50 +02:00
Jürg Lehni
99909953a8
Use colors to distinguish faulty boolean paths.
2015-10-09 11:07:43 +02:00
Jürg Lehni
688f580b95
Switch to new Curve.getParameterOf()
...
Simpler code, but improved precision means more glitches to analyze.
2015-10-09 10:34:46 +02:00
Jürg Lehni
48bb0a1be4
Address old TODO in getWinding()
2015-10-09 10:33:43 +02:00
Jürg Lehni
0839dbe1f5
New overlap handling is producing new glitches.
...
Turn it off for now, until further analysis has been done.
2015-10-09 10:27:25 +02:00
Jürg Lehni
b2127a83ad
Revert "Do not start with segments with multiple intersections."
...
This reverts commit 5129fb0050
.
2015-10-09 10:22:54 +02:00
Jürg Lehni
514e6651e6
Revert "Avoid all intersections as starting points for boolean paths."
...
This reverts commit 9590578339
.
2015-10-09 10:19:05 +02:00
Jürg Lehni
c45ae4b51a
Revert "Never starting in intersections allows for further code simplifications."
...
This reverts commit 892154e8f8
.
2015-10-09 10:18:45 +02:00
Jürg Lehni
892154e8f8
Never starting in intersections allows for further code simplifications.
2015-10-09 00:03:34 +02:00
Jürg Lehni
9590578339
Avoid all intersections as starting points for boolean paths.
2015-10-08 23:56:18 +02:00
Jürg Lehni
939a9fe034
Improve overlap handling by actually storing overlap curves on intersections objects.
...
And properly comparing against them in tracePaths().
2015-10-08 23:54:00 +02:00
Jürg Lehni
5129fb0050
Do not start with segments with multiple intersections.
...
Simplifies the required checks at the end, and generally reduces number edge cases.
2015-10-08 23:38:41 +02:00
Jürg Lehni
c9eba83cc7
Improve detection of start segments.
...
Segments with multiple intersections need to be checked thoroughly to avoid errors.
2015-10-08 23:13:37 +02:00
Jürg Lehni
e92a71e8c7
Switch to improved version of Line. getSignedDistance()
...
Based on the error analysis by @iconexperience outlined in #799
2015-10-08 22:56:05 +02:00
Jürg Lehni
5c70f47b6f
Fix colors in reportWindings code.
2015-10-07 23:37:09 +02:00
Jürg Lehni
15d797ac55
Improve linkIntersections() to prevent endless recursions in linked intersections.
2015-10-07 17:20:08 +02:00
Jürg Lehni
3e9d7593cf
Some smaller tweaks in tracePaths()
2015-10-07 10:58:29 +02:00
Jürg Lehni
4fac3ee6fc
Rename getIntersection() -> getBestIntersection()
2015-10-07 10:57:43 +02:00
Jürg Lehni
bfa0459c52
Go back to using Group for divide() results.
...
As they may contain multiple CompoundPaths.
2015-10-07 10:57:09 +02:00
Jürg Lehni
1103c7036f
Remove unnecessary isValid() check on segments without intersections.
...
It was only causing issues without solving anything.
2015-10-07 02:02:27 +02:00
Jürg Lehni
8c56a1a110
Include _visited checks in isValid() calls.
...
This magically reduces the remaining glitches in @iconexperience's test-suite to half.
Relates to #784 .
2015-10-06 22:23:43 +02:00
Jürg Lehni
896b068266
Switch from recursion to a simple loop in getIntersection()
2015-10-06 21:30:51 +02:00
Jürg Lehni
8e4bef217a
Change Curve.getParameterOf() to accept a point instead of x, y arguments.
2015-10-06 21:24:58 +02:00
Jürg Lehni
525e35518d
No need to default to 0 anymore.
...
See 1b343d5347 (commitcomment-13622714)
2015-10-06 21:16:49 +02:00
Jürg Lehni
bc736f439f
Have Numerical.CURVETIME_EPSILON / 10 evaluated at preprocess time.
2015-10-06 21:14:43 +02:00
Jürg Lehni
7f4d8d54f0
Reduce epsilon in addCurveIntersections()
...
1/10 of CURVETIME_EPSILON appears to produce good results. It's probably wise to keep it linked.
2015-10-06 21:14:04 +02:00
Jürg Lehni
3ac3df8d32
Rewrite method for linking and choosing multiple intersections in the same location.
...
The special handling of overlaps reduces the amount of remaining glitches substantially.
Relates to #784 .
2015-10-06 21:09:35 +02:00
Jürg Lehni
adabe9126a
Simplify calculation of tMinNew and tMaxNew.
...
As suggested by @iconexperience in https://github.com/paperjs/paper.js/issues/795#issuecomment-145918347
2015-10-06 20:15:15 +02:00
Jürg Lehni
1b343d5347
Rewrite 04cab797db
to only use one return statement.
2015-10-06 16:31:30 +02:00
Jürg Lehni
99d969e962
Merge pull request #798 from iconexperience/Improve-clipConvexHullPart
...
Improve clipConvexHullPart()
2015-10-06 16:21:41 +02:00
Jürg Lehni
3a65c87843
Some code formatting and a fix for a typo in new getConvexHull()
2015-10-06 16:09:35 +02:00
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
fcdf916863
Some tweaks to debugging code.
...
Leave open path artifacts clearly visible for now, so they can be more easily detected.
2015-10-05 17:42:01 +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
93cacffd06
Improve comments describing isValid() calls.
2015-10-05 10:56:29 +02:00
Jürg Lehni
7494f880f8
Revert previous commit, due to wrong assumption.
2015-10-05 10:44:34 +02:00
Jürg Lehni
90b4cf7292
No need to check for overlap when determining value for unadjusted
...
Since setting only changes behavior if there actually is an overlap.
2015-10-05 05:52:35 +02:00
Jürg Lehni
05bc6afdbb
Always give intersection segment priority over current segment if valid.
...
Fixes example 22 in #784 , doesn't seem to introduce new issues, unlike last time I tried this approach.
2015-10-05 05:34:22 +02:00
Jürg Lehni
bd4874d73e
Improve debug logging of windings.
2015-10-05 04:57:12 +02:00
Jürg Lehni
ba76ed8671
Consider the winding contribution at the intersection of the next segment as well.
...
Fixes both example 20 and example 21 in #784
2015-10-05 04:24:04 +02:00
Jürg Lehni
d2c762997f
Address improvements mentioned by @hkrish in #794
2015-10-04 18:36:18 +02:00
Jürg Lehni
5601e21996
Make sure the two locations are actually part of the same path before comparing index / parameter values.
2015-10-04 10:14:04 +02:00
Jürg Lehni
035a3a1b8c
Remove unnecessary _visited check.
2015-10-04 02:27:56 +02:00
Jürg Lehni
ebc956353f
Move code to adjust segments after split to CurveLocation.
2015-10-04 02:25:33 +02:00
Jürg Lehni
be2f98d91a
Optimize various isCollinear() and isOrthogonal() methods.
2015-10-03 17:42:52 -04:00
Jürg Lehni
8073183010
Use getIntersections() with right filter instead of getCrossings() for boolean operations.
2015-10-03 17:17:12 -04:00
Jürg Lehni
79cb216684
Define CurveLocation#isOverlap() and improve documentation of various related methods.
2015-10-03 17:15:45 -04:00
Jürg Lehni
5af8515d1a
Commit some useful debug code, deactivated for now.
2015-10-03 16:18:00 -04: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
5d7a596026
Fix wrong upper bounds check in Line.intersect()
...
1 as a solution was accidentally excluded.
2015-10-03 11:44:43 -05:00
Jürg Lehni
61fc75ace3
Some code clean-up.
2015-10-03 10:40:33 -05:00
Jürg Lehni
50c7473337
Improve CurveLocation#add() and #equals() to better merge locations.
...
Before, very close locations over curve boundaries where not merged.
2015-10-03 10:40:13 -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
7496a7c9e2
Try linked up intersections first before switching to the other intersecetion.
2015-10-02 19:00:32 -05:00
Jürg Lehni
632eb25f19
Bring back code removed in 11611c8fe2
again.
...
But add a _visited check, to get best of both approaches.
2015-10-02 18:57:45 -05:00
Jürg Lehni
00f1d5089f
Clean up Numerical code a bit.
2015-10-02 18:56:41 -05:00
Jürg Lehni
f6f9d963eb
Shorten Numerical.solveQuadratic() a bit.
2015-10-02 15:46:15 -05:00
sapics
c6de2f7f23
Fix to minimize floating point noise
2015-10-02 15:39:51 -05:00
Jürg Lehni
11611c8fe2
Remove isValid() check for current segment before attempting the switch.
...
This properly fixes example 14 in #784 .
2015-10-02 01:06:36 -05:00
Jürg Lehni
7f7d35a38a
Clean-up epsilon definitions.
2015-10-02 01:05:45 -05:00
Jürg Lehni
8dfa721e5a
Adjust debug rendering.
2015-10-01 21:12:15 -05:00
Jürg Lehni
a808aaf0fa
Remove unnecessary check for other === start.
2015-10-01 21:11:51 -05:00
Jürg Lehni
de57a7fbc8
Simplify tracePaths() code.
2015-10-01 21:09:30 -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
4b4ccbac09
Make GEOMETRIC_EPSILON so that overlap edge-cases are correctly matched.
...
Relates to #784
2015-10-01 20:45:08 -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
8aca088bf6
Clean-up splitPath() code a bit.
2015-10-01 09:41:57 -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
0ca5a106de
Improve Line.intersect() comments.
2015-10-01 04:50:41 -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
d385d25a51
Include comment regarding CurveLocation#equals() modification.
2015-09-30 13:48:28 -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
2a7d1c5728
Improve CurveLocation#equals()
...
Relates to #784 , described in https://github.com/paperjs/paper.js/issues/784#issuecomment-143161586
2015-09-30 12:47:02 -05:00
Jürg Lehni
4e9bac1ca5
Fix code brokean in commit a869add90d
2015-09-30 12:39:59 -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
a869add90d
Rename variables in Line.intersect()
2015-09-26 12:09:44 -05: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
fc0b5a8858
Give the intersection that brings us back to the beginning alwasy the priority.
2015-09-24 07:47:39 -04:00
Jürg Lehni
c79166a46f
Mark last segment as visited when done.
2015-09-23 14:31:12 -04:00
Jürg Lehni
cf5bf38c3b
Minor simplification.
2015-09-23 13:33:35 -04:00
Jürg Lehni
515d4ff93d
Make Line.isCollinear() / Point#isCollinear() more reliable.
2015-09-23 13:26:29 -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
6a29f200e3
Always use getIntersection(), even on the first segment.
...
Now that it works well.
2015-09-21 12:44:53 -04:00
Jürg Lehni
51c34444db
Some more debugging code clean-up.
2015-09-21 12:18:57 -04:00
Jürg Lehni
84bcc537e1
Simplify addCurveLineIntersections() and exclude end points.
2015-09-21 12:13:53 -04:00
Jürg Lehni
0f61ce896a
Some code clean-up.
2015-09-21 10:54:33 -04:00
Jürg Lehni
ce95043e99
Lower geometric epsilon.
...
Differences slightly above 1e-8 where observed.
2015-09-21 10:54:17 -04:00
Jürg Lehni
812ac63e60
Compare points instead of curve time paramters for better precision and reliability.
2015-09-21 10:53: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
f6f42fe09b
Improve handling of overlap ambiguity in getIntersection()
...
Two passes are needed, first strict, then non-strict, to prevent 'better' next candiates over 'worse' ones.
2015-09-21 09:44:17 -04:00
Jürg Lehni
19a17b2918
Prevent infinite loops through circular references of multiple intersections.
2015-09-21 09:43:19 -04:00
Jürg Lehni
40570b3e59
Furher improve boolean debug logging and drawing.
2015-09-21 09:42:47 -04:00
Jürg Lehni
1ad95c9020
Improve CurveLocation.add() to always merge duplicates.
...
We nee to check neighbors of the found location too.
2015-09-21 07:06:41 -04:00
Jürg Lehni
f47af12b0d
Shorten code statement.
2015-09-20 23:22:41 +02:00
Jürg Lehni
1302df0cb8
Fix variable leackage.
2015-09-20 23:22:31 +02:00
Jürg Lehni
b68be09c87
Fix all accidental non-breaking spaces.
2015-09-20 22:39:28 +02:00
Jürg Lehni
530b8b7bc8
Handle adjusted overlap winding contribution and operator calls through new isValid() function.
2015-09-20 15:50:26 +02:00
Jürg Lehni
738cc4c214
Yet another improvement in multiple interseections boolean code.
...
This appears to be the one. The only remaining failing cases seem to be linked to getting the same intersection twice now!
Relates to #787
2015-09-20 15:29:54 +02:00
Jürg Lehni
946157f1b1
Add note about usage of _originalWinding.
2015-09-20 14:19:14 +02:00
Jürg Lehni
20ed1e007c
More fixes in handling of multiple intersection locations.
2015-09-20 14:17:23 +02:00
Jürg Lehni
5db9703aff
No more need to check for crossings since every intersection is now either an overlap or a crossing.
2015-09-20 14:16:47 +02:00
Jürg Lehni
53862233e5
Improve debug logging of new multiple intersections code.
2015-09-19 22:47:57 +02:00
Jürg Lehni
4df65c1809
Various improvements to code that handles multiple intersections in same location.
...
Relates to #787
2015-09-19 19:07:44 +02:00
Jürg Lehni
1d6f552212
Prevent endless loop through circular references.
2015-09-19 13:42:48 +02:00
Jürg Lehni
2c8634793c
First attempt at implementing handling of multiple intersections in the same location.
...
Relates to #787 , works pretty well already for many situations.
2015-09-19 13:21:29 +02:00
Jürg Lehni
081de1d12a
'exclude' operation needs overlap handling too.
2015-09-18 22:29:29 +02:00
Jürg Lehni
a95ba12bc3
isCrossing() needs parameter checks on both curves.
2015-09-18 22:26:09 +02: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
8cf562c57b
Revert "Remove special handling of winding contribution on overlaps"
...
This reverts commit c6a38589e9
.
The special handling seems to be still necessary in some edge cases, e.g. in BooleanOperations.html
2015-09-18 21:10:58 +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
c6a38589e9
Remove special handling of winding contribution on overlaps
...
Looks like the new code handles this correclty now!
2015-09-18 18:06:15 +02:00
Jürg Lehni
23443dc8f4
Clean up boolean code.
2015-09-18 17:51:57 +02:00
Jürg Lehni
66b01973f0
Simplify exclusion handling for new boolean code.
2015-09-18 17:51:43 +02:00
Jürg Lehni
87687d816b
Implement PathItem#resolveCrossings() based on the new #getCrossings() method.
2015-09-18 17:51:03 +02:00
Jürg Lehni
c70f8cb3cc
Simplify overlap calculations by keeping the original winding value.
2015-09-18 17:46:46 +02:00
Jürg Lehni
59a23fdd3f
Improve debug logging.
2015-09-18 17:33:42 +02:00
Jürg Lehni
73a9989261
Fix CurveLocation#isCrossing() for locations in the middle of curves.
2015-09-18 17:32:19 +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
85311cfb29
Improve Path#getArea() and #isClockwise()
2015-09-18 17:27:29 +02:00
Jürg Lehni
17356637ac
Clean up new CurveLocation code.
2015-09-17 10:18:45 +02:00
Jürg Lehni
9c812335e5
Curve._filterIntersections() is now without a job.
2015-09-17 09:39:22 +02:00
Jürg Lehni
1508b8fc75
Improve debug logging.
2015-09-17 01:15:41 +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
857e27e3a8
Fix accidental variable leackage.
2015-09-16 18:15:26 +02:00
Jürg Lehni
7061bc0e0a
Simplify CurveLocation.sort() code
...
Relates to #787
2015-09-16 10:52:51 +02:00
Jürg Lehni
0980ad3fe9
Fix remaining issues with curve location sorting.
...
Relates to #787
2015-09-16 10:44:41 +02:00
Jürg Lehni
f8bd7a2005
Improve debug logging and drawing.
...
And add more descriptive comments to tracePath().
2015-09-16 09:52:41 +02:00
Jürg Lehni
197aa4b4cf
No need to wrap angles as they're always -PI < a < PI.
2015-09-16 02:56:24 +02:00
Jürg Lehni
2026e5571e
Some code cleanup and comments in isCrossing().
2015-09-16 02:54:25 +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
1e5c1bafaf
Increase geometric epsilon to better match collinear lines.
...
Needs more testing, but seems to perform well.
Relates to #786
2015-09-16 02:31:37 +02:00
Jürg Lehni
8f9549dd12
Fix non-breaking spaces.
2015-09-16 02:29:17 +02:00
Jürg Lehni
ad276ba46a
More improvements in tracePaths()
...
- Use new isCrossing() check
- Correctly switch crossings in exclusion
2015-09-15 19:39:35 +02:00
Jürg Lehni
60a725b527
Implement correct CurveLocation#isCrossing() check.
...
And improve curve caching. Still needs work.
2015-09-15 19:38:28 +02:00
Jürg Lehni
3ce7d88347
Second attempt at simplifying boolean code.
...
This time without endless loops.
2015-09-15 16:31:05 +02:00
Jürg Lehni
089738478c
Bring back boolean exclusion handling to reverted code.
2015-09-15 15:03:12 +02:00
Jürg Lehni
7b3f8598f4
Make sure all results of boolean operations are styled and inserted in the sample way.
2015-09-15 14:11:27 +02:00
Jürg Lehni
e4b4037721
Revert "Improve handling of exclude() operations."
...
This reverts commit e85586d0fe
.
2015-09-15 13:01:52 +02:00
Jürg Lehni
5e327f7a48
Revert "Substantial simplifications in boolean code."
...
This reverts commit a665175a89
.
2015-09-14 15:23:46 +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
fec479167c
Improve debug logging and drawing.
2015-09-14 15:16:52 +02:00
Jürg Lehni
a665175a89
Substantial simplifications in boolean code.
...
These were probably made possible thanks to increased precision elsewhere in the lib.
2015-09-14 01:20:03 +02:00
Jürg Lehni
e85586d0fe
Improve handling of exclude() operations.
...
Determine wether to switch to other intersection or not based on tangents.
Closes #781 again.
2015-09-14 00:51:46 +02:00
Jürg Lehni
b532c9cce2
Handle boolean exclusion as a special case.
...
Switching each time an intersection is encountered.
Closes #781
2015-09-13 22:12:04 +02:00
Jürg Lehni
fbb0f3f37d
Remove left-over debugging code.
2015-09-13 21:50:35 +02:00
Jürg Lehni
b231e9b2a8
Accept CompoundPath items as children of CompoundPath items.
...
Just add their children and remove the parent.
Closes #541
2015-09-13 16:06:24 +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
f029d5f9da
Write docs for the new EPSILON values.
2015-09-13 13:41:53 +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
8047f90ccf
Switch to using GEOMETRIC_EPSILON in getWinding() code.
2015-09-12 22:20:31 +02:00
Jürg Lehni
ef45a5f62c
Clean up tMin / tMax uses.
2015-09-12 22:14:04 +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
2fb203ddd1
Adjust notes since we now support boolean operations on self-intersecting Paths items
2015-09-12 11:58:17 +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
cdd0cee623
Activate resolving of self-intersections in boolean code.
...
Relates to #779
2015-09-12 10:24:19 +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
c69ea345da
Correctly handle self-intersections when deciding to switch segments.
...
Closes #765
2015-09-10 05:21:47 +02:00
Jürg Lehni
4770cfe2f8
Minor intersection refactoring clean up.
2015-09-10 05:18:56 +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
78e0bae6aa
Activate code that handles self-intersection directly now.
...
Relates to #765 , #761
2015-09-09 08:24:02 +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
155442e706
Increase readability of convex-hull check in self-intersection code.
2015-09-09 08:12:03 +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
71a7cc37e6
Many documentation clean-ups.
2015-09-06 17:20:01 +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
dd1f5ba3d1
Remove Path#isLinear() and use Path#getArea() instaed in boolean code.
2015-09-06 16:35:15 +02:00
Jürg Lehni
3d89cd71bd
Some clean-up work on documentation.
2015-09-06 15:54:11 +02:00
Jürg Lehni
fa9eb8be99
Merge remote-tracking branch 'origin/develop' into boolean-fix
...
; Conflicts:
; src/path/PathItem.Boolean.js
2015-09-06 15:36:40 +02:00
Jürg Lehni
cf4e5c2983
Fix typo.
2015-09-06 15:30:38 +02:00
Jürg Lehni
824b0c7e7e
Remove legacy Color constructors.
2015-09-06 15:28:46 +02:00
Jürg Lehni
66717868cd
Address failing #isLinear() tests.
2015-09-06 14:10:15 +02:00
Jürg Lehni
f91373efd8
Simplify Point#project()
2015-09-06 14:01:04 +02:00
Jürg Lehni
d7fb5cd512
Do not reduce linear curves with handles defined.
2015-09-06 13:21:08 +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
215bbe2e8e
Fix issue in Numerical.solveCubic() / solveQuadratic()
...
We need to include EPSILON tolerance in the comparison with bounds values.
2015-08-30 22:57:33 +02:00
Jürg Lehni
20222be5c6
Minor clean-up in fat-line code.
2015-08-30 19:59:13 +02:00
Jürg Lehni
0651eee0c2
No more need for special handling of 'subtract' overlaps.
...
This is now taken care of in the code that handles overlaps itself, and the additional code was causing additional issues.
2015-08-30 19:58:32 +02:00