using System.Collections.Generic;
using Chernobyl.Mathematics.Movement;

namespace Chernobyl.Mathematics.Geometry
{
    /// <summary>
    /// A part of a line that is bounded by two distinct end points and contains 
    /// every point on the line between its end points. This type is an
    /// <see cref="IArc"/> but can only contain two points (<see cref="Point1"/>
    /// and <see cref="Point2"/>) in its <see cref="IEnumerable{T}"/>. In
    /// addition, this type is an <see cref="ITransform"/> whose 
    /// <see cref="ITransform.Position"/> is the center point between 
    /// <see cref="Point1"/> and <see cref="Point2"/>, whose Z axis is parallel
    /// to the line segment between <see cref="Point1"/> and <see cref="Point2"/>,
    /// and whose Z axis scale is the distance from <see cref="Point1"/> to 
    /// <see cref="Point2"/>.
    /// </summary>
    public interface ILineSegment : IArc, ITransform
    {
        /// <summary>
        /// The first end point of this instance. This point is also contained
        /// within this <see cref="IEnumerable{T}"/>.
        /// </summary>
        ITransform Point1 { get; }

        /// <summary>
        /// The second end point of this instance. This point is also contained
        /// within this <see cref="IEnumerable{T}"/>.
        /// </summary>
        ITransform Point2 { get; }
    }
}