protected internal override double DistanceFrom(Tuple4 point) { if (point.IsVector()) { throw new ArgumentException("Argument is not a point"); } // If d.x < 0, then -1 < p.x < 1, and same logic applies to p.y, p.z // So if all components of d are negative, then p is inside the unit cube // vec3 d = abs(p) - vec3(1.0, 1.0, 1.0); double dX = Math.Abs(point.X) - 1.0; double dY = Math.Abs(point.Y) - 1.0; double dZ = Math.Abs(point.Z) - 1.0; // Assuming p is inside the cube, how far is it from the surface? // Result will be negative or zero. double insideDistance = Math.Min(Math.Max(dX, Math.Max(dY, dZ)), 0.0); // Assuming p is outside the cube, how far is it from the surface? // Result will be positive or zero. if (dX < 0.0) { dX = 0.0; } if (dY < 0.0) { dY = 0.0; } if (dZ < 0.0) { dZ = 0.0; } double outsideDistance = Math.Sqrt(dX * dX + dY * dY + dZ * dZ); return(insideDistance + outsideDistance); }
protected internal override double DistanceFrom(Tuple4 point) { if (point.IsVector()) { throw new ArgumentException("Argument is not a point"); } return(Math.Sqrt(point.X * point.X + point.Y * point.Y + point.Z * point.Z) - 1.0); }