void MpSurfacePrism (Scene &S, const Matrix &Z, int nsegments, double wx, double wy, const ColorMap &cmap,double cmin, double cmax) { // nothing that can be drawn if ( Z.Empty() ) return; // 4-segments faster special case if (nsegments == 4) { MpSurfacePrism4(S,Z,wx,wy,cmap,cmin,cmax); return; } // find the extrema double zmin = Min(Z); // check for valid nsegments values MpForceRange(nsegments, 3, MaxVertices); // check if a colormap should be used double dz,cscale = 0; bool usecolormap; int ncmap = cmap.Size()-1; if (cmap) { usecolormap = true; dz = cmax - cmin; cscale = (dz == 0.0) ? 0 : ncmap/dz; } else usecolormap = false; // add prism for (int x = Z.Rlo(); x <= Z.Rhi(); x++) for (int y = Z.Clo(); y <= Z.Chi(); y++) { double z = Z(x,y), height = 0.5 * (z - zmin); Trafo T = trans(y,height+zmin,x) * scale(wy,height,wx) * rot(Trafo::XAxis,M_PI/2); // coloring const ColorB *color; if (usecolormap) { int c = int((z-cmin)*cscale); if (c > ncmap) c = ncmap; else if (c < 0) c = 0; color = &cmap[c]; } else color = (ColorB*)NULL; cylinder(S,nsegments,T,color); } }
static void MpSurfacePrism4 (Scene &S, const Matrix &Z, double wx, double wy, const ColorMap &cmap, double cmin, double cmax) { // nothing that can be drawn if ( Z.Empty() ) return; // find the minimum double zmin = Min(Z); // check if a colormap should be used double dz,cscale = 0; bool usecolormap; int ncmap = cmap.Size()-1; if (cmap) { usecolormap = true; dz = cmax - cmin; cscale = (dz == 0.0) ? 0.0 : ncmap/dz; } else usecolormap = false; // add square prisms for (int x = Z.Rlo(); x <= Z.Rhi(); x++) for (int y = Z.Clo(); y <= Z.Chi(); y++) { double z = Z(x,y), height = 0.5 * (z - zmin); Trafo T = trans(y,height+zmin,x) * scale(wy,height,wx); // coloring const ColorB *color; if (usecolormap) { int c = int((z-cmin)*cscale); if (c > ncmap) c = ncmap; else if (c < 0) c = 0; color = &cmap[c]; } else color = (ColorB*)NULL; MpCube(S,T,color); } }