public static Vertex3D GetRotatedAxis(float angle, Vertex3D axis, Vertex3D temp) { var u = axis.Clone().Normalize(); var sinAngle = MathF.Sin((float)(System.Math.PI / 180.0) * angle); var cosAngle = MathF.Cos((float)(System.Math.PI / 180.0) * angle); var oneMinusCosAngle = 1.0f - cosAngle; var rotMatrixRow0 = new Vertex3D(); var rotMatrixRow1 = new Vertex3D(); var rotMatrixRow2 = new Vertex3D(); rotMatrixRow0.X = u.X * u.X + cosAngle * (1.0f - u.X * u.X); rotMatrixRow0.Y = u.X * u.Y * oneMinusCosAngle - sinAngle * u.Z; rotMatrixRow0.Z = u.X * u.Z * oneMinusCosAngle + sinAngle * u.Y; rotMatrixRow1.X = u.X * u.Y * oneMinusCosAngle + sinAngle * u.Z; rotMatrixRow1.Y = u.Y * u.Y + cosAngle * (1.0f - u.Y * u.Y); rotMatrixRow1.Z = u.Y * u.Z * oneMinusCosAngle - sinAngle * u.X; rotMatrixRow2.X = u.X * u.Z * oneMinusCosAngle - sinAngle * u.Y; rotMatrixRow2.Y = u.Y * u.Z * oneMinusCosAngle + sinAngle * u.X; rotMatrixRow2.Z = u.Z * u.Z + cosAngle * (1.0f - u.Z * u.Z); return(new Vertex3D(temp.Dot(rotMatrixRow0), temp.Dot(rotMatrixRow1), temp.Dot(rotMatrixRow2))); }
private static bool FlatWithAccuracy3(Vertex3D v1, Vertex3D v2, Vertex3D vMid, float accuracy) { // compute the square of double the signed area of the triangle (v1, vMid, v2) var cross = vMid.Clone().Sub(v1).Cross(v2.Clone().Sub(v1)); var areaSq = cross.LengthSq(); return(areaSq < accuracy); }
internal CatmullCurve3D(Vertex3D v0, Vertex3D v1, Vertex3D v2, Vertex3D v3) { var(dt0, dt1, dt2) = Clamp( MathF.Sqrt(v1.Clone().Sub(v0).Length()), MathF.Sqrt(v2.Clone().Sub(v1).Length()), MathF.Sqrt(v3.Clone().Sub(v2).Length()) ); _c.X = InitNonuniformCatmullCoeffs(v0.X, v1.X, v2.X, v3.X, dt0, dt1, dt2); _c.Y = InitNonuniformCatmullCoeffs(v0.Y, v1.Y, v2.Y, v3.Y, dt0, dt1, dt2); _c.Z = InitNonuniformCatmullCoeffs(v0.Z, v1.Z, v2.Z, v3.Z, dt0, dt1, dt2); }