function Sphere(nr,np) {
 p=new Array()
 u=new Array()
 n=0
 for(i=0;i<nr;i++){
 	theta=(i*Math.PI)/(nr-1)
 	z=Math.cos(theta)
 	r=Math.sin(theta)
 	for(j=0;j<np;j++){
 		a=j*2*Math.PI/np
 		x=r*Math.cos(a)
 		y=r*Math.sin(a)
 		u[n]=m.Point2(j/np,i/(nr-1))
 		p[n++]=m.Point3(x,y,z)
 	}
 }
 pos=new Array()
 surf=new Array()
 n=0
 for(i=0;i<nr-1;i++){
 	sc=i*np;	sn=sc+np;
 	for(j=0;j<np;j++){
			surf[n]=u[sn+j];
			pos[n++]=p[sn+j];
			surf[n]=u[sc+j];
			pos[n++]=p[sc+j];
			if(j==np-1){
				surf[n]=m.Point2(1.0,i/(nr-1));
				pos[n++]=p[sn];
				surf[n]=m.Point2(1.0,i/(nr-1));
				pos[n++]=p[sn];
			}	else {
				surf[n]=u[sn+j+1];
				pos[n++]=p[sn+j+1];
				surf[n]=u[sn+j+1];
				pos[n++]=p[sn+j+1];
			}
			surf[n]=u[sc+j];
			pos[n++]=p[sc+j];
			if(j==np-1){
				surf[n]=m.Point2(1.0,i/(nr-1));
				pos[n++]=p[sc];
			}	else {
				surf[n]=u[sc+j+1];
				pos[n++]=p[sc+j+1];
			}
		}
	}
 norm=new Array();
	for(i=0;i<pos.length;i++) {
		v=m.Vector3(pos[i].X.Extract(),pos[i].Y.Extract(),pos[i].Z.Extract());
		norm[i]=v;
	}
	return m.TriMesh(pos.length/3,pos,norm,surf,null)
}

function Cylinder(nr,np) {
	return Sphere(nr,np).Transform(m.Scale3(5,0.05,0.05))
}
