Home Reference Source

src/chart/chartmodel.js

import Canvas from './canvas';

export default class chart {
    // init chart bind with a div element @object.
    constructor(opts) {
        this.ele = opts.ele? opts.ele: null;
        this.data = opts.data? opts.data: [];
        this.type = opts.type? opts.type: null;
        this.maxValue = 0;
        this.rotate = opts.rotate? opts.rotate: 0;
        // specify url as data source.. update by GET.
        this.url = opts.url? opts.url: null;
    }

    // new Promise to GET latest data, then redraw
    updateData() {
       // new Promise() 
    }

    /**
     * set chart.data with Array instance, then redraw.
     */
    setData(data) {
        this.data = data.coords;
        this.rotate = data.rotate;
        this.dataName = data.name;
        Canvas.clearCanv();
        this.render();
        return this;
    }

    /**
     * render data in Canvas according data dimension
     * width different strategy..
     */
    render() {
        // if line or poly
        if (this.data instanceof Array && this.data.length > 0 && this.data[0] instanceof Array ) {
            Canvas.drawLine(this.data, null, null);
        } else if (this.data instanceof Array && this.data.length > 0) {
            if (this.url) {
                // render point with icon image.
                Canvas.drawPoint(this.data, 20, null, this.url, this.rotate, this.dataName);
            } else {
                Canvas.drawPoint(this.data, 2, null, null, this.rotate, this.dataName);
            } 
        }
    }

    // stat max value of Data and set to maxValue. only for 1 dimension data.[y1, y2, y3 ...]
    statMax() {
        if (typeof this.data == Array && this.data.length > 0) {
            this.data.forEach((value) => {
                if (this.maxValue < value)
                    this.maxValue = value;
            });
        }
        return this;
    }

    /**
	 * generate Math.sin/cos line data..
     * 
	 * sin: 'sin'/'cos'/'tan' @string
	 * xEnd: finally returned points number.
	 * fatness: fatness of line. bigger the fatter will the line be.
	 * offset: offset to left with animation. @number
     * 
     * Return: 2 dimension Array. [[x1,y1], [x2,y2] ...] @Array
	 */
	generateSinLine(sin, xEnd, fatness, offset){
		let points = [], y = 0, yheight = 50, ybase = 50,
            fat = fatness? fatness: 20.0, off = offset? offset: 0;
		// 像素个数 xEnd. 
		for (let x = 0; x < xEnd; x ++) {
			if (sin == 'sin') {
				y = parseInt(Math.sin(x/fat) * yheight);
			} else if (sin == 'cos')
				y = parseInt(Math.cos(x/fat) * yheight);
			else if (sin == 'tan') 
				y = parseInt(Math.tan(x/fat) * yheight);
			
			points.push([x - off, y + ybase]);
		}
		return points;
	}
}

let strategies = {

}