distance()
function. In this short article I present a simple alternative. While working on a new shader I noticed I got runtime errors that crashed Blender when I used the three argument variant of the
distance()
function to compute the shortest distance of a point to a line segment. I filed a bug report and although the Blender devs were very quick to verify and respond, the fact remains that it is a gap in the OSL libraries that won't be fixed by the Blender devs (although they have implemented a fix that will prevent Blender from crashing). That leaves us with the task of providing a workaround. Fortunately that is not too difficult. Finding the shortest distance to a line segment is of course bssic geometry so it was easy enough to find numerous online resources. Based on those (references are in the code below) I came up with the following code:
#include "stdosl.h" // replacement for the missing distance(p, p1, p2) function // shortest distance to a line segment from p1 -> p2 // based on information from the following two sites: // http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment // http://paulbourke.net/geometry/pointlineplane/ float minimum_distance(point v, point w, point p) { // Return minimum distance between line segment vw and point p vector s = w - v; float l2 = dot(s,s); if (l2 == 0.0) return distance(p, v); float t = dot(p - v, s) / l2; if (t < 0.0) return distance(p, v); else if (t > 1.0) return distance(p, w); vector projection = v + t * (s); return distance(p, projection); }I will not explain it here, refer to the sources mentioned in the code if you are interested, especially Paul Bourke's site is a treasure trove of useful information.
No comments:
Post a Comment