[Cuis-dev] #isCloserThan:toPoint: on circle
Juan Vuletich
juan at jvuletich.org
Sun Aug 15 13:49:13 PDT 2021
Hi Hilaire,
On 8/15/2021 7:14 AM, Hilaire Fernandes via Cuis-dev wrote:
>
> Hi Juan,
>
> I have noted that with a drawn circle[1], so not filled contrary to a
> disc, the detection method in subject respond true when the point is
> on any position *inside* the circle. It should be true only when the
> circle is filled (disc).
>
Well, we can detect with pixel precision only one morph, the visible
one. I think you had asked about detecting all the (possibly
overlapping) morphs that are at some point (or close to it). Adding a
stack of morphID at each pixel is extremely memory intensive. We could
easily need half a gigabyte of memory for a 4k display. Then I came up
with the contour idea, that only requires a maximum of 16 kBytes per
morph (i.e. most likely never more than a couple of megabytes). But
contours record, for each display y(i.e. for each line) the leftmost and
rightmost affected pixels. It is a kind of "convex hull".
I don't know a general, all-morphs solution that doesn't require a ton
of RAM. If you can live with detecting only the top morph, then
#containsGlobalPoint: (or a new method that also takes into account a
distance), is a possible solution.
If you absolutely need detecting all morphs, but not at "transparent"
inner points, and, it is only for instances of a few classes, like line
and circle, then implementing a specific method in those classes is an
alternative. It would be quite complicated if you also need, for
example, Beziers.
I'm sorry I don't know a better solution.
> Btw, when I insert an halt in the draw method, it freezes the image.
> You fixed this issue previously, may be it is a regression or
> something else.
>
Right now, #drawOn: is protected against Error, but not against Halt.
Just played a bit with an improvement. Will push it later.
> Best
>
> Hilaire
>
> [1] Draw as:
>
> DrGCircleMorph>>drawCircleOn: aCanvas
> | center r |
> center _ self drawable worldToMorph: mathItem center.
> r _ self drawable worldToPixel: mathItem radius.
> style isFilled
> ifTrue: [
> aCanvas strokeWidth: style borderWidth color: borderColor
> fillColor: color do: [
> aCanvas circleCenter: center radius: r] ]
> ifFalse: [
> aCanvas strokeWidth: style borderWidth color: borderColor
> do: [
> aCanvas circleCenter: center radius: r] ]
>
> --
> GNU Dr. Geo
> http://drgeo.eu
> http://blog.drgeo.eu
Cheers,
--
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
https://github.com/jvuletich
https://www.linkedin.com/in/juan-vuletich-75611b3
@JuanVuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20210815/e49aa67c/attachment.htm>
More information about the Cuis-dev
mailing list