//グラフィックライブラリ:glib
//1998.7.16 ver-1.2 小山智史(弘前大学)
//2001.1.25 ver-1.3c ...NN4, NN6, IE5に対応
//グラフィックを独立窓に表示する場合はgopen(...,gwin)でgwinを-1にします。
//現在位置に表示する場合はgwinを0にします
//フレーム表示の場合はgwinを1〜のフレーム番号にします
var ON=1, OFF=0, SWIDTH=8, SHEIGHT=11
var BGCOLOR, IXMAX, IYMAX, ILINE=1
var IXPOS=0, IYPOS=0, DM=1, KX=0, KY=0, KZ=0
var XOF=0, YOF=0, ZOF=0, XFS=0, YFS=0, ZFS=0, XCK=1, YCK=1, ZCK=1, XSPAN=1, YSPAN=1, ZSPAN=1,XSTEP=0, YSTEP=0, ZSTEP=0
var c1=new Array(1,.966,.866,.707,.5,.259,0)
var iflag=new Array();	ixtable=new Array(), iytable=new Array()
var gwin=0
var gcolor=new Array("RED","BLUE","GREEN","MAGENTA","ORANGE","PINK","LIME","YELLOW","BROWN","BLACK");
var gsymbol=new Array("×","●","▲","■","◆","＊","○","△","□","◇")
//グラフィックの開始...
//bgcolor:背景色, ixmax:幅,iymax:高さ, s:タイトル, gwin:-1で独立窓, 0で現在位置, 1〜でフレーム
function gopen(bgcolor,ixmax,iymax,s,gw){
	GWIN=gw; BGCOLOR=bgcolor||"cornsilk"; IXMAX=ixmax||400; IYMAX=iymax||200; ILINE=1
	IXPOS=IYPOS=0;	DM=1;	KX=KY=KZ=0;	XOF=YOF=ZOF=0;	XCK=YCK=ZCK=1
	if(GWIN<0){									//ウィンドウ版
		gwin=window.open("","gwin1","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0,width="+IXMAX+",height="+IYMAX)
		gwin.focus();gwin.document.open();gwin.document.bgColor=BGCOLOR
		gwin.document.write("<title>"+s+"</title>")
		gwin.document.write("<h3 align=center>"+s+"</h3>")
	}else if(GWIN==0){							//現在位置
		if(is_nav4)	document.write("<br><ilayer bgColor="+bgcolor+" width="+ixmax+" height="+iymax+"><table><tr><td width="+ixmax+"><h3 align=center>"+s+"</h3></td></tr></table>")
		else if(is_ie4up)	document.write("<br><SPAN style='position:relative; background-color:"+bgcolor+"; width:"+ixmax+"; height:"+iymax+";'><h3 align=center>"+s+"</h3>")
		else if(is_nav5up)	document.write("<br><SPAN style='position:absolute; background-color:"+bgcolor+"; width:"+ixmax+"; height:"+iymax+";'><h3 align=center>"+s+"</h3>")
	}else with(parent.frames[GWIN].document){	//フレーム版
		open()
		bgColor=BGCOLOR
		write("<h3 align=center>"+s+"</h3>")
	}
}

//グラフィック終了
function gclose(){
	if(GWIN<0)			gwin.document.close()					//ウィンドウ版
	else if(GWIN==0){
		if(is_nav4)	document.write("</ilayer><br>")				//現在位置
		else if(is_ie4up)	document.write("</SPAN><br>")
		else if(is_nav5up){
			document.write("</SPAN><br>")
			for(var i=0;i<Math.floor(IYMAX/(SHEIGHT+4));i++) document.write("<br>")	//グラフ表示後の位置調整(NN6.0)
		}
	}else				parent.frames[GWIN].document.close()	//フレーム版
}

function ixx(ix){return (DM==2||DM==3)?(IXPOS-ix):(IXPOS+ix)}
function iyy(iy){return (DM==3||DM==4)?(IYPOS+iy):(IYPOS-iy)}
function xyinit(ix0,iy0,dm,kx0,ky0,kz0){IXPOS=ix0;IYPOS=iy0;DM=dm;	KX=kx0;	KY=ky0;	KZ=kz0}

function xyzcv1(x, y, z, P){
	var kx1,ky1,kz1,kx2,ky2,kz2,kz3,zz,x1,y1,x2,y2,cx1,cy1,cz
	kx1=(KX<0)?(1-KX):(1+KX)
	ky1=(KY<0)?(1-KY):(1+KY)
	kz1=(KZ<0)?(1-KZ):(1+KZ)
	kz2=Math.floor((kz1-1)/10)
	kz1=Math.floor(kz1-(10*kz2))
	kx2=8-kx1;	ky2=8-ky1;	kz3=8-kz1
	if(KX!=KY)	kz1=kz3=1
	P.x=x/XCK;	P.y=y/YCK;
	zz=z/ZCK;
	x1=c1[kx1-1]*P.x;	y1=c1[ky1-1]*P.y
	cy1=(-c1[ky2-1]);	cx1=c1[kx2-1]
	if((KY<0)^(DM==2 || DM==4)) cy1=(-cy1)
	if((KX<0)^(DM==2 || DM==4)) cx1=(-cx1)
	x2=x1+cy1*P.y;	y2=y1+cx1*P.x
	cz=c1[kz3-1]
	if(kz2==0){
		if((KZ<0)&&(DM==2 || DM==3)) cz=(-cz)
		x2=c1[kz1-1]*x2+cz*zz
	}else if(kz2==1){
		if((KZ<0)&&(DM==3 || DM==4)) cz=(-cz)
		y2=c1[kz1-1]*y2+cz*zz
	}
	P.x=Math.floor(100*x2);	P.y=Math.floor(100*y2)
}

function xyzcv(x, y, z, P){
	var POF=new Array()
	xyzcv1(x,y,z,P);	xyzcv1(XOF,YOF,ZOF,POF)
	P.x-=POF.x;	P.y-=POF.y
}

function goffset(x, y, z){		XOF=x;	YOF=y;	ZOF=z	}	//オフセット指定
function gscale(cx, cy, cz){	XCK=cx;	YCK=cy;	ZCK=cz	}	//軸感度指定

function plot(color,x,y,s){
	if(s)	symbol(color,x,y,s);
	else if(is_nav4){
		if(GWIN<0)	gwin.document.write("<layer bgColor="+color+" width=1 height=1 pagex="+ixx(x)+" pagey="+iyy(y)+"></layer>");
		else if(GWIN==0)	document.write("<layer bgColor="+color+" width=1 height=1 left="+ixx(x)+" top="+iyy(y)+"></layer>");
		else	parent.frames[GWIN].document.write("<layer bgColor="+color+" width=1 height=1 pagex="+ixx(x)+" pagey="+iyy(y)+"></layer>");
	}else if(is_ie4up||is_nav5up){
		if(GWIN<0)	gwin.document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:1; left:"+ixx(x)+"; top:"+iyy(y)+"'></SPAN>");
		else if(GWIN==0)	document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:1; left:"+ixx(x)+"; top:"+iyy(y)+"'></SPAN>");
		else	parent.frames[GWIN].document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:1; left:"+ixx(x)+"; top:"+iyy(y)+"'></SPAN>");
	}
}

function fplot(color, x, y, z, s){
	var P=new Array();
	if(s)	fsymbol(color,x,y,z,s);
	else{xyzcv(x,y,z,P);	plot(color,P.x,P.y);}
}

function plot0(color,x,y,s){
	if(is_nav4){
		if(GWIN<0)	gwin.document.write("<layer pagex="+(ixx(x)-SWIDTH/2)+" pagey="+(iyy(y)-SHEIGHT/2)+"><font size=1 color="+color+">"+s+"</font></layer>")
		else if(GWIN==0)	document.write("<layer left="+(ixx(x)-SWIDTH/2)+" top="+(iyy(y)-SHEIGHT/2)+"><font size=1 color="+color+">"+s+"</font></layer>")
		else parent.frames[GWIN].document.write("<layer pagex="+(ixx(x)-SWIDTH/2)+" pagey="+(iyy(y)-SHEIGHT/2)+"><font size=1 color="+color+">"+s+"</font></layer>")
	}else if(is_ie4up||is_nav5up){
		if(GWIN<0)	gwin.document.write("<SPAN style='position:absolute; overflow:hidden; left:"+(ixx(x)-SWIDTH/2)+"; top:"+(iyy(y)-SHEIGHT/2)+"'><font size=1 color="+color+">"+s+"</font></SPAN>")
		else if(GWIN==0)	document.write("<SPAN style='position:absolute; overflow:hidden; left:"+(ixx(x)-SWIDTH/2)+"; top:"+(iyy(y)-SHEIGHT/2)+"'><font size=1 color="+color+">"+s+"</font></SPAN>")
		else parent.frames[GWIN].document.write("<SPAN style='position:absolute; overflow:hidden; left:"+(ixx(x)-SWIDTH/2)+"; top:"+(iyy(y)-SHEIGHT/2)+"'><font size=1 color="+color+">"+s+"</font></SPAN>")
	}
}

function plotc(color, s, str){
	var ixpos1=IXPOS, iypos1=IYPOS, dm1=DM, kx1=KX, ky1=KY, kz1=KZ
	var ix=IXMAX-100-str.length*SWIDTH-SWIDTH
	var iy=-(SHEIGHT+2)*(ILINE++)
	xyinit(0,0,0,0,0,0)
	symbol(color,IXMAX-80,iy,str)
	iy-=(SHEIGHT/2)
//	line( color,IXMAX-140,iy,IXMAX-100,iy)
//	plot0(color,IXMAX-140,iy,s)
	plot0(color,IXMAX-90,iy,s)
	xyinit(ixpos1,iypos1,dm1,kx1,ky1,kz1)
}

function hline(color,x1,y1,x2){
	if(x1==x2){	plot(color,x1,y1);	return}
	var ixx1=ixx(x1), iyy1=iyy(y1), ixx2=ixx(x2), t
	if(ixx1>ixx2){	t=ixx1;	ixx1=ixx2;	ixx2=t	}
	if(GWIN<0){
		if(is_nav4)	gwin.document.write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height=1 pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) gwin.document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:1; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else if(GWIN==0){
		if(is_nav4)	document.write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height=1 left="+ixx1+" top="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:1; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else{with(parent.frames[GWIN].document){
		if(is_nav4)	write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height=1 pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:1; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}}
}
function vline(color,x1,y1,y2){
	if(y1==y2){	plot(color,x1,y1);	return}
	var ixx1=ixx(x1), iyy1=iyy(y1), iyy2=iyy(y2), t
	if(iyy1>iyy2){	t=iyy1;	iyy1=iyy2;	iyy2=t	}
	if(GWIN<0){
		if(is_nav4)	gwin.document.write("<layer bgColor="+color+" width=1 height="+(iyy2-iyy1)+" pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) gwin.document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else if(GWIN==0){
		if(is_nav4)	document.write("<layer bgColor="+color+" width=1 height="+(iyy2-iyy1)+" left="+ixx1+" top="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else{with(parent.frames[GWIN].document){
		if(is_nav4)	write("<layer bgColor="+color+" width=1 height="+(iyy2-iyy1)+" pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:1; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}}
}
function line(color,x1,y1,x2,y2){
	if(x1==x2)		vline(color,x1,y1,y2)
	else if(y1==y2)	hline(color,x1,y1,x2)
	else{
		var dx=Math.abs(x2-x1), dy=Math.abs(y2-y1), s, step, x0, y0
		if(dx>dy){
			if(x1>x2){
				step=(y1>y2)?1:-1
				s=x1; x1=x2; x2=s; y1=y2
			}else step=(y1<y2)?1:-1
//			plot(color,x1,y1)
			x0=x1
			s=dx>>1
			while(++x1<=x2){
				if((s-=dy)<0){hline(color,x0,y1,x1); x0=x1; s+=dx; y1+=step}
//				if((s-=dy)<0){s+=dx; y1+=step}
//				plot(color,x1,y1)
			}
			hline(color,x0,y1,x1)
//			s=dx>>1
//			while(++x1<=x2){
//				if((s-=dy)<0){s+=dx; y1+=step}
//				plot(color,x1,y1)
//			}
		}else{
			if(y1>y2){
				step=(x1>x2)?1:-1
				s=y1; y1=y2; y2=s; x1=x2
			}else step=(x1<x2)?1:-1
//			plot(color,x1,y1)
			y0=y1
			s=dy>>1
			while(++y1<=y2){
				if((s-=dx)<0){vline(color,x1,y0,y1); y0=y1; s+=dy; x1+=step}
//				if((s-=dx)<0){s+=dy; x1+=step}
//				plot(color,x1,y1)
			}
			vline(color,x1,y0,y1)
		}
//		var ixx1=ixx(x1), iyy1=iyy(y1), ixx2=ixx(x2), iyy2=iyy(y2), t
//		if(ixx1>ixx2){	t=ixx1;	ixx1=ixx2;	ixx2=t	}
//		if(iyy1>iyy2){	t=iyy1;	iyy1=iyy2;	iyy2=t	}
//		if(x1<x2)for(var x=x1;x<=x2;x++)plot(color,x,(y2-y1)/(x2-x1)*(x-x1)+y1)
//		else	for(var x=x2;x<=x1;x++)	plot(color,x,(y2-y1)/(x2-x1)*(x-x1)+y1)
	}
}

function fline(color, x1, y1, z1, x2, y2, z2){
	var P1=new Array(), P2=new Array()
	xyzcv(x1,y1,z1,P1);	xyzcv(x2,y2,z2,P2);	line(color,P1.x,P1.y,P2.x,P2.y)
}

function gbox(color, ix1, iy1, ix2, iy2){
	if(ix1==ix2 || iy1==iy2){
		if(color==color.toUpperCase())	line("BLACK",ix1,iy1,ix2,iy2);
		else 							line(color,ix1,iy1,ix2,iy2);
		return;
	}
if(color==color.toLowerCase()){
	line(color,ix1,iy1,ix1,iy2);	line(color,ix1,iy1,ix2,iy1);
	line(color,ix1,iy2,ix2,iy2);	line(color,ix2,iy1,ix2,iy2);
}else{
	var ixx1=ixx(ix1), iyy1=iyy(iy1), ixx2=ixx(ix2), iyy2=iyy(iy2)
	if(ixx1>ixx2){	t=ixx1;	ixx1=ixx2;	ixx2=t	}
	if(iyy1>iyy2){	t=iyy1;	iyy1=iyy2;	iyy2=t	}
	if(GWIN<0){
		if(is_nav4)	gwin.document.write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height="+(iyy2-iyy1)+" pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) gwin.document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else if(GWIN==0){
		if(is_nav4)	document.write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height="+(iyy2-iyy1)+" left="+ixx1+" top="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up) document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}else{
		if(is_nav4)	parent.frames[GWIN].document.write("<layer bgColor="+color+" width="+(ixx2-ixx1)+" height="+(iyy2-iyy1)+" pagex="+ixx1+" pagey="+iyy1+"></layer>")
		else if(is_ie4up||is_nav5up)	parent.frames[GWIN].document.write("<SPAN style='position:absolute; overflow:hidden; background-color:"+color+"; width:"+(ixx2-ixx1)+"; height:"+(iyy2-iyy1)+"; left:"+ixx1+"; top:"+iyy1+"'></SPAN>")
	}
	if(color==color.toUpperCase()){
		line("BLACK",ix1,iy1,ix1,iy2);	line("BLACK",ix1,iy1,ix2,iy1);
		line("BLACK",ix1,iy2,ix2,iy2);	line("BLACK",ix2,iy1,ix2,iy2);
	}
}
}

function fbox(color, x1, y1, z1, x2, y2, z2){
	var P1=new Array(), P2=new Array()
	xyzcv(x1,y1,z1,P1);	xyzcv(x2,y2,z2,P2)
	gbox(color,P1.x,P1.y,P2.x,P2.y)
}

function symbol(color, ix, iy, str){
	if(DM==3 || DM==4)	iy-=SHEIGHT
	if(GWIN<0){
		if(is_nav4)	gwin.document.write("<layer pagex="+ixx(ix)+" pagey="+iyy(iy)+"><font size=2 color="+color+">"+str+"</font></layer>")
		else if(is_ie4up||is_nav5up) gwin.document.write("<SPAN style='position:absolute; overflow:hidden; left:"+ixx(ix)+"; top:"+iyy(iy)+"'><font size=2 color="+color+">"+str+"</font></SPAN>")
	}else if(GWIN==0){
		if(is_nav4)	document.write("<layer left="+ixx(ix)+" top="+iyy(iy)+"><font size=2 color="+color+">"+str+"</font></layer>")
		else if(is_ie4up||is_nav5up) document.write("<SPAN style='position:absolute; overflow:hidden; left:"+ixx(ix)+"; top:"+iyy(iy)+"'><font size=2 color="+color+">"+str+"</font></SPAN>")
	}else{
		if(is_nav4)	parent.frames[GWIN].document.write("<layer pagex="+ixx(ix)+" pagey="+iyy(iy)+"><font size=2 color="+color+">"+str+"</font></layer>")
		else if(is_ie4up||is_nav5up) parent.frames[GWIN].document.write("<SPAN style='position:absolute; overflow:hidden; left:"+ixx(ix)+"; top:"+iyy(iy)+"'><font size=2 color="+color+">"+str+"</font></SPAN>")
	}
}

function fsymbol(color, x, y, z, str){
	var P=new Array()
	xyzcv(x,y,z,P);	symbol(color,P.x,P.y,str)
}

function fpconv(w, ref, W){
	W.ww=w
	var ref10=10*ref
	for(var i=0;i<100;i++)	if(Math.abs(W.ww)<=ref10){	break}else{W.ww/=10}
	for(var j=0;j<100;j++)	if(Math.abs(W.ww)>ref){		break}else{W.ww*=10}
	W.np=i-j
}

function fltx(wof, span, W){
	fpconv(span,1.1,W)
	if(W.ww>5.1)		W.unit=2
	else if(W.ww>=0)	W.unit=1
	else if(W.ww>(-5.1))W.unit=(-1)
	else				W.unit=(-2)
	W.unit*=Math.pow(10,W.np)
	var ifix=Math.floor(wof/W.unit)
	W.org=ifix*(W.unit)
	var w1=wof+1.1*span
	if(wof<=w1){W.min=wof;	W.max=w1}
	else       {W.min=w1;	W.max=wof}
}

function cdisp(unit, color, ix, iy, w1, size){
	unit=Math.round(unit*1000000)/1000000+""
	if(DM==2 || DM==3) ix+=SWIDTH
	if(DM==3 || DM==4) iy-=SHEIGHT
	if(DM!=2 && DM!=3) ix-=SWIDTH*(unit.length-1)
	symbol(color,ix,iy,"<FONT FACE='Arial,Helvetica' SIZE=-3><I>"+unit+"</I></FONT>")
}

function xscale(color, fs, str, step){
	var P=new Array(), W=new Array(), xx
	XFS=fs
	XSPAN=fs-XOF
	if(XSPAN==0) return
	var x1=XOF+XSPAN
	fline(color,XOF,YOF,ZOF,x1,YOF,ZOF)
	if(str!=""){
		x1=XOF+1.1*XSPAN
		xyzcv(x1,YOF,ZOF,P)
		P.x-=SWIDTH/2;	P.y+=SHEIGHT/2
		if(DM==2 || DM==3) P.x+=SWIDTH
		if(DM==3 || DM==4) P.y-=SHEIGHT
		symbol(color,P.x,P.y,str)
	}
	if(step){
		XSTEP=step
		for(x1=XOF;x1<=XOF+XSPAN;x1+=step){
			xyzcv(x1,YOF,ZOF,P);	line(color,P.x,P.y,P.x,P.y-4)
			cdisp(x1,color,P.x-SWIDTH/2,P.y-2,x1)
		}
	}else{
		fltx(XOF,XSPAN,W)
		XSTEP=W.unit
		for(x1=W.org;(XSPAN<0&&x1>=W.min)||(XSPAN>0&&x1<=W.max);x1+=W.unit){
			xyzcv(x1,YOF,ZOF,P);	line(color,P.x,P.y,P.x,P.y-4)
			cdisp(x1,color,P.x-SWIDTH/2,P.y-2,x1)
		}
	}
}

function yscale(color, fs, str, step){
	var P=new Array(), W=new Array(), yy
	YFS=fs
	YSPAN=fs-YOF
	if(YSPAN==0) return
	var y1=YOF+YSPAN
	fline(color,XOF,YOF,ZOF,XOF,y1,ZOF)
	if(str!=""){
		y1=YOF+1.1*YSPAN
		xyzcv(XOF,y1,ZOF,P)
		P.x-=SWIDTH/2;	P.y+=SHEIGHT/2
		if(DM==2 || DM==3) P.x+=SWIDTH
		if(DM==3 || DM==4) P.y-=SHEIGHT
		symbol(color,P.x,P.y,str,2)
	}
	if(step){
		YSTEP=step
		for(y1=YOF;y1<=YOF+YSPAN;y1+=step){
			xyzcv(XOF,y1,ZOF,P);	line(color,P.x,P.y,P.x-4,P.y)
			cdisp(y1,color,P.x-10,P.y+SHEIGHT/2,y1)
		}
	}else{
		fltx(YOF,YSPAN,W)
		YSTEP=W.unit
		for(y1=W.org;(YSPAN<0&&y1>=W.min)||(YSPAN>0&&y1<=W.max);y1+=W.unit){
			xyzcv(XOF,y1,ZOF,P);	line(color,P.x,P.y,P.x-4,P.y)
			cdisp(y1,color,P.x-10,P.y+SHEIGHT/2,y1)
		}
	}
}

function xygrid(color){
	for(var x=XOF;x<=XFS;x+=XSTEP)	fline(color,x,YOF,0,x,YFS,0);
	for(var y=YOF;y<=YFS;y+=YSTEP)	fline(color,XOF,y,0,XFS,y,0);
}

function zscale(color, fs, str, step){
	var P=new Array(), W=new Array(), ix,iy,ix1,iy1, org,z1,zz
	ZFS=fs
	ZSPAN=fs-ZOF
	if(ZSPAN==0) return
	z1=ZOF+ZSPAN
	fline(color,XOF,YOF,ZOF,XOF,YOF,z1)
	if(str!=""){
		z1=ZOF+1.1*ZSPAN
		xyzcv(XOF,YOF,z1,P)
		P.x-=SWIDTH/2;	P.y+=SHEIGHT/2
		if(DM==2 || DM==3) P.x+=SWIDTH
		if(DM==3 || DM==4) P.y-=SHEIGHT
		symbol(color,P.x,P.y,str,2)
	}
	if(step){
		ZSTEP=step
		for(z1=ZOF;z1<=ZOF+ZSPAN;z1=z1+step){
			xyzcv(XOF,YOF,z1,P)
			ix1=P.x;	iy1=P.y
			if(KZ>=-6 && KZ<=6)	iy1+=3
			else			  	ix1+=4
			line(color,P.x,P.y,ix1,iy1)
			P.x-=4;	P.y-=2;	if(KZ<-6 || KZ>6){	P.x-=6;	P.y+=6	}
			cdisp(z1,color,P.x,P.y,z1)
		}
	}else{
		fltx(ZOF,ZSPAN,W)
		ZSTEP=W.unit
		for(z1=W.org;(ZSPAN<0 && z1>=W.min) || (ZSPAN>0 && z1<=W.max);z1=z1+W.unit){
			xyzcv(XOF,YOF,z1,P)
			ix1=P.x;	iy1=P.y
			if(KZ>=-6 && KZ<=6)	iy1+=3
			else			  	ix1+=4
			line(color,P.x,P.y,ix1,iy1)
			P.x-=4;	P.y-=2;	if(KZ<-6 || KZ>6){	P.x-=6;	P.y+=6	}
			cdisp(z1,color,P.x,P.y,z1)
		}
	}
}

function gplot(ichain, color, x, y, z, s){
	var	ix0,iy0,ix1,iy1,ix2,iy2, i,n,k, x1,y1,z1,x2,y2,z2,d,xk,yk
	var P=new Array(), P0=new Array()
	if(ichain<0) for(i=1;i<=10;i++)	iflag[i]=OFF	//chainの初期化
	else{
		xyzcv(x,y,z,P)
		if(s=="||"){	xyzcv(x,YOF,z,P0);	gbox(color,P.x,P.y,P.x+10,P0.y)}
		else if(s=="|"){xyzcv(x,YOF,z,P0);	gbox(BGCOLOR,P.x,P.y,P.x+10,P0.y)}
		else if(s=="="){xyzcv(XOF,y,z,P0);	gbox(color,P.x,P.y,P0.x,P.y+10)}
		else if(s=="-"){xyzcv(XOF,y,z,P0);	gbox(BGCOLOR,P.x,P.y,P0.x,P.y+10)}
		else	plot0(color,P.x,P.y,s)
		plot(color,P.x,P.y)
		if(ichain>=1 && ichain<=10){
			ix1=ixtable[ichain];	iy1=iytable[ichain]
			ixtable[ichain]=P.x;	iytable[ichain]=P.y
			if(iflag[ichain]==ON)	line(color,P.x,P.y,ix1,iy1)
			iflag[ichain]=ON
		}
	}
}

function sinc(x){with(Math){		//sinc(x)=sin(PI*x)/(PI*x)
	if(x==0)	return 1
	else		return sin(PI*x)/(PI*x)
}}

function sinca(x){with(Math){		//sinca(x)=sin(PI*x)/{PI*x*(1-x**2)}
	var x1
	if(x==0)				return 1
	else if((x1=1-x*x)==0)	return .5
	else					return sin(PI*x)/(PI*x*x1)
}}

function gauss(v){with(Math){		//zero-mean Gaussian random variable
	var x=sqrt(-2.*log(random())*v)
	return x*cos(2.*PI*random())
}}

function GRopen(c,x,y,s,m){
	gopen(c,x,y,s,m);
	GRlabel=new Array();	GRarray=new Array();
	gplot(-1)
}
function GRdata(){
	GRlabel[GRarray.length]=arguments[0];
	gsymbol[GRarray.length]=arguments[1];
	gcolor[GRarray.length]= arguments[2];
	GRarray[GRarray.length]=new Array();
	var row=GRarray[GRarray.length-1];
	for(var i=3; i<arguments.length; i++)	row[row.length]=arguments[i];
}
function GRclose(){
	var P=new Array(),P0=new Array()
	for(var i=0;i<GRlabel.length;i++){
		if(gsymbol[i]=="||")	plotc(gcolor[i],"■",GRlabel[i]);
		else					plotc(gcolor[i],gsymbol[i],GRlabel[i]);
	}
	var xstep=XSPAN/(GRarray[0].length-1)
	if(XSTEP)	xstep=XSTEP
	for(var i=0;i<GRarray.length;i++) for(var j=0;j<GRarray[i].length;j++){
		if(gsymbol[i]=="||"){
			xyzcv(XOF+xstep*(j+.1)+xstep*.8/GRarray.length*i,YOF,0,P0)
			xyzcv(XOF+xstep*(j+.1)+xstep*.8/GRarray.length*(i+1),GRarray[i][j],0,P)
			gbox(gcolor[i],P.x,P.y,P0.x,P0.y)
		}else gplot(i+1,gcolor[i],XOF+xstep*j,GRarray[i][j],0,gsymbol[i])
	}
	gclose();
}
function Glabel(){	for(i=0;i<arguments.length;i++)	GRlabel[i]=arguments[i]}
function Gsymbol(){	for(i=0;i<arguments.length;i++)	gsymbol[i]=arguments[i]}
function Gopen(c,x,y,s,m){
	gopen(c,x,y,s,m);
	GRlabel=new Array();	gsymbol=new Array();	GRarray=new Array();
	gplot(-1)
}
function Gdata(){
	GRarray[GRarray.length]=new Array();
	var row=GRarray[GRarray.length-1];
	for(var i=0; i<arguments.length; i++)	row[row.length]=arguments[i];
}
function Gclose(){
	var xmax, xmin, P=new Array(), P0=new Array()
	for(var i=0;i<GRarray.length;i++){
		if(i==0)	xmax=xmin=GRarray[i][0];
		else{
			if(GRarray[i][0]>xmax) xmax=GRarray[i][0];
			if(GRarray[i][0]<xmin) xmin=GRarray[i][0];
		}
	}
	for(var i=0;i<GRlabel.length;i++){
		if(gsymbol[i]=="||"||gsymbol[i]=="|")plotc(gcolor[i],"■",GRlabel[i]);
		else	plotc(gcolor[i],gsymbol[i],GRlabel[i]);
	}
	var xstep=(xmax-xmin)/(GRarray.length-1)	//var xstep=XSPAN/(GRarray.length-1)
	if(XSTEP)	xstep=XSTEP
	for(var i=0;i<GRarray.length;i++){
	 var ysum=YOF
	 for(var j=1;j<GRarray[i].length;j++){
		if(gsymbol[j-1]=="||"){
			xyzcv(XOF+xstep*(i+.1)+xstep*.8/(GRarray[i].length-1)*(j-1),YOF,0,P0)
			xyzcv(XOF+xstep*(i+.1)+xstep*.8/(GRarray[i].length-1)*j,GRarray[i][j],0,P)
			gbox(gcolor[j-1],P.x,P.y,P0.x,P0.y)
		}else if(gsymbol[j-1]=="|"){
			xyzcv(XOF+xstep*(i+.1),ysum,0,P0)
			xyzcv(XOF+xstep*(i+.9),(ysum+=GRarray[i][j]),0,P)
			gbox(gcolor[j-1],P.x,P.y,P0.x,P0.y)
		}else	gplot(j,gcolor[j-1],XOF+xstep*i,GRarray[i][j],0,gsymbol[j-1])
	}}
	gclose();
}

