[email protected] a écrit :
> Etienne Bellemare Racine <[email protected]> writes:
>
>
>> I'm looking for a way to find the largest circle fitting in an irregular
>> polygon. This is not the real definition of an incircle (as it has to be
>> tangent to all edges, but it's a more synthetic title).
>>
>
> The mathematical definition of the incircle of a polygon is: the largest
> circle fitting inside it.
> See the Wikipedia entry for 'incircle'.
> If the polygon is convex, then the incircle will be tangent to at least three
> of the edges of the
> polygon. In general it cannot be tangent to all edges of the polygon (that
> can only happen for regular polygons).
> If the polygon is not convex, then the incircle does not need to be tangent
> to any edges: it might just touch the
> polygon at three concave vertices.
>
I understand, being tangent is a properties of some incircle, but the
definition is clear (and clearly what I want). Thanks for the precision.
>
>> Now I would like to iteratively find the incircle in a polygon until a
>> certain radii (i.e. as if I was stuffing balls in my polygon, from the
>> biggest to the smallest). So I have to subtract that circle to my polygon.
>> Should I subtract it from my polygon by adding an inside loop (setting
>> hole to TRUE, is it that simple) or can I substract it directly from the
>> owin object ?
>>
>
> You can use disc() to create an owin object that represents a circle,
> and intersect.owin and complement.owin to remove the disc from your polygon.
>
> Here is a piece of code that will do what you wanted.
>
> It's rather fun to try e.g.
> data(demopat)
> stuffballs(demopat$window, 100, TRUE)
>
Indeed, it's fun. Especially using plotit=TRUE; I hope it can help me in
my research !
> Please note that the current version of spatstat (1.15-2) converts the
> polygon to a pixel mask
> and uses the 8-connected distance transform to compute the incircle.
> Effectively this treats the
> circles as octagons. So, don't expect the circles to be perfectly tangent to
> the edges.
> You can see a few anomalies in the example above.
>
I had noticed it, but I don't really need exact precision. As the
polygons are generated from a grid vectorization, would you recommend to
use the grid directly and generate the incircle using disc(...,
mask=FALSE) ?
> In the next version of spatstat, the distmap algorithm for polygons will be
> changed so that this
> problem is vastly ameliorated.
>
>
Thank you very much, Etienne
> Adrian Baddeley
>
> ----------------------
> require(spatstat)
>
> stuffballs <- function(W, rmin, plotit=TRUE) {
> stopifnot(is.owin(W))
> stopifnot(rmin > 0)
> if(plotit)
> plot(W)
> W <- as.mask(W)
> B <- as.rectangle(W)
> circles <- data.frame(x=numeric(0), y=numeric(0), r=numeric(0))
> ncircles <- 0
> while(TRUE) {
> circ <- incircle(W)
> if(circ$r <= rmin)
> break
> circles <- rbind(circles, as.data.frame(circ))
> D <- with(circ, disc(r, c(x,y)))
> if(plotit)
> plot(D, add=TRUE)
> W <- intersect.owin(W, complement.owin(D, B))
> if(area.owin(W) == 0)
> break
> }
> return(circles)
> }
>
>
>
[[alternative HTML version deleted]]
_______________________________________________
R-sig-Geo mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo