<div dir="ltr"><div dir="ltr">OK, I have the solution now.<br><br>1) Starting at point X,Y draw a circle of radius B (B = buffering dist)<br><br>2) Construct the visibility polygon from X,Y limited by the circle.<br><br>3) The visibility polygon will be effectively a list of rays from<br>   X,Y to points on the obstacles.  Collect the list of points where<br>   the rays touch an obstacle at a line segment end-point - including </div><div dir="ltr">   where they touch tangentially and may carry on past that edge point</div><div>   to another obstacle.  I.e. one ray may generate more than one point.</div><div dir="ltr"><br>4) At each of those points at a distance D from X,Y, recursively invoke</div><div dir="ltr">   this algorithm with the distance parameter reset to B-D, until the remaining<br>   distance is zero.<br><br>The resulting polygon will consist of straight line segments (from<br>obstacle edges facing the source points, and projections past edges)<br>plus circular arcs where the circles expire due to having reached the<br>maximum buffering distance without having touched any object.<br><br>So the only polygon operation really needed to implement this is the<br>construction of the simple distance-limited visibility polygon, which is</div><div dir="ltr">done by finding the objects within range B from X,Y and enumerating</div><div dir="ltr">the end-points of the segments composing that object facing X,Y.  The<br>recursion takes care of the complexity of shapes and the union of</div><div>all the partial results creates the final buffered object.</div><div dir="ltr"><br></div><div>I hope I managed to explain that OK. If not, let me know and I'll try to</div><div>generate some graphics to make it more clear.</div><div><br></div><div>G</div></div>