// Given sin and cos of max angle between normals calculate whether f0 and f1 // on celli make larger angle. Uses sinAngle only for quadrant detection. bool largerAngle ( const primitiveMesh& mesh, const scalar cosAngle, const scalar sinAngle, const label celli, const label f0, // face label const label f1, const vector& n0, // normal at f0 const vector& n1 ) { const labelList& own = mesh.faceOwner(); bool sameFaceOrder = !((own[f0] == celli) ^ (own[f1] == celli)); // Get cos between faceArea vectors. Correct so flat angle (180 degrees) // gives -1. scalar normalCosAngle = n0 & n1; if (sameFaceOrder) { normalCosAngle = -normalCosAngle; } // Get cos between faceCentre and normal vector to determine in // which quadrant angle is. (Is correct for unwarped faces only!) // Correct for non-outwards pointing normal. vector c1c0(mesh.faceCentres()[f1] - mesh.faceCentres()[f0]); c1c0 /= mag(c1c0) + VSMALL; scalar fcCosAngle = n0 & c1c0; if (own[f0] != celli) { fcCosAngle = -fcCosAngle; } if (sinAngle < 0.0) { // Looking for concave angles (quadrant 3 or 4) if (fcCosAngle <= 0) { // Angle is convex so smaller. return false; } else { if (normalCosAngle < cosAngle) { return false; } else { return true; } } } else { // Looking for convex angles (quadrant 1 or 2) if (fcCosAngle > 0) { // Concave angle return true; } else { // Convex. Check cos of normal vectors. if (normalCosAngle > cosAngle) { return false; } else { return true; } } } }