static void GetPointOnPlane(Random random, float centralExclusion, float span, ref Vector3 anchor, ref Vector3 normal, out Vector3 point) { Vector2 localPoint; var exclusionSquared = centralExclusion * centralExclusion; do { localPoint = span * (new Vector2((float)random.NextDouble(), (float)random.NextDouble()) - new Vector2(0.5f)); } while (localPoint.LengthSquared() < exclusionSquared); Vector3 basisX; float basisXLengthSquared; do { GetUnitDirection(random, out var randomDirection); Vector3x.Cross(normal, randomDirection, out basisX); basisXLengthSquared = basisX.LengthSquared(); } while (basisXLengthSquared < 1e-7f); Vector3x.Cross(normal, basisX, out var basisZ); point = anchor + basisX * localPoint.X + basisZ * localPoint.Y; }
//public static float TestTransformScalarOld(int iterationCount) //{ // bVector3 v1 = new bVector3(1, 2, 3); // bVector3 v2 = new bVector3(1, 2, 3); // float accumulator = 0; // for (int i = 0; i < iterationCount; ++i) // { // bVector3 r0, r1; // bVector3.Cross(ref v1, ref v2, out r0); // bVector3.Cross(ref r0, ref v2, out r1); // bVector3.Cross(ref r1, ref v2, out r0); // bVector3.Cross(ref r0, ref v2, out r1); // bVector3.Cross(ref r1, ref v2, out r0); // bVector3.Cross(ref r0, ref v2, out r1); // bVector3.Cross(ref r1, ref v2, out r0); // bVector3.Cross(ref r0, ref v2, out r1); // bVector3.Cross(ref r1, ref v2, out r0); // bVector3.Cross(ref r0, ref v2, out r1); // accumulator += 0.000001f * r1.X; // } // return accumulator; //} public static float TestTransformScalar(int iterationCount) { Vector3 v1 = new Vector3(1, 2, 3); Vector3 v2 = new Vector3(1, 2, 3); float accumulator = 0; for (int i = 0; i < iterationCount; ++i) { Vector3 r0, r1; Vector3x.Cross(ref v1, ref v2, out r0); Vector3x.Cross(ref r0, ref v2, out r1); Vector3x.Cross(ref r1, ref v2, out r0); Vector3x.Cross(ref r0, ref v2, out r1); Vector3x.Cross(ref r1, ref v2, out r0); Vector3x.Cross(ref r0, ref v2, out r1); Vector3x.Cross(ref r1, ref v2, out r0); Vector3x.Cross(ref r0, ref v2, out r1); Vector3x.Cross(ref r1, ref v2, out r0); Vector3x.Cross(ref r0, ref v2, out r1); accumulator += 0.000001f * r1.X; } return(accumulator); }