diff --git a/src/OpenFOAM/meshes/primitiveShapes/triangle/triangle.H b/src/OpenFOAM/meshes/primitiveShapes/triangle/triangle.H index de339b172e..6e8030c797 100644 --- a/src/OpenFOAM/meshes/primitiveShapes/triangle/triangle.H +++ b/src/OpenFOAM/meshes/primitiveShapes/triangle/triangle.H @@ -40,6 +40,7 @@ SourceFiles #include "tensor.H" #include "pointHit.H" #include "Random.H" +#include "cachedRandom.H" #include "FixedList.H" #include "UList.H" #include "linePointRef.H" @@ -162,6 +163,10 @@ public: // distribution inline Point randomPoint(Random& rndGen) const; + //- Return a random point on the triangle from a uniform + // distribution + inline Point randomPoint(cachedRandom& rndGen) const; + //- Calculate the barycentric coordinates of the given // point, in the same order as a, b, c. Returns the // determinant of the solution. diff --git a/src/OpenFOAM/meshes/primitiveShapes/triangle/triangleI.H b/src/OpenFOAM/meshes/primitiveShapes/triangle/triangleI.H index 1f4465637f..fbc5a14286 100644 --- a/src/OpenFOAM/meshes/primitiveShapes/triangle/triangleI.H +++ b/src/OpenFOAM/meshes/primitiveShapes/triangle/triangleI.H @@ -244,6 +244,25 @@ inline Point Foam::triangle::randomPoint(Random& rndGen) const } +template +inline Point Foam::triangle::randomPoint +( + cachedRandom& rndGen +) const +{ + // Generating Random Points in Triangles + // by Greg Turk + // from "Graphics Gems", Academic Press, 1990 + // http://tog.acm.org/GraphicsGems/gems/TriPoints.c + + scalar s = rndGen.sample01(); + + scalar t = sqrt(rndGen.sample01()); + + return (1 - t)*a_ + (1 - s)*t*b_ + s*t*c_; +} + + template Foam::scalar Foam::triangle::barycentric (