管理驾驶舱 之仪表盘的设计

     就上次的研究得到很多园友的支持表示感谢。这篇是我最近的新研究。

   我先解释一下

    管理驾驶舱是基于ERP的高层决策支持系统。通过详尽的指标体系,实时反映企业的运行 状态,将采集的数据形象化、直观化、具体化。“管理驾驶舱”充分融合了人脑科学、管理科学和信息科学的精华,以人为产品的核心,从管理者的决策环境、企业 管理综合指标的定义以及信息的表述,都围绕着激发人的智能、有利于思维连贯和有效思维判断为目的。将企业管理决策提升到一个新的高度。最大化地发挥高层经 理了解、领导和控制公司业务的管理室(即驾驶舱),实际上是一个为高层管理层提供的“一站式”(One-Stop)决策支持的管理信息中心系统。它以驾驶 舱的形式,通过各种常见的图表(速度表、音量柱、预警雷达、雷达球)形象标示企业运行的关键指标(KPI),直观的监测企业运营情况,并可以对异常关键指 标预警,和

挖掘分析。

框架脚本

js脚本

代码
/*廖强*/

var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;


function _chkDHTM(x, i) {
    x 
= document.body || null;
    jg_ie 
= x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;
    jg_dom 
= (x && !jg_ie &&
        
typeof x.appendChild != "undefined" &&
        
typeof document.createRange != "undefined" &&
        
typeof (i = document.createRange()).setStartBefore != "undefined" &&
        
typeof i.createContextualFragment != "undefined");
    jg_fast 
= jg_ie && document.all && !window.opera;
    jg_moz 
= jg_dom && typeof x.style.MozOpacity != "undefined";
    jg_ok 
= !!(jg_ie || jg_dom);
}

function _pntCnvDom() {
    
var x = this.wnd.document.createRange();
    x.setStartBefore(
this.cnv);
    x 
= x.createContextualFragment(jg_fast ? this._htmRpc() : this.htm);
    
if (this.cnv) this.cnv.appendChild(x);
    
this.htm = "";
}

function _pntCnvIe() {
    
if (this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast ? this._htmRpc() : this.htm);
    
this.htm = "";
}

function _pntDoc() {
    
this.wnd.document.write(jg_fast ? this._htmRpc() : this.htm);
    
this.htm = '';
}

function _pntN() {
    ;
}

function _mkDiv(x, y, w, h) {
    
this.htm += '<div style="position:absolute;' +
        
'left:' + x + 'px;' +
        
'top:' + y + 'px;' +
        
'width:' + w + 'px;' +
        
'height:' + h + 'px;' +
        
'clip:rect(0,' + w + 'px,' + h + 'px,0);' +
        
'background-color:' + this.color +
        (
!jg_moz ? ';overflow:hidden' : ''+
        
';"><\/div>';
}

function _mkDivIe(x, y, w, h) {
    
this.htm += '%%' + this.color + ';' + x + ';' + y + ';' + w + ';' + h + ';';
}

function _mkDivPrt(x, y, w, h) {
    
this.htm += '<div style="position:absolute;' +
        
'border-left:' + w + 'px solid ' + this.color + ';' +
        
'left:' + x + 'px;' +
        
'top:' + y + 'px;' +
        
'width:0px;' +
        
'height:' + h + 'px;' +
        
'clip:rect(0,' + w + 'px,' + h + 'px,0);' +
        
'background-color:' + this.color +
        (
!jg_moz ? ';overflow:hidden' : ''+
        
';"><\/div>';
}

var _regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;
function _htmRpc() {
    
return this.htm.replace(
        _regex,
        
'<div style="overflow:hidden;position:absolute;background-color:' +
        
'$1;left:$2;top:$3;width:$4;height:$5"></div>\n');
}

function _htmPrtRpc() {
    
return this.htm.replace(
        _regex,
        
'<div style="overflow:hidden;position:absolute;background-color:' +
        
'$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');
}

function _mkLin(x1, y1, x2, y2) {
    
if (x1 > x2) {
        
var _x2 = x2;
        
var _y2 = y2;
        x2 
= x1;
        y2 
= y1;
        x1 
= _x2;
        y1 
= _y2;
    }
    
var dx = x2 - x1, dy = Math.abs(y2 - y1),
    x 
= x1, y = y1,
    yIncr 
= (y1 > y2) ? -1 : 1;

    
if (dx >= dy) {
        
var pr = dy << 1,
        pru 
= pr - (dx << 1),
        p 
= pr - dx,
        ox 
= x;
        
while (dx > 0) {
            
--dx;
            
++x;
            
if (p > 0) {
                
this._mkDiv(ox, y, x - ox, 1);
                y 
+= yIncr;
                p 
+= pru;
                ox 
= x;
            }
            
else p += pr;
        }
        
this._mkDiv(ox, y, x2 - ox + 11);
    }

    
else {
        
var pr = dx << 1,
        pru 
= pr - (dy << 1),
        p 
= pr - dy,
        oy 
= y;
        
if (y2 <= y1) {
            
while (dy > 0) {
                
--dy;
                
if (p > 0) {
                    
this._mkDiv(x++, y, 1, oy - y + 1);
                    y 
+= yIncr;
                    p 
+= pru;
                    oy 
= y;
                }
                
else {
                    y 
+= yIncr;
                    p 
+= pr;
                }
            }
            
this._mkDiv(x2, y2, 1, oy - y2 + 1);
        }
        
else {
            
while (dy > 0) {
                
--dy;
                y 
+= yIncr;
                
if (p > 0) {
                    
this._mkDiv(x++, oy, 1, y - oy);
                    p 
+= pru;
                    oy 
= y;
                }
                
else p += pr;
            }
            
this._mkDiv(x2, oy, 1, y2 - oy + 1);
        }
    }
}

function _mkLin2D(x1, y1, x2, y2) {
    
if (x1 > x2) {
        
var _x2 = x2;
        
var _y2 = y2;
        x2 
= x1;
        y2 
= y1;
        x1 
= _x2;
        y1 
= _y2;
    }
    
var dx = x2 - x1, dy = Math.abs(y2 - y1),
    x 
= x1, y = y1,
    yIncr 
= (y1 > y2) ? -1 : 1;

    
var s = this.stroke;
    
if (dx >= dy) {
        
if (dx > 0 && s - 3 > 0) {
            
var _s = (s * dx * Math.sqrt(1 + dy * dy / (dx * dx)) - dx - (s >> 1* dy) / dx;
            _s 
= (!(s - 4? Math.ceil(_s) : Math.round(_s)) + 1;
        }
        
else var _s = s;
        
var ad = Math.ceil(s / 2);

        
var pr = dy << 1,
        pru 
= pr - (dx << 1),
        p 
= pr - dx,
        ox 
= x;
        
while (dx > 0) {
            
--dx;
            
++x;
            
if (p > 0) {
                
this._mkDiv(ox, y, x - ox + ad, _s);
                y 
+= yIncr;
                p 
+= pru;
                ox 
= x;
            }
            
else p += pr;
        }
        
this._mkDiv(ox, y, x2 - ox + ad + 1, _s);
    }

    
else {
        
if (s - 3 > 0) {
            
var _s = (s * dy * Math.sqrt(1 + dx * dx / (dy * dy)) - (s >> 1* dx - dy) / dy;
            _s 
= (!(s - 4? Math.ceil(_s) : Math.round(_s)) + 1;
        }
        
else var _s = s;
        
var ad = Math.round(s / 2);

        
var pr = dx << 1,
        pru 
= pr - (dy << 1),
        p 
= pr - dy,
        oy 
= y;
        
if (y2 <= y1) {
            
++ad;
            
while (dy > 0) {
                
--dy;
                
if (p > 0) {
                    
this._mkDiv(x++, y, _s, oy - y + ad);
                    y 
+= yIncr;
                    p 
+= pru;
                    oy 
= y;
                }
                
else {
                    y 
+= yIncr;
                    p 
+= pr;
                }
            }
            
this._mkDiv(x2, y2, _s, oy - y2 + ad);
        }
        
else {
            
while (dy > 0) {
                
--dy;
                y 
+= yIncr;
                
if (p > 0) {
                    
this._mkDiv(x++, oy, _s, y - oy + ad);
                    p 
+= pru;
                    oy 
= y;
                }
                
else p += pr;
            }
            
this._mkDiv(x2, oy, _s, y2 - oy + ad + 1);
        }
    }
}

function _mkLinDott(x1, y1, x2, y2) {
    
if (x1 > x2) {
        
var _x2 = x2;
        
var _y2 = y2;
        x2 
= x1;
        y2 
= y1;
        x1 
= _x2;
        y1 
= _y2;
    }
    
var dx = x2 - x1, dy = Math.abs(y2 - y1),
    x 
= x1, y = y1,
    yIncr 
= (y1 > y2) ? -1 : 1,
    drw 
= true;
    
if (dx >= dy) {
        
var pr = dy << 1,
        pru 
= pr - (dx << 1),
        p 
= pr - dx;
        
while (dx > 0) {
            
--dx;
            
if (drw) this._mkDiv(x, y, 11);
            drw 
= !drw;
            
if (p > 0) {
                y 
+= yIncr;
                p 
+= pru;
            }
            
else p += pr;
            
++x;
        }
    }
    
else {
        
var pr = dx << 1,
        pru 
= pr - (dy << 1),
        p 
= pr - dy;
        
while (dy > 0) {
            
--dy;
            
if (drw) this._mkDiv(x, y, 11);
            drw 
= !drw;
            y 
+= yIncr;
            
if (p > 0) {
                
++x;
                p 
+= pru;
            }
            
else p += pr;
        }
    }
    
if (drw) this._mkDiv(x, y, 11);
}

function _mkOv(left, top, width, height) {
    
var a = (++width) >> 1, b = (++height) >> 1,
    wod 
= width & 1, hod = height & 1,
    cx 
= left + a, cy = top + b,
    x 
= 0, y = b,
    ox 
= 0, oy = b,
    aa2 
= (a * a) << 1, aa4 = aa2 << 1, bb2 = (b * b) << 1, bb4 = bb2 << 1,
    st 
= (aa2 >> 1* (1 - (b << 1)) + bb2,
    tt 
= (bb2 >> 1- aa2 * ((b << 1- 1),
    w, h;
    
while (y > 0) {
        
if (st < 0) {
            st 
+= bb2 * ((x << 1+ 3);
            tt 
+= bb4 * (++x);
        }
        
else if (tt < 0) {
            st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
            tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
            w 
= x - ox;
            h 
= oy - y;
            
if ((w & 2&& (h & 2)) {
                
this._mkOvQds(cx, cy, x - 2, y + 211, wod, hod);
                
this._mkOvQds(cx, cy, x - 1, y + 111, wod, hod);
            }
            
else this._mkOvQds(cx, cy, x - 1, oy, w, h, wod, hod);
            ox 
= x;
            oy 
= y;
        }
        
else {
            tt 
-= aa2 * ((y << 1- 3);
            st 
-= aa4 * (--y);
        }
    }
    w 
= a - ox + 1;
    h 
= (oy << 1+ hod;
    y 
= cy - oy;
    
this._mkDiv(cx - a, y, w, h);
    
this._mkDiv(cx + ox + wod - 1, y, w, h);
}

function _mkOv2D(left, top, width, height) {
    
var s = this.stroke;
    width 
+= s + 1;
    height 
+= s + 1;
    
var a = width >> 1, b = height >> 1,
    wod 
= width & 1, hod = height & 1,
    cx 
= left + a, cy = top + b,
    x 
= 0, y = b,
    aa2 
= (a * a) << 1, aa4 = aa2 << 1, bb2 = (b * b) << 1, bb4 = bb2 << 1,
    st 
= (aa2 >> 1* (1 - (b << 1)) + bb2,
    tt 
= (bb2 >> 1- aa2 * ((b << 1- 1);

    
if (s - 4 < 0 && (!(s - 2|| width - 51 > 0 && height - 51 > 0)) {
        
var ox = 0, oy = b,
        w, h,
        pxw;
        
while (y > 0) {
            
if (st < 0) {
                st 
+= bb2 * ((x << 1+ 3);
                tt 
+= bb4 * (++x);
            }
            
else if (tt < 0) {
                st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
                tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
                w 
= x - ox;
                h 
= oy - y;

                
if (w - 1) {
                    pxw 
= w + 1 + (s & 1);
                    h 
= s;
                }
                
else if (h - 1) {
                    pxw 
= s;
                    h 
+= 1 + (s & 1);
                }
                
else pxw = h = s;
                
this._mkOvQds(cx, cy, x - 1, oy, pxw, h, wod, hod);
                ox 
= x;
                oy 
= y;
            }
            
else {
                tt 
-= aa2 * ((y << 1- 3);
                st 
-= aa4 * (--y);
            }
        }
        
this._mkDiv(cx - a, cy - oy, s, (oy << 1+ hod);
        
this._mkDiv(cx + a + wod - s, cy - oy, s, (oy << 1+ hod);
    }

    
else {
        
var _a = (width - (s << 1)) >> 1,
        _b 
= (height - (s << 1)) >> 1,
        _x 
= 0, _y = _b,
        _aa2 
= (_a * _a) << 1, _aa4 = _aa2 << 1, _bb2 = (_b * _b) << 1, _bb4 = _bb2 << 1,
        _st 
= (_aa2 >> 1* (1 - (_b << 1)) + _bb2,
        _tt 
= (_bb2 >> 1- _aa2 * ((_b << 1- 1),

        pxl 
= new Array(),
        pxt 
= new Array(),
        _pxb 
= new Array();
        pxl[
0= 0;
        pxt[
0= b;
        _pxb[
0= _b - 1;
        
while (y > 0) {
            
if (st < 0) {
                pxl[pxl.length] 
= x;
                pxt[pxt.length] 
= y;
                st 
+= bb2 * ((x << 1+ 3);
                tt 
+= bb4 * (++x);
            }
            
else if (tt < 0) {
                pxl[pxl.length] 
= x;
                st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
                tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
                pxt[pxt.length] 
= y;
            }
            
else {
                tt 
-= aa2 * ((y << 1- 3);
                st 
-= aa4 * (--y);
            }

            
if (_y > 0) {
                
if (_st < 0) {
                    _st 
+= _bb2 * ((_x << 1+ 3);
                    _tt 
+= _bb4 * (++_x);
                    _pxb[_pxb.length] 
= _y - 1;
                }
                
else if (_tt < 0) {
                    _st 
+= _bb2 * ((_x << 1+ 3- _aa4 * (_y - 1);
                    _tt 
+= _bb4 * (++_x) - _aa2 * (((_y--<< 1- 3);
                    _pxb[_pxb.length] 
= _y - 1;
                }
                
else {
                    _tt 
-= _aa2 * ((_y << 1- 3);
                    _st 
-= _aa4 * (--_y);
                    _pxb[_pxb.length 
- 1]--;
                }
            }
        }

        
var ox = -wod, oy = b,
        _oy 
= _pxb[0],
        l 
= pxl.length,
        w, h;
        
for (var i = 0; i < l; i++) {
            
if (typeof _pxb[i] != "undefined") {
                
if (_pxb[i] < _oy || pxt[i] < oy) {
                    x 
= pxl[i];
                    
this._mkOvQds(cx, cy, x, oy, x - ox, oy - _oy, wod, hod);
                    ox 
= x;
                    oy 
= pxt[i];
                    _oy 
= _pxb[i];
                }
            }
            
else {
                x 
= pxl[i];
                
this._mkDiv(cx - x, cy - oy, 1, (oy << 1+ hod);
                
this._mkDiv(cx + ox + wod, cy - oy, 1, (oy << 1+ hod);
                ox 
= x;
                oy 
= pxt[i];
            }
        }
        
this._mkDiv(cx - a, cy - oy, 1, (oy << 1+ hod);
        
this._mkDiv(cx + ox + wod, cy - oy, 1, (oy << 1+ hod);
    }
}

function _mkOvDott(left, top, width, height) {
    
var a = (++width) >> 1, b = (++height) >> 1,
    wod 
= width & 1, hod = height & 1, hodu = hod ^ 1,
    cx 
= left + a, cy = top + b,
    x 
= 0, y = b,
    aa2 
= (a * a) << 1, aa4 = aa2 << 1, bb2 = (b * b) << 1, bb4 = bb2 << 1,
    st 
= (aa2 >> 1* (1 - (b << 1)) + bb2,
    tt 
= (bb2 >> 1- aa2 * ((b << 1- 1),
    drw 
= true;
    
while (y > 0) {
        
if (st < 0) {
            st 
+= bb2 * ((x << 1+ 3);
            tt 
+= bb4 * (++x);
        }
        
else if (tt < 0) {
            st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
            tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
        }
        
else {
            tt 
-= aa2 * ((y << 1- 3);
            st 
-= aa4 * (--y);
        }
        
if (drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 11, wod, hod);
        drw 
= !drw;
    }
}

function _mkRect(x, y, w, h) {
    
var s = this.stroke;
    
this._mkDiv(x, y, w, s);
    
this._mkDiv(x + w, y, s, h);
    
this._mkDiv(x, y + h, w + s, s);
    
this._mkDiv(x, y + s, s, h - s);
}

function _mkRectDott(x, y, w, h) {
    
this.drawLine(x, y, x + w, y);
    
this.drawLine(x + w, y, x + w, y + h);
    
this.drawLine(x, y + h, x + w, y + h);
    
this.drawLine(x, y, x, y + h);
}

function jsgFont() {
    
this.PLAIN = 'font-weight:normal;';
    
this.BOLD = 'font-weight:bold;';
    
this.ITALIC = 'font-style:italic;';
    
this.ITALIC_BOLD = this.ITALIC + this.BOLD;
    
this.BOLD_ITALIC = this.ITALIC_BOLD;
}
var Font = new jsgFont();

function jsgStroke() {
    
this.DOTTED = -1;
}
var Stroke = new jsgStroke();

function jsGraphics(cnv, wnd) {
    
this.setColor = function(x) {
        
this.color = x.toLowerCase();
    };

    
this.setStroke = function(x) {
        
this.stroke = x;
        
if (!(x + 1)) {
            
this.drawLine = _mkLinDott;
            
this._mkOv = _mkOvDott;
            
this.drawRect = _mkRectDott;
        }
        
else if (x - 1 > 0) {
            
this.drawLine = _mkLin2D;
            
this._mkOv = _mkOv2D;
            
this.drawRect = _mkRect;
        }
        
else {
            
this.drawLine = _mkLin;
            
this._mkOv = _mkOv;
            
this.drawRect = _mkRect;
        }
    };

    
this.setPrintable = function(arg) {
        
this.printable = arg;
        
if (jg_fast) {
            
this._mkDiv = _mkDivIe;
            
this._htmRpc = arg ? _htmPrtRpc : _htmRpc;
        }
        
else this._mkDiv = arg ? _mkDivPrt : _mkDiv;
    };

    
this.setFont = function(fam, sz, sty) {
        
this.ftFam = fam;
        
this.ftSz = sz;
        
this.ftSty = sty || Font.PLAIN;
    };

    
this.drawPolyline = this.drawPolyLine = function(x, y) {
        
for (var i = x.length - 1; i; ) {
            
--i;
            
this.drawLine(x[i], y[i], x[i + 1], y[i + 1]);
        }
    };

    
this.fillRect = function(x, y, w, h) {
        
this._mkDiv(x, y, w, h);
    };

    
this.drawPolygon = function(x, y) {
        
this.drawPolyline(x, y);
        
this.drawLine(x[x.length - 1], y[x.length - 1], x[0], y[0]);
    };

    
this.drawEllipse = this.drawOval = function(x, y, w, h) {
        
this._mkOv(x, y, w, h);
    };

    
this.fillEllipse = this.fillOval = function(left, top, w, h) {
        
var a = w >> 1, b = h >> 1,
        wod 
= w & 1, hod = h & 1,
        cx 
= left + a, cy = top + b,
        x 
= 0, y = b, oy = b,
        aa2 
= (a * a) << 1, aa4 = aa2 << 1, bb2 = (b * b) << 1, bb4 = bb2 << 1,
        st 
= (aa2 >> 1* (1 - (b << 1)) + bb2,
        tt 
= (bb2 >> 1- aa2 * ((b << 1- 1),
        xl, dw, dh;
        
if (w) while (y > 0) {
            
if (st < 0) {
                st 
+= bb2 * ((x << 1+ 3);
                tt 
+= bb4 * (++x);
            }
            
else if (tt < 0) {
                st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
                xl 
= cx - x;
                dw 
= (x << 1+ wod;
                tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
                dh 
= oy - y;
                
this._mkDiv(xl, cy - oy, dw, dh);
                
this._mkDiv(xl, cy + y + hod, dw, dh);
                oy 
= y;
            }
            
else {
                tt 
-= aa2 * ((y << 1- 3);
                st 
-= aa4 * (--y);
            }
        }
        
this._mkDiv(cx - a, cy - oy, w, (oy << 1+ hod);
    };

    
this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ) {
        
var a = iW >> 1, b = iH >> 1,
        iOdds 
= (iW & 1| ((iH & 1<< 16),
        cx 
= iL + a, cy = iT + b,
        x 
= 0, y = b, ox = x, oy = y,
        aa2 
= (a * a) << 1, aa4 = aa2 << 1, bb2 = (b * b) << 1, bb4 = bb2 << 1,
        st 
= (aa2 >> 1* (1 - (b << 1)) + bb2,
        tt 
= (bb2 >> 1- aa2 * ((b << 1- 1),
        
// Vars for radial boundary lines
        xEndA, yEndA, xEndZ, yEndZ,
        iSects 
= (1 << (Math.floor((fAngA %= 360.0/ 180.0<< 3))
                
| (2 << (Math.floor((fAngZ %= 360.0/ 180.0<< 3))
                
| ((fAngA >= fAngZ) << 16),
        aBndA 
= new Array(b + 1), aBndZ = new Array(b + 1);

        
// Set up radial boundary lines
        fAngA *= Math.PI / 180.0;
        fAngZ 
*= Math.PI / 180.0;
        xEndA 
= cx + Math.round(a * Math.cos(fAngA));
        yEndA 
= cy + Math.round(-* Math.sin(fAngA));
        _mkLinVirt(aBndA, cx, cy, xEndA, yEndA);
        xEndZ 
= cx + Math.round(a * Math.cos(fAngZ));
        yEndZ 
= cy + Math.round(-* Math.sin(fAngZ));
        _mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);

        
while (y > 0) {
            
if (st < 0// Advance x
            {
                st 
+= bb2 * ((x << 1+ 3);
                tt 
+= bb4 * (++x);
            }
            
else if (tt < 0// Advance x and y
            {
                st 
+= bb2 * ((x << 1+ 3- aa4 * (y - 1);
                ox 
= x;
                tt 
+= bb4 * (++x) - aa2 * (((y--<< 1- 3);
                
this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
                oy 
= y;
            }
            
else // Advance y
            {
                tt 
-= aa2 * ((y << 1- 3);
                st 
-= aa4 * (--y);
                
if (y && (aBndA[y] != aBndA[y - 1|| aBndZ[y] != aBndZ[y - 1])) {
                    
this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
                    ox 
= x;
                    oy 
= y;
                }
            }
        }
        
this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
        
if (iOdds >> 16// Odd height
        {
            
if (iSects >> 16// Start-angle > end-angle
            {
                
var xl = (yEndA <= cy || yEndZ > cy) ? (cx - x) : cx;
                
this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);
            }
            
else if ((iSects & 0x01&& yEndZ > cy)
                
this._mkDiv(cx - x, cy, x, 1);
        }
    };

    
/* fillPolygon method, implemented by Matthieu Haller.
    This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.
    C source of GD 1.8.4 found at http://www.boutell.com/gd/

THANKS to Kirsten Schulz for the polygon fixes!

The intersection finding technique of this code could be improved
    by remembering the previous intertersection, and by using the slope.
    That could help to adjust intersections to produce a nice
    interior_extrema. 
*/
    
this.fillPolygon = function(array_x, array_y) {
        
var i;
        
var y;
        
var miny, maxy;
        
var x1, y1;
        
var x2, y2;
        
var ind1, ind2;
        
var ints;

        
var n = array_x.length;
        
if (!n) return;

        miny 
= array_y[0];
        maxy 
= array_y[0];
        
for (i = 1; i < n; i++) {
            
if (array_y[i] < miny)
                miny 
= array_y[i];

            
if (array_y[i] > maxy)
                maxy 
= array_y[i];
        }
        
for (y = miny; y <= maxy; y++) {
            
var polyInts = new Array();
            ints 
= 0;
            
for (i = 0; i < n; i++) {
                
if (!i) {
                    ind1 
= n - 1;
                    ind2 
= 0;
                }
                
else {
                    ind1 
= i - 1;
                    ind2 
= i;
                }
                y1 
= array_y[ind1];
                y2 
= array_y[ind2];
                
if (y1 < y2) {
                    x1 
= array_x[ind1];
                    x2 
= array_x[ind2];
                }
                
else if (y1 > y2) {
                    y2 
= array_y[ind1];
                    y1 
= array_y[ind2];
                    x2 
= array_x[ind1];
                    x1 
= array_x[ind2];
                }
                
else continue;

                
//  Modified 11. 2. 2004 Walter Zorn
                if ((y >= y1) && (y < y2))
                    polyInts[ints
++= Math.round((y - y1) * (x2 - x1) / (y2 - y1) + x1);

                
else if ((y == maxy) && (y > y1) && (y <= y2))
                    polyInts[ints
++= Math.round((y - y1) * (x2 - x1) / (y2 - y1) + x1);
            }
            polyInts.sort(_CompInt);
            
for (i = 0; i < ints; i += 2)
                
this._mkDiv(polyInts[i], y, polyInts[i + 1- polyInts[i] + 11);
        }
    };

    
this.drawString = function(txt, x, y) {
        
this.htm += '<div style="position:absolute;white-space:nowrap;' +
            
'left:' + x + 'px;' +
            
'top:' + y + 'px;' +
            
'font-family:' + this.ftFam + ';' +
            
'font-size:' + this.ftSz + ';' +
            
'color:' + this.color + ';' + this.ftSty + '">' +
            txt 
+
            
'<\/div>';
    };

    
/* drawStringRect() added by Rick Blommers.
    Allows to specify the size of the text rectangle and to align the
    text both horizontally (e.g. right) and vertically within that rectangle 
*/
    
this.drawStringRect = function(txt, x, y, width, halign) {
        
this.htm += '<div style="position:absolute;overflow:hidden;' +
            
'left:' + x + 'px;' +
            
'top:' + y + 'px;' +
            
'width:' + width + 'px;' +
            
'text-align:' + halign + ';' +
            
'font-family:' + this.ftFam + ';' +
            
'font-size:' + this.ftSz + ';' +
            
'color:' + this.color + ';' + this.ftSty + '">' +
            txt 
+
            
'<\/div>';
    };

    
this.drawImage = function(imgSrc, x, y, w, h, a) {
        
this.htm += '<div style="position:absolute;' +
            
'left:' + x + 'px;' +
            
'top:' + y + 'px;' +
        
// w (width) and h (height) arguments are now optional.
        // Added by Mahmut Keygubatli, 14.1.2008
            (w ? ('width:' + w + 'px;') : ''+
            (h 
? ('height:' + h + 'px;') : ''+ '">' +
            
'<img src="' + imgSrc + '"' + (w ? (' width="' + w + '"') : ''+ (h ? (' height="' + h + '"') : ''+ (a ? (' ' + a) : ''+ '>' +
            
'<\/div>';
    };

    
this.clear = function() {
        
this.htm = "";
        
if (this.cnv) this.cnv.innerHTML = "";
    };

    
this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod) {
        
var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;
        
if (xr > xl + w) {
            
this._mkDiv(xr, yt, w, h);
            
this._mkDiv(xr, yb, w, h);
        }
        
else
            w 
= xr - xl + w;
        
this._mkDiv(xl, yt, w, h);
        
this._mkDiv(xl, yb, w, h);
    };

    
this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects) {
        
var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;

        
if (!h) h = 1;
        x 
= cx - x;

        
if (iSects & 0xff0000// Start-angle > end-angle
        {
            y2 
= cy - y - h;
            
if (iSects & 0x00ff) {
                
if (iSects & 0x02) {
                    xl 
= Math.max(x, aBndZ[y]);
                    w 
= xrDef - xl;
                    
if (w > 0this._mkDiv(xl, y2, w, h);
                }
                
if (iSects & 0x01) {
                    xr 
= Math.min(xrDef, aBndA[y]);
                    w 
= xr - x;
                    
if (w > 0this._mkDiv(x, y2, w, h);
                }
            }
            
else
                
this._mkDiv(x, y2, xrDef - x, h);
            y2 
= cy + y + (iOdds >> 16);
            
if (iSects & 0xff00) {
                
if (iSects & 0x0100) {
                    xl 
= Math.max(x, aBndA[y]);
                    w 
= xrDef - xl;
                    
if (w > 0this._mkDiv(xl, y2, w, h);
                }
                
if (iSects & 0x0200) {
                    xr 
= Math.min(xrDef, aBndZ[y]);
                    w 
= xr - x;
                    
if (w > 0this._mkDiv(x, y2, w, h);
                }
            }
            
else
                
this._mkDiv(x, y2, xrDef - x, h);
        }
        
else {
            
if (iSects & 0x00ff) {
                
if (iSects & 0x02)
                    xl 
= Math.max(x, aBndZ[y]);
                
else
                    xl 
= x;
                
if (iSects & 0x01)
                    xr 
= Math.min(xrDef, aBndA[y]);
                
else
                    xr 
= xrDef;
                y2 
= cy - y - h;
                w 
= xr - xl;
                
if (w > 0this._mkDiv(xl, y2, w, h);
            }
            
if (iSects & 0xff00) {
                
if (iSects & 0x0100)
                    xl 
= Math.max(x, aBndA[y]);
                
else
                    xl 
= x;
                
if (iSects & 0x0200)
                    xr 
= Math.min(xrDef, aBndZ[y]);
                
else
                    xr 
= xrDef;
                y2 
= cy + y + (iOdds >> 16);
                w 
= xr - xl;
                
if (w > 0this._mkDiv(xl, y2, w, h);
            }
        }
    };

    
this.setStroke(1);
    
this.setFont("verdana,geneva,helvetica,sans-serif""12px", Font.PLAIN);
    
this.color = "#000000";
    
this.htm = "";
    
this.wnd = wnd || window;

    
if (!jg_ok) _chkDHTM();
    
if (jg_ok) {
        
if (cnv) {
            
if (typeof (cnv) == "string")
                
this.cont = document.all ? (this.wnd.document.all[cnv] || null)
                    : document.getElementById 
? (this.wnd.document.getElementById(cnv) || null)
                    : 
null;
            
else if (cnv == window.document)
                
this.cont = document.getElementsByTagName("body")[0];
            
// If cnv is a direct reference to a canvas DOM node
            // (option suggested by Andreas Luleich)
            else this.cont = cnv;
            
// Create new canvas inside container DIV. Thus the drawing and clearing
            // methods won't interfere with the container's inner html.
            // Solution suggested by Vladimir.
            this.cnv = this.wnd.document.createElement("div");
            
this.cnv.style.fontSize = 0;
            
this.cont.appendChild(this.cnv);
            
this.paint = jg_dom ? _pntCnvDom : _pntCnvIe;
        }
        
else
            
this.paint = _pntDoc;
    }
    
else
        
this.paint = _pntN;

    
this.setPrintable(false);
}

function _mkLinVirt(aLin, x1, y1, x2, y2) {
    
var dx = Math.abs(x2 - x1), dy = Math.abs(y2 - y1),
    x 
= x1, y = y1,
    xIncr 
= (x1 > x2) ? -1 : 1,
    yIncr 
= (y1 > y2) ? -1 : 1,
    p,
    i 
= 0;
    
if (dx >= dy) {
        
var pr = dy << 1,
        pru 
= pr - (dx << 1);
        p 
= pr - dx;
        
while (dx > 0) {
            
--dx;
            
if (p > 0)    //  Increment y
            {
                aLin[i
++= x;
                y 
+= yIncr;
                p 
+= pru;
            }
            
else p += pr;
            x 
+= xIncr;
        }
    }
    
else {
        
var pr = dx << 1,
        pru 
= pr - (dy << 1);
        p 
= pr - dy;
        
while (dy > 0) {
            
--dy;
            y 
+= yIncr;
            aLin[i
++= x;
            
if (p > 0)    //  Increment x
            {
                x 
+= xIncr;
                p 
+= pru;
            }
            
else p += pr;
        }
    }
    
for (var len = aLin.length, i = len - i; i; )
        aLin[len 
- (i--)] = x;
};

function _CompInt(x, y) {
    
return (x - y);
}

 

 CSS样式 

 

代码
<style type="text/css">
        .mybox
        
{
            position
: relative;
            left
: 800px;
            top
: 20px;
        
}
        
        #header
{

 background-color 
:Red ;
    width
:955px;
    height
:223px;
}
#content
{
    background-color 
:Green ;
    width
:955px;
    height
:223px;
   background-repeat
:repeat-x;
}



    </style>

JS脚本暂不公开

Html

代码
<body onload="draw()">
    
<center>
   

 
    
<div style ="top:0px" id="header">
        
<div id="test" onmousemove="MouseMove(this)" onmousedown="startDrag(this)" onmouseup="endDrag(this)"
            style
="border: 1px solid #000000; background: #FCFCFC; width: 200px; height: 200px;
            position: absolute; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/Snap3.bmp', sizingMethod='scale');
            top: 15px; left: 107px;
">
            
<%--长高为300时--%>
            
<%--  <div id="div2" style="position: absolute;  width: 40px;  top: 250px;  left=10px;  height: 150px;  z-index: 1;  background-color:">
              
<input type="text" id="nTxt" value="40" style="width: 20px; background: red">
            
</div>--%>
            <%--长高为200时--%>
            
<div id="div2" style="position: absolute; width: 40px; top: 170px; left=10px; height: 150px; z-index: 1; background-color: ">
                
<input type="text" id="nTxt" value="40" style="width: 20px; background: red">
            
</div>
        </div>
        
        
        
<div id="Div1" onmousemove="MouseMove(this)" onmousedown="startDrag(this)" onmouseup="endDrag(this)"
            style
="border: 1px solid #000000; background: #FCFCFC; width: 200px; height: 200px;
            position: absolute; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/Snap3.bmp', sizingMethod='scale');
            top: 15px; left: 307px;
">
            
<%--长高为200时--%>
            
<div id="div3" style="position: absolute; width: 40px; top: 170px; left=10px; height: 150px;
                left: 104px;
">
                
<input type="text" id="Text1" value="40" style="width: 20px; background: red">
            
</div>
        </div>
        
        
        
<div id="Div4" onmousemove="MouseMove(this)" onmousedown="startDrag(this)" onmouseup="endDrag(this)"
            style
="border: 1px solid #000000; background: #FCFCFC; width: 200px; height: 200px;
            position: absolute; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/Snap3.bmp', sizingMethod='scale');
            top: 15px; left: 507px;
">
            
<%--长高为200时--%>
            
<div id="div5" style="position: absolute; width: 40px; top: 170px; left=10px; height: 150px;
                z-index: 1; background-color: 
">
                
<input type="text" id="Text2" value="40" style="width: 20px; background: red">
            
</div>
        </div>


 
<div id="Div6" onmousemove="MouseMove(this)" onmousedown="startDrag(this)" onmouseup="endDrag(this)"
            style
="border: 1px solid #000000; background: #FCFCFC; width: 200px; height: 200px;
            position: absolute; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='Images/Snap3.bmp', sizingMethod='scale');
            top: 15px; left: 707px;
">
            
<%--长高为200时--%>
            
<div id="div7" style="position: absolute; width: 40px; top: 170px; left=10px; height: 150px;
                z-index: 1; background-color: 
">
                
<input type="text" id="Text3" value="40" style="width: 20px; background: red">
            
</div>
        </div>
        </div> 
         </center>
    <div style="position: absolute; width: 40px; top: 500px; left=10px;  ">
    
<input name="txt" type="text" width="40" value="40" />
    <input type="button" value="设置" onclick="draw()" />
    <input type="button" value="清除" onclick="clearLine()" />
    
    
</div>
</body>


效果图

 

 目前只完成了第一个。方法一次类推就可以了。由于各方面的原因暂不公开部分JS脚本。望大家谅解。

 

 

 

 


 

posted @ 2011-01-08 15:53  枫叶蓝916  阅读(5360)  评论(8编辑  收藏  举报