using Chernobyl.Mathematics.Movement;
namespace Chernobyl.Mathematics.Geometry
{
///
/// An interface used to describe a 2D or 3D object that has a width, height,
/// depth, position, scale, and orientation. This is the minimal
/// representation of an object that takes up space.
///
public interface IShape : ITransform
{
///
/// The largest width of the object in the object's X axis. This should
/// be the world width and not the local width.
///
float Width { get; }
///
/// The largest height of the object in the object's Y axis. This should
/// be the world height and not the local height
///
float Height { get; }
///
/// The largest depth of the object in the object's Z axis. If the depth
/// is zero, the object is 2D. This should be the world depth and not
/// the local depth.
///
float Depth { get; }
///
/// True if this is convex, false if it is concave
/// or has 0 (such as a point). A
/// is convex if for every pair of points within
/// the object, every point on the straight line segment that joins them
/// is also within the object. A concave is the
/// opposite of this.
///
bool IsConvex { get; }
///
/// The amount of space taken up by an object on a flat plane in
/// square metres (m^2).
///
float Area { get; }
///
/// The amount of 3D space this object consumes in cubic metres (m^3).
/// If this object is 2D, then the value of this property is zero.
///
float Volume { get; }
///
/// The length of the path that surrounds a shape specified in metres (m).
/// In the case of a closed curve such as a circle, this value represents
/// the circumference of the object.
///
float Perimeter { get; }
///
/// The minimum number of coordinates needed to specify each point
/// within this object. For example: a point has 0 dimensions, a
/// line has 1 dimension, a circle or rectangle has 2 dimensions, a
/// cube or sphere has 3 dimensions, and a moving cube or sphere has 4.
///
uint Dimensions { get; }
}
}