On 10 Sep 2012, at 13:20, JuanPi wrote: > On Mon, Sep 10, 2012 at 1:01 PM, c. <carlo.defa...@gmail.com> wrote: >> Hi, >> >> I need to compute the "signed distance" of a point P from a polygon Q, >> i.e., the distance of P from the polyline including Q with a "+" sign if >> the point is inside the polygon and a "-" sign if it is outside. >> >> I see "distancePointPolygon" in the geometry package computes the distance >> but always returns a positive number. Is there already a function to do >> what I need? >> >> If not, any idea where I can look-up the algorithm to modify >> "distancePointPolygon" >> according to my needs? >> >> Thanks, >> c. > > Hi, > > I would not modify the function, but use it together with inpolygon > (in the core geomtry package). > > I guess this is what you want > http://agora.octave.org/snippet/FRXH/ > > Let me know
I found that the function "distancePointPolyline" contains a for loop that can be easily vectorized away. As I work with a large number of points this has a strong impact on running time for me. Do you mind if I commit this patch? c. Index: inst/polygons2d/distancePointPolyline.m =================================================================== --- inst/polygons2d/distancePointPolyline.m (revision 10796) +++ inst/polygons2d/distancePointPolyline.m (working copy) @@ -1,5 +1,6 @@ ## Copyright (C) 2003-2011 David Legland <david.legl...@grignon.inra.fr> ## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal <carba...@ifi.uzh.ch> +## Copyright (C) 2012 Carlo de Falco (Speed up by vectorization) ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without @@ -51,17 +52,14 @@ # allocate memory for result minDist = inf * ones(Np, 1); - # process each point - for p = 1:Np - # construct the set of edges - edges = [poly(1:end-1, :) poly(2:end, :)]; + ## construct the set of edges + edges = [poly(1:end-1, :) poly(2:end, :)]; - # compute distance between current each point and all edges - dist = distancePointEdge(point(p, :), edges); + ## compute distance between current each point and all edges + dist = distancePointEdge(point, edges); - # update distance if necessary - minDist(p) = min(dist); - end + ## update distance if necessary + minDist = min(dist, [], 2); # process output arguments if nargout<=1 ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev