Point Manipulation

okay this is just another utility :D...
so if i define the Point like this

typedef Point = 
{
    var x:Float;
    var y:Float;
}

you can manipulate it with this class *all inlined, and you can use using

// all angle in radians
class PointUtils 
{
    // just a shortcut to create the Point
    public static inline function create(x:Float, y:Float) : Point
    {
        return { x:x, y:y };
    }
    
    // to clone a point
    public static inline function clone(p0:Point) : Point
    {
        return { x:p0.x, y:p0.y };
    }
    
    // to get the length squared
    public static inline function lengthSqr(p0:Point) : Float
    {
        return p0.x*p0.x + p0.y*p0.y;
    }
    
    // to get the length
    public static inline function length(p0:Point) : Float
    {
        return Math.sqrt(p0.x*p0.x + p0.y*p0.y);
    }
    
    // to get the angle
    public static inline function angle(p0:Point) : Float
    {
        return Math.atan2(p0.y, p0.x);
    }
    
    // calculate the angle between first point and the second
    public static inline function angleBetween(p0:Point, p1:Point) : Float
    {
        return Math.atan2(p0.y, p0.x) - Math.atan2(p1.y, p1.x);
    }
    
    // to get the distance squared between first point and second point
    public static inline function distanceSqr(p0:Point, p1:Point) : Float
    {
        var x = p0.x-p1.x;
        var y = p0.y-p1.y;
        return x*x + y*y;
    }
    
    // to get the distance between first point and second point
    public static inline function distance(p0:Point, p1:Point) : Float
    {
        var x = p0.x-p1.x;
        var y = p0.y-p1.y;
        return Math.sqrt(x*x + y*y);
    }
    
    // to get the dot product
    public static inline function dot(p0:Point, p1:Point) : Float
    {
        return p0.x*p1.x + p0.y*p1.y;
    }
    
    // to get the cross product
    public static inline function cross(p0:Point, p1:Point) : Float
    {
        return p0.x*p1.y - p0.y*p1.x;
    }
    
    // see whether first point has equal position with second point
    public static inline function equals(p0:Point, p1:Point) : Bool
    {
        return (p0.x == p1.x) && (p0.y == p1.y);
    }
    
    // see whether first point has nearly equal with second point *with tolerance
    public static inline function nearEquals(p0:Point, p1:Point, ?t:Float=0.0) : Bool
    {
        var x = Math.abs(p0.x-p1.x);
        var y = Math.abs(p0.y-p1.y);
        return (x <= t) && (y <= t);
    }
    
    // see whether first point is greater than second point
    public static inline function gt(p0:Point, p1:Point) : Bool
    {
        return (p0.x > p1.x) && (p0.y > p1.y);
    }
    
    // see whether first point is greater than or equal second point
    public static inline function gte(p0:Point, p1:Point) : Bool
    {
        return (p0.x >= p1.x) && (p0.y >= p1.y);
    }
    
    // see whether first point is less than second point
    public static inline function lt(p0:Point, p1:Point) : Bool
    {
        return (p0.x < p1.x) && (p0.y < p1.y);
    }
    
    // see whether first point is less than or equal second point
    public static inline function lte(p0:Point, p1:Point) : Bool
    {
        return (p0.x <= p1.x) && (p0.y <= p1.y);
    }
    
    // to get the point from length and angle
    public static inline function polar(l:Float, a:Float) : Point
    {
        return { x:l*Math.cos(a), y:l*Math.sin(a) };
    }
    
    // add first point and second point
    public static inline function add(p0:Point, p1:Point) : Point
    {
        return { x:p0.x+p1.x, y:p0.y+p1.y };
    }
    
    // subtract first point and second point
    public static inline function sub(p0:Point, p1:Point) : Point
    {
        return { x:p0.x-p1.x, y:p0.y-p1.y };
    }
    
    // multiply point with scalar
    public static inline function mul(p0:Point, s:Float) : Point
    {
        return { x:p0.x*s, y:p0.y*s };
    }
    
    // divide point with scalar
    public static inline function div(p0:Point, s:Float) : Point
    {
        return { x:p0.x/s, y:p0.y/s };
    }
    
    // to get the absolute position of a point
    public static inline function abs(p0:Point) : Point
    {
        return { x:Math.abs(p0.x), y:Math.abs(p0.y) };
    }
    
    // to get the opposite direction of point
    public static inline function opposite(p0:Point) : Point
    {
        return { x:-p0.x, y:-p0.y };
    }
    
    // to get the perpendicular point
    public static inline function perpendicular(p0:Point) : Point
    {
        return { x:-p0.y, y:p0.x };
    }
    
    // to normalize point with the thickness
    public static inline function normalize(p0:Point, ?t:Float=1.0) : Point
    {
        var m = t/Math.sqrt(p0.x*p0.x + p0.y*p0.y);
        return { x:p0.x*m, y:p0.y*m};
    }
    
    // to interpolate between first point and second point, with f between 0 and 1 *although you can pass any number
    public static inline function interpolate(p0:Point, p1:Point, f:Float) : Point
    {
        return { x:(p1.x-p0.x)*f+p0.x, y:(p1.y-p0.y)*f+p0.y};
    }
    
    // to get point with rotate the first point with second point as pivot
    public static inline function pivot(p0:Point, p1:Point, a:Float) : Point
    {
        var x = p0.x - p1.y;
        var y = p0.y - p1.y;
        var l = Math.sqrt(x*x + y*y);
        var an = Math.atan2(y, x)+a;
        return { x:p1.x+l*Math.cos(a), y:p1.y+l*Math.sin(a) };
    }
    
    // to project a point
    public static inline function project(p0:Point, p1:Point) : Point
    {
        var il = 1/(Math.sqrt(p0.x*p0.x + p0.y*p0.y) * Math.sqrt(p1.x*p1.x + p1.y*p1.y));
        var m = (p0.x*p1.x + p0.y*p1.y) * il;
        return { x:p1.x*m, y:p1.y*m };
    }
}
version #9126, modified 2010-08-19 15:29:13 by alijaya