Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change the implementation of getWinding() again to pass all unit tests. #944

Merged
merged 1 commit into from
Feb 5, 2016
Merged

Change the implementation of getWinding() again to pass all unit tests. #944

merged 1 commit into from
Feb 5, 2016

Conversation

iconexperience
Copy link
Contributor

This new version does not count any intersections if the point is on a y-monotonic curve, but at the final calculation it sets the winding to at least 1 if the point is on a curve.

…. This new version does not count any intersections if the point is on a y-monotonic curve, but at the final calculation it sets the winding to at least 1 if the point is on a curve.
@iconexperience
Copy link
Contributor Author

This was expected to fail because the unit test Path.contains() (straight curves with zero-winding) counts some points on a curve as being outside the path.

@lehni: Maybe I should have combined the two pull requests. Combined they should have passed the Travis checks.

@iconexperience
Copy link
Contributor Author

Here is another test that fails with the current code, but not after the new change:

image

var c1 = new Path.Circle({center: [200, 200], radius: 100});
var c2 = new Path.Circle({center: [150, 200], radius: 50});
var cp = new CompoundPath({children: [c1, c2], strokeColor: "blue"});
var point = new Point(100, 200);
new Path.Circle({center: point, radius: 3,  fillColor: "red"});
console.log("contains point: " + cp.contains(point));

Here is the Sketch

lehni added a commit that referenced this pull request Feb 5, 2016
Change the implementation of getWinding() again to pass all unit tests.
@lehni lehni merged commit ec75985 into paperjs:winding-fix Feb 5, 2016
@lehni
Copy link
Member

lehni commented Feb 5, 2016

So I have a question:

On line 396, you test if the point is on the horizontal curve like this, comparing against zero with < 0. I don't fully understand this check, could you explain it?

(px - x) * (px - prevXEnd) < 0)

On line 409, you have the same check, but with <= 0. intentional?

(px - values[0]) * (px - values[6]) <= 0

@lehni
Copy link
Member

lehni commented Feb 5, 2016

And regarding #944 (comment), I shall turn this case into a unit test! We have to protect ourselves against regressions in edge cases like these.

@lehni
Copy link
Member

lehni commented Feb 5, 2016

@iconexperience and yes, it would have been better to just create one PR. a PR can contain many commits. In fact, even after opening a PR here, all the new commits to your branch that you created the PR for will appear here, until I merge the PR in. And since the two topics are so closely related, one PR would have been more suitable.

Another topic: It's good if the commit messages are quite short. It's fine to write more information into a commit message, but it's better to keep the first line short, and then add a 2nd paragraph with the details, like this:

Change the implementation of getWinding() again, so we pass all tests

This new version does not count any intersections if the point is on a y-monotonic curve, but at the final calculation it sets the winding to at least 1 if the point is on a curve.

This is also to prevent GitHub force-breaking the first line. But it's just considered good form, generally.

@iconexperience
Copy link
Contributor Author

@lehni If the distances px - x and px - prevXEnd are have opposite signs, it means that x is between px and prevXEnd. By using <0instead of <=0 we exclude the cases px == x and prevXEnd == x, but these are already handled in line 383, so we save one character :)

Please note that we combine this with the condition py === yStart (which implies py === prevEndY), so this test checks if p is on the horizontal line between [yStart, xStart] and [prevXEnd, prevYEnd].

image

But in line 409 we need to include the end points of the line, otherwise we would miss this point, because there is no non-horizontal monocurve between two horizontal curves:

image

@iconexperience
Copy link
Contributor Author

And thanks for all the help on becoming a better Github citizen :)

lehni added a commit that referenced this pull request Feb 5, 2016
@lehni
Copy link
Member

lehni commented Feb 5, 2016

: )

bmacnaughton added a commit to bmacnaughton/paper.js that referenced this pull request Feb 7, 2016
Commits not specifically documented because they were: internal, already documented, of fixed a bug introduced in the develop branch (wasn't present in 0.9.25) in chronological order of commits (starting with 45595b2 - I haven't gone back):
- Fix unit test error on Node.js 45595b2
- Implement unit tests for SVG Importing, based on visual comparison. … a12e99e
- Fix wrongly copied attributes in Item#reduce() … 8e25327
- Events: paper namespace may not be initialized when key evens are emi… … b2f3b58
- SVG: Some renaming omitted in previous commit. 1c4ff31
- SVG: Rename 'SVG' prefix to 'Svg' … af59847
- Implement tests for paperjs#69721dce1a
- Move Path_Bounds tests to Item_Bounds. … a02d724
- Fix accidentally leaked global variable. 74d1889
- Simplify getWindings(), The first curve of a loop always has the 'las… … 0716ebb
- Merge pull request paperjs#938 from iconexperience/getWinding-simplification … 53269ab
- Optimize Emitter._installEvents() … 0f084ea
- JSON: Prevent `name: undefined` exports. 7888d1d
- Change the way we determine the winding in getWinding(). Now the wind… … aed9d05  (paperjs#936)
- Clean-up changes from paperjs#939 41aca10
- Define unit test for #internalBounds regression. 336460b
- Fix internalBounds regression caused by 1ac8e46 0152439
- Revert "Change the way we determine the winding in getWinding()." f7b1aca
- Use correct SVG namespace again. … fc4bdf4
- Replace the "straight curves with zero-winding" test with a more comp… … e03c8cd
- Change the implementation of getWinding() again, so we pass all tests… … 5b31aee
- Merge pull request paperjs#944 from iconexperience/fix-getWinding … ec75985
- Merge pull request paperjs#943 from iconexperience/replace-path-contains-test … 23045bb
- Do not snap curve points to t = 0 / 1 with epsilon … 0371f66 (in boolean ops)
- Clean-up unit test for paperjs#943 and add edge case from paperjs#944a59a535
- Some comment cleanup. ffe42a0
- Merge branch 'winding-fix' into develop … 5a46620
- Some code cleanup for winding-fix. 55909b8
bmacnaughton added a commit to bmacnaughton/paper.js that referenced this pull request Mar 22, 2016
Commits not documented listed here, starting with 45595b2. They are not included in the changelog because the appeared to be internal or already documented or they were a fix for a bug that was introduced in "develop" branch. There were commits before 45595b2 but that's when I started recording what I didn't put in the changelog.

Not sure whether the curveAt/CurveAtTime functions are deprecated or removed.

Format: commit message, commit ID. In chronological order of commits:

- Fix unit test error on Node.js 45595b2
- Implement unit tests for SVG Importing, based on visual comparison. … a12e99e
- Fix wrongly copied attributes in Item#reduce() … 8e25327
- Events: paper namespace may not be initialized when key evens are emi… … b2f3b58
- SVG: Some renaming omitted in previous commit. 1c4ff31
- SVG: Rename 'SVG' prefix to 'Svg' … af59847
- Implement tests for paperjs#69721dce1a
- Move Path_Bounds tests to Item_Bounds. … a02d724
- Fix accidentally leaked global variable. 74d1889
- Simplify getWindings(), The first curve of a loop always has the 'las… … 0716ebb
- Merge pull request paperjs#938 from iconexperience/getWinding-simplification … 53269ab
- Optimize Emitter._installEvents() … 0f084ea
- JSON: Prevent `name: undefined` exports. 7888d1d
- Change the way we determine the winding in getWinding(). Now the wind… … aed9d05  (paperjs#936)
- Clean-up changes from paperjs#939 41aca10
- Define unit test for #internalBounds regression. 336460b
- Fix internalBounds regression caused by 1ac8e46 0152439
- Revert "Change the way we determine the winding in getWinding()." f7b1aca
- Use correct SVG namespace again. … fc4bdf4
- Replace the "straight curves with zero-winding" test with a more comp… … e03c8cd
- Change the implementation of getWinding() again, so we pass all tests… … 5b31aee
- Merge pull request paperjs#944 from iconexperience/fix-getWinding … ec75985
- Merge pull request paperjs#943 from iconexperience/replace-path-contains-test … 23045bb
- Do not snap curve points to t = 0 / 1 with epsilon … 0371f66 (in boolean ops)
- Clean-up unit test for paperjs#943 and add edge case from paperjs#944a59a535
- Some comment cleanup. ffe42a0
- Merge branch 'winding-fix' into develop … 5a46620
- Some code cleanup for winding-fix. 55909b8
- Include NPM and Bower badges. 80e6246
- Improve handling of view updates and detection of invisible documents. … da216aa
- Fix new exception in unit tests. de9653a
- Rearrange method sequence in Path. d1b11c6
- Clean-up PathFitter code. e5d139c
- No need to pass normalized tangents to PathFitter#fitCubic() … c793538
- Fix JSDoc warning on Style class. a48d138
- Implement PathItem#getNearestLocation() / #getNearestPoint() … 717bc4b
- Implement Item#_hitTestChildren() … 740c94e
- Some CurveLocation cleanup. … 00d2e2a
- Remove duplicate unit tests. ed43477
- SVGExport: Remove unnecessary calls to Point#transform() in exportGra… … adc5b86
- Remove unnecessary double-spaces. 98fc513
- Improve fix for paperjs#650c1b7366
- SVGImport: Further improve handling of gradients … d9e09b9
- Gulp: Add test:browser task, to solve CORS issues on Chrome. 8542eb6
- SVGImport: Improve consistency of style handling. df57c4a
- SVGImport: Inherit default styles on Node.js too. e38a33f
- SvgImport: Always create a clip-item when viewBox is specified. 68c4541
- Tests: Implement additional tests for SvgImport. c0b39c4
- Travis CI: Use Arial in all tests. cb79232
- Shortcut Curve.evaluate() for t === 1 to avoid imprecision. aa1f219 (paperjs#960)
- Part 1 of large refactoring of bounds handling. 55c5f42
- Update straps.js 892e567
- Part 2 of large refactoring of bounds handling. 12f829c
- Travis CI: Switch to g++ 4.8 to see if this solves strange new buildi… … 5ec5c26
- Introduce Base.filter(), to copy and filter object properties. 6d5d1ce
- Implement unit tests for Item#getItems() with overlapping / inside pr… … 80c8aae
- Merge pull request paperjs#962 from iconexperience/fix-issue-960 … 7c24fc9
- Add test for paperjs#960 and improve fix a bit. … e2bc83a
- Remove unnecessary edge-case handling in CurveLocation#isCrossing() … 84a75e3 (paperjs#951, paperjs#959 - but falls into boolean fixes in general).
- Implement consistent checks for fill / stroke / shadow styles in test… … c6bcf43
- Clean-up previous commit. 0a196da
- Boolean: Implement proper handling of fully overlapping (identical) p… … 3348fb7 (paperjs#923, paperjs#958 - but falls into boolean fixes in general).
- Boolean: Only compare segments when determining if paths are identitcal. 009761d (boolean fixes in general).
- Switch from new Base() to Base.set({}) where possible. c3fff9f
- Docs: Fix warning about isFlatEnough() 27197bd
- Better detect code that requires a tool object. … dbd7a90 (in example fixes)
- Matrix: Switch to a better implementation of #decompose() … 3ee46ff
- Implement failing test for paperjs#968 9c9f43d
- Hit-Test: Pass viewMatrix as argument instead of in options object. fa6c1f4
- Update Curve.js … fb76065
- Update Path.js … add2866
- Clean up PR paperjs#93179d4461
- Improve handling of points on paths in getWinding() e2eaf87
- Adjust comments to match new implementation 406e6c9
- Fix regression introduced in 4e7fa2f 55e7689
- Implement more unit tests for PaperScope#settings.insertItems 01fade8
- Merge pull request paperjs#971 from iconexperience/fix-issue-968 … 4c72d98 (boolean fixes in general)
- Simplify code from paperjs#971 and activate unit test for it again. 8d5c922
- Document options.insert in #importSVG() 3c3c8d9
- List all supported events in event methods on View. 9f9222f
- Switch to PathItem.create() in unit tests. 0e2498b
- Fix failing SVG unit test. 08e51b5
- Fix failing unit tests. 3d330da
- SvgImport: Fix issues introduced in 6f4890c 16a7baa
- Merge pull request paperjs#976 from iconexperience/patch-2 … 7f48486
- SVG Export: Do not filter out empty paths. 6975690
- Fix paperjs#977: Apply hit-testing tolerance to fills in Shape. 4081afb
- Fix paperjs#977: Implement unit-tests. 6df4602
- Fix paperjs#982: Make sure `self` points to the global scope on Webpack. b5c837b
- Extend mapping of attribute names to required namespaces a4757b3
- Add trailing slashes to svg related namespaces (xmlns, xlink) 49104c5
- Merge pull request paperjs#984 from aschmi/fix-namespaces-of-exported-svg … 623ec73
- SVG Import: Fix namespacing issues introduced by paperjs#984. acb1e40
- SVG: Add comments explaining IE related changes in paperjs#984. 50bd5be
- Implement unit tests for paperjs#9911cb2916
- fix paperjs#994: Revert commit b5af47a69c3470
- Rename SegmentSelection related internal objects and properties.  … 1db419a
- Simplify Path#getArea()  … 7dd110f
- jsdom v8.0.0 equires Node.js v4.0.0 or newer. 7300260
- Implement Path#splitAt(offset)  … da7d0d8
- Add more unit tests for SvgImport.  … 7a4794d
- SVG Import: Add more tests.  … d52a6f3
- Refactor GradientStop: Improve handling of optionally defined color a…  … d93aca6
- Travis CI: See if using Arial solves the failing test. 17555b1
- Travis CI: Use Arial in all SVG tests and reduce tolerance. d6ce470
- Travis CI: Adjust SVG test tolerances. beabd6b
- Travis CI: More SVG test adjustments. bb19fad
- Replace Item#_boundsSelected with #_selectBounds  … 336bc10
- More clean-up of selection handling refactoring. 00b2102
lehni added a commit that referenced this pull request Jul 18, 2016
lehni added a commit that referenced this pull request Jul 22, 2016
But keep deactivated as it is currently failing, see #1116
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants