DrawPlex := module()
export drawplex,drawvert,drawedge,drawface;

    drawvert := proc(im,p,vertsize)
        drawdot(im,p,vertsize,"black");
    end proc;

    drawedge := proc(im,p,q,edgesize,bdy,col)
        drawline(im,p,q,pattern="solid",color=col,thickness=edgesize*(1+2*bdy));
        drawline(im,p,q,pattern="solid",color="black",thickness=edgesize);
    end proc;

    drawface := proc(im,p,q,r,edgesize,col)
        drawpoly(im,[p,q,r,p],thickness=edgesize,fill_pattern="solid",fill_color=col,color="black");
    end proc;

    drawplex0 := proc(im,X,S,vertsize,edgesize,cmap)
        sigl := [seq(op(X[k]),k=[2,1,0])];
        cl := [seq(X:-f(sig),sig=sigl)];
        N := nops(sigl);
        ord := sort(cl,`>`,output=permutation);
        sigl,cl := sigl[ord],cl[ord];
        c0,c1 := min(cl),max(cl);
        for i from 1 to N do
            sig,a := sigl[i],cl[i];
            l := nops(sig);
            pl := [seq([S[i,1],S[i,2]],i=sig)];
            col := cmap((a-c0)/(c1-c0));
            if(l=1) then
                drawvert(im,pl[1],vertsize);
            elif(l=2) then
                drawedge(im,pl[1],pl[2],edgesize,1,col);
            elif(l=3) then
                drawface(im,pl[1],pl[2],pl[3],edgesize,col);
                drawedge(im,pl[1],pl[2],edgesize,1,col);
                drawedge(im,pl[2],pl[3],edgesize,1,col);
                drawedge(im,pl[1],pl[3],edgesize,1,col);
                drawvert(im,pl[1],vertsize);
                drawvert(im,pl[2],vertsize);
                drawvert(im,pl[3],vertsize);
            end if;
        end do;
    end proc;

#draw a simplicial complex
    drawplex := module()
    option object;
    export draw,vertsize,edgesize,getcolor,setcolor,cmap,init;
    local ModuleApply,ModulePrint;
        ModulePrint::static := proc()
            return nprintf("draws a complex");
        end proc;
        draw::static := proc(X,S,im)
            if(whattype(im)<>'ImageRange') then
                im1 := imrng(args[3..nargs]);
                draw(X,S,im1);
                im1:-draw();
                return im1;
            end if;
            drawplex0(im,X,S,vertsize,edgesize,cmap);
        end proc;
        ModuleApply::static := draw;
        init::static := proc()
            vertsize,edgesize,col := args;
            setcolor(col);
        end proc;
        getcolor::static := proc()
            return cmap;
        end proc;
        setcolor::static := proc(col)
            cmap := colormap(col);
            return;
        end proc;
    end module;

    drawplex:-init(8,2,"white");

end module;
