// Formulae for geometry. // Find the length of the hypotenuse of a right triangle given sides a and b. hypotenuseLength[a, b] := sqrt[a^2 + b^2] // Calculate area of arbitrary triangle given 3 sides of known length. // Calculate using Heron's formula. triangleArea[a, b, c] := { // Semiperimeter s s = 1/2 (a + b + c) area = sqrt[s (s-a) (s-b) (s-c)] return area } // Find the distance between a point (x0,y0) and a line specified by // two points (x1, y1), (x2, y2) pointToLineDistance[x0, y0, x1, y1, x2, y2] := { abs[ (x2-x1)(y1-y0) - (x1-x0)(y2-y1)] / sqrt[(x2-x1)^2+(y2-y1)^2 ] } // Returns true if a point is inside a polygon. // Adapted from // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html // // points is an array of two-dimensional arrays of points. // x,y is the point to test. // // Returns: // true if [x,y] is inside the polygon, false otherwise. pointInPolygon[points, x, y] := { c = false i = 0 npol = length[points] j = npol-1 while i < npol { xi = points@i@0 xj = points@j@0 yi = points@i@1 yj = points@j@1 if ((((yi<=y) and (y inside Ax + By + Cz + D > 0 ==> outside This does not test that the three points are non-colinear. */ planeCoefficients[p1, p2 ,p3] := { [A, B, C] = crossProduct[p1, p2, p3] D = (-A * p1@0) + (-B * p1@1) + (-C * p1@2) return [A, B, C, D] } "Geometry.frink included OK"