On 5 April 2016 at 00:51, Andrei Chis <[email protected]> wrote:

btw, Andrei , if you looking how you can test if point contains shape or
not, take a look at AthensCurveFlattener.
It converts curved path, that containing Bezier curves (or not) into simple
polygonal shape that consists only from a simple lines.
Then there AthensPolygonTester, that has the piece you missing:
- a small algorithm that can test if given point inside or outside that
polygon.

Please note that it is simpler even-odd rule algorithm. It not works
correctly for all possible cases.

There's another algorithm- winding number algorithm, that is much better,
but i had to switch to other stuff before were able to get my hands to it.
It is more reliable, since it can work for self-intersecting shapes.

https://en.wikipedia.org/wiki/Point_in_polygon

So, what you need is to wire these things down to Bloc.Then whenever you
need to test whether point within shape or not, you can convert any path
into polygon and perform the test. And of course, you can cache the results
of conversion in order to avoid expensive computations every time you need
to perform such tests. Once path is converted, the test is relatively cheap
and costs something like O(n), where n is number of line segments.

Or maybe, to simplify things, you could extend the shape protocol and
introduce #containsPoint:
or as variant #containsPoint:ifNotAvailable:
so that if shape implements such feature - it can answer true or false, and
if not - evaluating a block. So, you don't have to implement all tests for
all kinds of shapes that invented or not yet invented in universe.

-- 
Best regards,
Igor Stasenko.

Reply via email to