⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsgraphics.js

📁 可以用AJAX在后台获取数据
💻 JS
字号:
// JScript 文件
/* This notice must be untouched at all times.
jsgraphics.js    v. 1.00
Any question please contact mathcn@126.com 
Copyright (c)  mathcn@126.com All rights reserved.
Created 1. 20. 2007 by mathcn in China
Last modified: 1. 20. 2007
个人简介:周胜军,06年就读于大连理工计算数学研究生,研究曲面匹配,擅长网络编程asp,asp.net,c#,javascript,Dom,xml,vb,css,Ajax,dhtml......
此信息寻工作用QQ418806107
*/
var color="Black",pen_w=1,pen_h=1,canvas_height,canvas_width;
var output="";

function setColor(pen_color)
{
    color=pen_color;
}

function setPen(pen_w_temp,pen_h_temp)
{
    pen_w=pen_w_temp;pen_h=pen_h_temp;
}

function point(x,y)
{
    output +='<div style="position:absolute;left: '+x+'px; bottom: '+y+'px; overflow:hidden; background-color:'+color+'; width:'+pen_w+'px; height:'+pen_h+'px;"></div>';
}

function mkDiv(x,y,pen_w,pen_h)
{
    output +='<div style="position:absolute;left: '+x+'px; bottom: '+y+'px; overflow:hidden; background-color:'+color+'; width:'+pen_w+'px; height:'+pen_h+'px;"></div>';
}
function paint(OBJ)
{
    document.getElementById(OBJ).innerHTML=output;
    output="";
}
function clear(OBJ)
{
    var TT=document.getElementById(OBJ);
    if(TT!=null)
    {
        while(TT.childNodes.length>0)
        {
               TT.removeChild(TT.childNodes[0]);
        }
    }
}
//画直线 Bresenham算法
function drawLine(x1,y1,x2,y2)
{
    var dx=x2-x1,dy=y2-y1;
    if(Math.abs(dy)<0.5){dy=0;}
    if(Math.abs(dx)<0.5){dx=0;}
    if((dx)*(dy)==0)
    {
        if((dx)==0&&(dy)==0) {this.point(x1,y1);}   
        
        if((dy)==0&&(dx)!=0)
        {
            if(dx<0){ temp=x2;x2=x1;x1=temp;}
            mkDiv(x1,y1,Math.abs(dx),pen_h);
        }   

        if((dx)==0&&(dy)!=0)
        {
            if(dy<0){ temp=y2;y2=y1;y1=temp;}
            mkDiv(x1,y1,pen_w,Math.abs(dy));
        }
    }else
    {
            var x=x1,y=y1,interchange;
            var dx=Math.abs(x2-x),dy=Math.abs(y2-y1);
            var s1=sign(x2-x1),s2=sign(y2-y1);

            if(dy>dx) {var temp=dx;dx=dy;dy=temp;interchange=1; }
            else{interchange=0;}
            
            var eb=2*dy-dx;
            for(var i=0;i<=dx;i++)
            {   
                mkDiv(x,y,pen_w,pen_h);
                while(eb>0)
                {
                    if(interchange==1){x=x+s1;}else{y=y+s2;}
                    eb=eb-2*dx;
                }
                if (interchange==1){y=y+s2;}else{x=x+s1;}
                eb=eb+2*dy;
            
            }
       }
    
    this.sign=function sign(x){if(x==0){return 0;}if(x>0){return 1;}else{return -1;}}
}


function drawPolyline(X,Y)
{
        var n=X.length;
        for(var i=0;i<n;i++){ drawLine(X[i],Y[i],X[i+1],Y[i+1]);}
}
function drawPolygon(X,Y)
{
        var n=X.length;
        for(var i=0;i<n;i++){ drawLine(X[i],Y[i],X[i+1],Y[i+1]);}
        drawLine(X[0],Y[0],X[n-1],Y[n-1]);
}
function drawEllipse(x0,y0,a,b)
{
    var rad=Math.PI/180;
    for(var i=0;i<360;i=i+2)
    {
        drawLine(x0+a*Math.cos(i*rad),y0+b*Math.sin(i*rad),xi=x0+a*Math.cos((i+2)*rad),yi=y0+b*Math.sin((i+2)*rad));
    }

}
function fillEllipse(x0,y0,a,b)
{   
    var X=new Array,Y=new Array;
    var rad=Math.PI/180;
    for(var i=0;i<360;i=i+5)
    {
        X[i/5]=x0+a*Math.cos(i*rad);
        Y[i/5]=y0+b*Math.sin(i*rad);
    }
    fillPolygon(X,Y);
}
function pie(x0,y0,r,a,b)
{   
    a=Math.floor(a),b=Math.floor(b); 
    while(Math.abs(a)>360){a=a%360;}
    while(Math.abs(b)>360){b=b%360;}
    if(a>b){var temp=a;a=b;b=temp;}
    
    var X=new Array,Y=new Array;
    var rad=Math.PI/180;
    var k=0;
    for(var i=a;i<=b;i=i+2)
    {
        X[k]=x0+r*Math.cos(i*rad);
        Y[k]=y0+r*Math.sin(i*rad);
        k++;
    }
    X[k]=x0;
    Y[k]=y0;
    fillPolygon(X,Y);
    
}
function pieChart(x0,y0,r,p,X,Color)
{
    var Max_flag=Max_flag(X);
    var sum=0,n=X.length;
    var rad=Math.PI/180;
    var FT=new Array;
    var DU=new Array;
    for(var i=0;i<n;i++){sum=sum+X[i];}
    for(var i=0;i<n;i++){var temp=X[i]/sum;DU[i]=360*temp;FT[i]=Math.round(1000*temp)/10; }
    var Z=new Array;
    for(var i=0;i<n;i++)
    {
     var sum_temp=0;
     for(var j=0;j<=i;j++){sum_temp+=DU[j];}
     Z[i]=sum_temp;
    }
    Z[n-1]=360;
    
    for(var i=0;i<n-1;i++)
    {
        DU[i+1]=(Z[i+1]+Z[i])/2;
    }
    DU[0]=Z[0]/2;
    if(p==null){p=4}
    if(p!=0)
    {
        var q=2*p;
        for(var i=1;i<n;i++)
        {   
            if(Color){setColor(Color[i]);if(!Color[i]){setColor("Green");}}
            
            pie(x0+p*Math.cos(DU[i]*rad),y0+p*Math.sin(DU[i]*rad),r,Z[i-1],Z[i]);
           
        }
        if(Color){setColor(Color[0]);}
        pie(x0+p*Math.cos(DU[0]*rad),y0+p*Math.sin(DU[0]*rad),r,0,Z[0]);
        
    }
    else
    {
         for(var i=1;i<n;i++)
        {   
            if(Color){setColor(Color[i]);if(!Color[i]){setColor("Green");}}
            pie(x0,y0,r,Z[i-1]-1,Z[i]);
           
        }
        if(Color){setColor(Color[0]);}
        pie(x0,y0,r,0,Z[0]);   
    
    
    }
    var txt,pp=0.7*r;
    for(var i=0;i<n;i++)
    {   
        txt=FT[i]+"%";
        drawStringRect(txt,x0+pp*Math.cos(DU[i]*rad),y0+pp*Math.sin(DU[i]*rad),30,15,9,"White");
    
    }

    this.Max_flag=function Max_flag(arry)
                {
                    var temp=0,flag;
                    for(var i=0;i<arry.length;i++) { if(temp<arry[i]){temp=arry[i];flag=i;} }
                    return flag;
                }

}
//this function is implemented from Walter Zorn.com 扫描线填充 thanks Walter Zorn.
function fillPolygon(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;

			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(integer_compare);
		for (i = 0; i < ints; i+=2)
			mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);
	}
	
	this.integer_compare=function integer_compare(x,y)
                {
	                return (x < y) ? -1 : ((x > y)*1);
                }

}


function drawStringRect(txt,x,y,w,h,size,ftcolor)
{
    this.ftout=function ftout(txt,x,y,w,h,size,ftcolor)
    {
        output+='<div style="position:absolute;left: '+x+'px; bottom: '+y+'px; overflow:hidden;font-size:'+size+'px;color:'+ftcolor+'; background-color:Transparent; width:'+w+'px; height:'+h+'px;">'+txt+'</div>'
    }
    if(!size){size=9;}
    if(!ftcolor){ftcolor="Black";}
    ftout(txt,x,y,w,h,size,ftcolor);

}


//主函数 
function jsGraphics()
{
    this.setColor=setColor;
    this.setPen=setPen;
    this.point=point;
    this.drawLine=drawLine;
    this.clear=clear;
    this.drawCurve=drawCurve;
    this.drawPolyline=drawPolyline;
    this.drawPolygon=drawPolygon;
    this.fillPolygon=fillPolygon;
    this.drawEllipse=drawEllipse;
    this.fillEllipse=fillEllipse;
    this.pie=pie;
    this.pieChart=pieChart;
    this.drawStringRect=drawStringRect;
    
    this.paint=paint;


}


//=================Tension Spline Begin==========================
//var Y=[10,20,30,40,20];
//var X=[5,10,15,20,25];
//drawCurve(X,Y,0.1);
function drawCurve(X,Y,a)
{   
    var M0=0.1,Mn=0.1//两个初始二次边界条件,可根据情况修改值调节两端的上凸下凸性
    if(Math.abs(a)<0.005){a=0.005;}
    if(Math.abs(a)>9){a=9;}
    var n=X.length;
    var h=new Array(n-1);
    for(var i=0;i<n-1;i++){h[i]=X[i+1]-X[i];}
    var K=new Array(n-2);
    for(var i=1;i<n-1;i++)
    {
       K[i-1]=( (a*ch(a*h[i-1]))/(sh(a*h[i-1]))+(a*ch(a*h[i]))/(sh(a*h[i]))-1/h[i-1]-1/h[i] )/2;
    }
    
    var m=new Array(n-2);
    for(var i=1;i<n-1;i++)
    {
        m[i-1]=(1/h[i]-a/(sh(a*h[i])))/(K[i-1]);
    }
    
    var l=new Array(n-2);
    for(var i=1;i<n-1;i++)
    {
       l[i-1]=(1/h[i-1]-a/(sh(a*h[i-1])))/(K[i-1]);
    }
    
    var d=new Array(n-2);
    for(var i=1;i<n-1;i++)
    {
       d[i-1]=a*a*((Y[i+1]-Y[i])/h[i]-(Y[i]-Y[i-1])/h[i-1])/(K[i-1]);
    }
    
    var A=new Array(n-2);
    for(var i=0;i<n-2;i++)
    {
        A[i]=new Array(n-2);
        for(var j=0;j<n-2;j++)  { A[i][j]=0;   }
    }
    
    for(var i=0;i<n-2;i++)   {   A[i][i]=2;   }
    for(var i=0;i<n-3;i++)   {   A[i][i+1]=m[i];  }
    for(var i=0;i<n-3;i++)   {   A[i+1][i]=l[i+1]; }
    
    d[0]=d[0]-l[0]*M0;
    d[n-3]=d[n-3]-m[n-3]*Mn;   
    
    var M=Gauss(A,d);
    M.unshift(M0);
    M.push(Mn);
      
    var x=X[0];
    for(var j=1;j<=n-1;j++)
    {
        for(x=x+pen_w;x<=X[j];x=x+pen_w)
        {
            drawLine(x-pen_w,SH(x-pen_w,j),x,SH(x,j));
        }
    }

    this.SH=function SH(x,j)
    {
      return  Y[j]*(x-X[j-1])/h[j-1]+Y[j-1]*(X[j]-x)/h[j-1]-M[j]*( (x-X[j-1])*sh(a*h[j-1])/h[j-1] - sh(a*(x-X[j-1]))  )/(a*a*sh(a*h[j-1])) - M[j-1]*( (X[j]-x)*sh(a*h[j-1])/h[j-1] - sh(a*(X[j]-x))  )/(a*a*sh(a*h[j-1]));
    }
    this.sh=function sh(x){   return (Math.exp(x)-Math.exp(-x))/2;}
    this.ch=function ch(x){   return (Math.exp(x)+Math.exp(-x))/2;}

}

//按行输入矩阵A  AX=b
//var A =[ [ 16, -9, 1,6 ], [-2, 1.127, 8 ,3], [ 4, 3, 1 ,2],[6,3,9,2] ];
//var b =[38,-12.873,14,9 ];
//Gauss(A,b);
function Gauss(A,b)
{
    var n=A.length;
    var P=new Array;
    for(var i=0;i<n;i++){P[i]=i;}
    var S=new Array;
    for(var i=0;i<n;i++){S[i]=Max_value(A[i]);}
    
    for(var j=0;j<n-1;j++)
    {
        var A_S=new Array;
        for(var k=j,i=0;k<n;k++,i++)
        {
            A_S[i]=(A[P[k]][j])/S[P[k]];
        }
        var P_flag=Max_flag(A_S)+j;
        var temp=P[j]; P[j]=P[P_flag];P[P_flag]=temp;
        
        for(var i=j+1;i<n;i++)
        {
            A[P[i]][j]=(A[P[i]][j])/A[P[j]][j];
            for(var k=j+1;k<n;k++) {A[P[i]][k]= A[P[i]][k]-(A[P[i]][j])*(A[P[j]][k]); }
        }
        
    }
    
    for(var i=0;i<n;i++)
    {
        var sum=0;
        for(var j=0;j<i;j++){ sum+=A[P[i]][j]*b[P[j]] ;}
        b[P[i]]=b[P[i]]-sum;
    }
    
    var X=new Array(n);
    for(var i=n-1;i>=0;i--)
    {
        var sum=0;
        for(var j=i+1;j<n;j++){sum+=(A[P[i]][j])*X[j];}
        X[i]=(b[P[i]]-sum)/(A[P[i]][i]);
    }
    
    return X;
    
    this.Max_value=function Max_value(arry)
                    {
                        var temp=0;
                        for(var i=0;i<arry.length;i++) { if(temp<arry[i]){temp=arry[i];} }
                        return temp;
                    }
    this.Max_flag=function Max_flag(arry)
                    {
                        var temp=0,flag;
                        for(var i=0;i<arry.length;i++) {if(temp<arry[i]){temp=arry[i];flag=i;} }
                        return flag;
                    }
                    
}
   
//=================Tension Spline End==========================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -