[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