class square{ float[] v = new float[4]; square(){ for(int i=0;i<4;i++){ v[i]=0.0f; } } square(float v0, float v1, float v2, float v3){ v[0]=v0; v[1]=v1; v[2]=v2; v[3]=v3; } int determineType(float treshold){ int lv0,lv1,lv2,lv3; lv0=lv1=lv2=lv3=0; if (v[0]<=treshold) lv0=1; if (v[1]<=treshold) lv1=2; if (v[2]<=treshold) lv2=4; if (v[3]<=treshold) lv3=8; return lv0+lv1+lv2+lv3; }; void update(float v0, float v1, float v2, float v3){ v[0]=v0; v[1]=v1; v[2]=v2; v[3]=v3; } void draw(float offsetx, float offsety, float scale, float treshold){ int type = determineType(treshold); beginShape(LINES); switch (type){ case 0: break; case 1: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); break; case 2: vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); break; case 3: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); break; case 4: vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 5: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 6: vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 7: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 8: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 9: vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 10: vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 11: vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[3],v[2],treshold)*scale,offsety+scale); break; case 12: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); break; case 13: vertex(offsetx+scale,offsety+interpolate(v[1],v[2],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); break; case 14: vertex(offsetx,offsety+interpolate(v[0],v[3],treshold)*scale); vertex(offsetx+interpolate(v[0],v[1],treshold)*scale,offsety); break; case 15: break; default: break; } endShape(); } float interpolate(float xi, float xj, float treshold){ return( (treshold-xi)/(xj-xi)); } }