Commit graph

268 commits

Author SHA1 Message Date
Jürg Lehni
081de1d12a 'exclude' operation needs overlap handling too. 2015-09-18 22:29:29 +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
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
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
857e27e3a8 Fix accidental variable leackage. 2015-09-16 18:15:26 +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
2026e5571e Some code cleanup and comments in isCrossing(). 2015-09-16 02:54:25 +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
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
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
e2d2c836e5 Some boolean code clean-up. 2015-09-13 14:19:56 +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
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
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
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
cdd0cee623 Activate resolving of self-intersections in boolean code.
Relates to #779
2015-09-12 10:24:19 +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
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
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
9d12a0a82c Rename Curve#isLinear() to #isStraight()
Relates to #652
2015-09-06 17:35:27 +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
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
8b67d8a1dc Remove #isStraight() in favor of #hasHandles() and implement #clearHandles()
Relates to #652
2015-09-06 12:47:35 +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
Jürg Lehni
4379e0b0f0 Improve boolean debug code. 2015-08-30 19:56:17 +02:00
Jürg Lehni
31771aa01d Insert results of boolean operations above whichever of the two paths appear further up in the stack. 2015-08-30 14:47:46 +02:00
Jürg Lehni
b4755ea699 Deactivate debug logging code. 2015-08-30 14:38:18 +02:00
Jürg Lehni
e07d8f55ea Add debug logging for intersections again. 2015-08-28 16:18:14 +02:00
Jürg Lehni
4ccb53ac68 Remove note about overlapping paths not working.
: D
2015-08-26 18:03:22 +02:00
Jürg Lehni
3ad897c943 Remove all boolean debug code.
Keeping it on the boolean-fix branch for now.
2015-08-26 17:47:18 +02:00
Jürg Lehni
da0d01ee09 More work on main boolean code.
Start addressing self-intersecting paths, and remove resulting open paths for now.
2015-08-26 17:36:20 +02:00
Jürg Lehni
a099377ac6 Remove debug logging for CurveLocation. 2015-08-26 16:58:52 +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
fd1f2e56f8 Optimize Item#intersects() by only checking to see if there are at least one intersection. 2015-08-25 11:45:28 +02:00
Jürg Lehni
7ca8ce3cbb Actually use selfOp argument for self operations.
Appears to be working fine.
2015-08-24 21:02:42 +02:00
Jürg Lehni
e242634011 Minor code clean-up. 2015-08-24 12:59:10 +02:00
Jürg Lehni
4be48cec16 A lot more work to correctly support overlapping edge cases in boolean operations: intersect(), exclude(), subtract() 2015-08-24 12:30:14 +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
15bcf2a7aa More work on supporting overlaps in boolean operations other than unite(). 2015-08-23 22:42:57 +02:00
Jürg Lehni
68832e0690 Revert "Switch to using 0, 1 instead of tMin, tMax for tangents."
This reverts commit edfabcbbd8.

; Conflicts:
;	src/path/PathItem.Boolean.js
2015-08-23 21:48:16 +02:00
Jürg Lehni
92ec09f451 Some debug code fixes and improvements. 2015-08-23 21:34:41 +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
edfabcbbd8 Switch to using 0, 1 instead of tMin, tMax for tangents.
getTangentAt() can handle that since a while now.
2015-08-23 09:43:28 +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
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
08bdfe585b Fix issue in getWinding() where rays were counted twice.
Closes #736.
2015-08-18 22:36:10 +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
10fb616665 Fixed leaked globals.
Detected using QUnit's "Check for Globals" feature!
2015-07-27 12:36:45 +02:00
Jürg Lehni
c1485e7068 Use < instead of <= when comparing against TOLERANCE 2015-06-16 19:33:21 +02:00
Jürg Lehni
b541088c6f A whole lot of documentation clean-up. 2015-06-16 17:50:37 +02:00
Jürg Lehni
15813107c0 Remove unused variables. 2015-02-26 13:44:09 +01:00
Jürg Lehni
6562f861ab More code clean-up. 2015-01-05 00:13:30 +01:00
Jürg Lehni
9977b6ab68 Some code clean-up. 2015-01-05 00:09:34 +01:00
Jürg Lehni
72bd150a34 Fix the rest of the failing tests that 6c6ad76c94 had caused.
Also closes #610.
2015-01-04 23:59:25 +01:00
Jürg Lehni
5f3df1f5a1 Fix some failing tests with PathItem#contains(), introduced by commit 6c6ad76c94 2015-01-04 23:28:39 +01:00
Jürg Lehni
5d875f2d83 Clean up code formatting. 2015-01-04 22:37:27 +01:00
Jürg Lehni
8928eaffd0 Merge branch 'refs/heads/master' into boolean-operations 2015-01-04 22:00:55 +01:00
Jürg Lehni
7e80e19e32 Insert results of boolean operations above the first path. 2015-01-04 21:59:31 +01:00
Jürg Lehni
d522e4aec2 Merge remote-tracking branch 'origin/master' into boolean-operations
Conflicts:
	src/path/PathItem.Boolean.js
2015-01-04 21:29:50 +01:00
Jürg Lehni
9f0a774fd0 Fix newly introduced error in clean-up. 2015-01-04 18:07:02 +01:00
Jürg Lehni
77193e1465 Clean-up new splitPath() code. 2015-01-04 17:37:15 +01:00
hkrish
718af4527f Boolean: handle linear segments correctly.
Earlier implementation was unfinished and did not reset some handles to
linear, this caused the winding to be miscalculated.

Conflicts:
	src/path/PathItem.Boolean.js
2015-01-04 17:30:19 +01:00
Jürg Lehni
afc14b9634 Reduce Numerical.TOLERANCE to 1e-6, and use the same value across the boolean code.
Yields very good results now, across all tests.
2015-01-04 15:54:50 +01:00
Jürg Lehni
cca6606f72 Reduce the amount of path reversing required.
We don't need paths at clockwise / counter-clockwise orientation. We simply need them oriented the same way, or the opposite way.
2015-01-04 01:51:27 +01:00
Jürg Lehni
390ef324f2 Find a better implementation for exclude() boolean operations, requiring only one pass instead of two. 2015-01-04 01:50:24 +01:00
Jürg Lehni
5c184e381b Merge remote-tracking branch 'origin/master' into boolean-operations
Conflicts:
	src/path/PathItem.Boolean.js
2015-01-03 21:09:31 +01:00
Jürg Lehni
b6a4815d03 Remove Curve#isHorizontal() as its implementation and precision is specific to boolean operations. 2015-01-03 21:02:12 +01:00
Jürg Lehni
46d7717812 Use standard values for tMin / tMax when calling getTangentAt() tracePaths() 2015-01-03 20:59:20 +01:00
Jürg Lehni
6bb6002d1a No need to double tolerances here. 2015-01-03 20:35:51 +01:00
Jürg Lehni
3e67f72393 Some code clean-up. 2015-01-03 20:25:12 +01:00
Jürg Lehni
51ec3325e3 Remove the need to store winding samples in array and sort.
Calculating the average winding value instead yields the same results.
2015-01-03 11:25:10 +01:00
Jürg Lehni
26f209c835 Implement better strategy for handling edge cases in winding samples. 2015-01-03 11:24:27 +01:00
Jürg Lehni
80e1a54171 Dirty temporary fix for new median winding code that struggles with circles. 2015-01-03 01:17:48 +01:00
Jürg Lehni
e195db2567 Handle empty paths in Path#reorient()
Closes #548
2015-01-03 00:46:24 +01:00
Jürg Lehni
001561decb Remove the dependency of Math.random() from boolean operation code.
Closes #473
2015-01-03 00:32:06 +01:00
Jürg Lehni
bb2fece225 Restructure code that determines median winding contribution. 2015-01-03 00:26:13 +01:00
Jürg Lehni
538eac6dc7 Use smaller tolerances in winding code, to address edge cases.
Closes #559
2015-01-02 23:47:26 +01:00
Jürg Lehni
51739e6e27 Merge remote-tracking branch 'origin/master' into solve-cubic
Conflicts:
	src/path/PathItem.Boolean.js
2015-01-02 21:26:04 +01:00
Jürg Lehni
4ed9ef54f2 Fix bug in Curve.filterIntersections() and clean up code a bit. 2015-01-02 21:19:18 +01:00
Jürg Lehni
878be7962e Merge branch 'refs/heads/master' into solve-cubic
Conflicts:
	src/path/Curve.js
	src/path/PathItem.Boolean.js
	src/util/Numerical.js
2015-01-02 15:33:23 +01:00
Jürg Lehni
b3c7be67fc Support optional hidden matrix argument in #getIntersections()
...in order to provide an alternative matrix for the passed path to check against.
2014-10-20 16:53:49 +02:00
Jürg Lehni
797a393c9a Remove various double white-spaces. 2014-08-25 12:49:14 +02:00
Jürg Lehni
48cb05a181 Replace tabs with 4 white-spaces. 2014-08-16 19:24:54 +02:00