/// <summary> /// Calculates the distance to the nearest edge from the point. /// </summary> /// <param name="point">The point.</param> /// <returns>The distance.</returns> public T GetDistanceToNearestEdge(Vector2D <T> point) { var dx = Scalar.Max(Scalar.Max(Scalar.Subtract(Min.X, point.X), Scalar <T> .Zero), Scalar.Subtract(point.X, Max.X)); var dy = Scalar.Max(Scalar.Max(Scalar.Subtract(Min.Y, point.Y), Scalar <T> .Zero), Scalar.Subtract(point.Y, Max.Y)); return(Scalar.Sqrt(Scalar.Add(Scalar.Multiply(dx, dx), Scalar.Multiply(dy, dy)))); }
/// <summary> /// Calculates the distance to the nearest edge from the point. /// </summary> /// <param name="point">The point.</param> /// <returns>The distance.</returns> public T GetDistanceToNearestEdge(Vector3D <T> point) { var max = Max; var dx = Scalar.Max(Scalar.Max(Scalar.Subtract(Origin.X, point.X), Scalar <T> .Zero), Scalar.Subtract(point.X, max.X)); var dy = Scalar.Max(Scalar.Max(Scalar.Subtract(Origin.Y, point.Y), Scalar <T> .Zero), Scalar.Subtract(point.Y, max.Y)); var dz = Scalar.Max(Scalar.Max(Scalar.Subtract(Origin.Z, point.Z), Scalar <T> .Zero), Scalar.Subtract(point.Z, max.Z)); return(Scalar.Sqrt(Scalar.Add(Scalar.Add(Scalar.Multiply(dx, dx), Scalar.Multiply(dy, dy)), Scalar.Multiply(dz, dz)))); }
/// <summary>Creates a spherical billboard that rotates around a specified object position.</summary> /// <param name="objectPosition">Position of the object the billboard will rotate around.</param> /// <param name="cameraPosition">Position of the camera.</param> /// <param name="cameraUpVector">The up vector of the camera.</param> /// <param name="cameraForwardVector">The forward vector of the camera.</param> /// <returns>The created billboard matrix</returns> public static Matrix2X3 <T> CreateBillboard <T>(Vector3D <T> objectPosition, Vector3D <T> cameraPosition, Vector3D <T> cameraUpVector, Vector3D <T> cameraForwardVector) where T : unmanaged, IFormattable, IEquatable <T>, IComparable <T> { Vector3D <T> zaxis = objectPosition - cameraPosition; var norm = zaxis.LengthSquared; if (!Scalar.GreaterThanOrEqual(norm, Scalar.As <float, T>(BillboardEpsilon))) { zaxis = -cameraForwardVector; } else { zaxis = Vector3D.Multiply(zaxis, Scalar.Reciprocal(Scalar.Sqrt(norm))); } Vector3D <T> xaxis = Vector3D.Normalize(Vector3D.Cross(cameraUpVector, zaxis)); Vector3D <T> yaxis = Vector3D.Cross(zaxis, xaxis); return(new(xaxis, yaxis)); }
public static Plane <T> Normalize <T>(Plane <T> value) where T : unmanaged, IFormattable, IEquatable <T>, IComparable <T> { /*if (Vector.IsHardwareAccelerated) * { * T normalLengthSquared = value.Normal.LengthSquared(); * if (MathF.Abs(normalLengthSquared - 1.0f) < NormalizeEpsilon) * { * // It already normalized, so we don't need to farther process. * return value; * } * T normalLength = MathF.Sqrt(normalLengthSquared); * return new Plane( * value.Normal / normalLength, * value.D / normalLength); * } * else*/ { T f = Scalar.Add( Scalar.Add(Scalar.Multiply(value.Normal.X, value.Normal.X), Scalar.Multiply(value.Normal.Y, value.Normal.Y)), Scalar.Multiply(value.Normal.Z, value.Normal.Z)); if (!Scalar.GreaterThanOrEqual(Scalar.Abs(Scalar.Subtract(f, Scalar <T> .One)), Scalar.As <float, T>(NormalizeEpsilon))) { return(value); // It already normalized, so we don't need to further process. } T fInv = Scalar.Reciprocal(Scalar.Sqrt(f)); return(new( Scalar.Multiply(value.Normal.X, fInv), Scalar.Multiply(value.Normal.Y, fInv), Scalar.Multiply(value.Normal.Z, fInv), Scalar.Multiply(value.Distance, fInv))); } }
/// <summary> /// Calculates the distance to the nearest edge from the point. /// </summary> /// <param name="point">The point.</param> /// <returns>The distance.</returns> public T GetDistanceToNearestEdge(Vector2D <T> point) => Scalar.Sqrt(GetDistanceToNearestEdgeSquared(point));