package flare.scale
{
    import flare.util.Maths;
    import flare.util.Strings;
    
    /**
     * Scale that performs a root transformation of the data. This could be a
     * square root or any arbitrary power.
     */
    public class RootScale extends QuantitativeScale
    {
        private var _pow:Number = 2;
        
        /** The power of the root transform. A value of 2 indicates a square
         *  root, 3 a cubic root, etc. */
        public function get power():Number { return _pow; }
        public function set power(p:Number):void { _pow = p; }
        
        /**
         * Creates a new RootScale.
         * @param min the minimum data value
         * @param max the maximum data value
         * @param base the number base to use
         * @param flush the flush flag for scale padding
         * @param labelFormat the formatting pattern for value labels
         */
        public function RootScale(min:Number=0, max:Number=0, base:Number=10,
                                  flush:Boolean=false, pow:Number=2,
                                  labelFormat:String=Strings.DEFAULT_NUMBER)
        {
            super(min, max, base, flush, labelFormat);
            _pow = pow;
        }
        
        /** @inheritDoc */
        public override function get scaleType():String {
            return ScaleType.ROOT;
        }
        
        /** @inheritDoc */
        public override function clone():Scale {
            return new RootScale(_dmin, _dmax, _base, _flush, _pow, _format);
        }
        
        /** @inheritDoc */
        protected override function interp(val:Number):Number {
            if (_pow==2) return Maths.invSqrtInterp(val, _smin, _smax);
            return Maths.invRootInterp(val, _smin, _smax, _pow);
        }
        
        /** @inheritDoc */
        public override function lookup(f:Number):Object {
            if (_pow==2) return Maths.sqrtInterp(f, _smin, _smax);
            return Maths.rootInterp(f, _smin, _smax, _pow);
        }
        
    } // end of class RootScale
}