Did you know that it takes all the Graphviz engines at least 4 points to define an edge, even a straight edge? (splineType | Graphviz)
Not being a mathematician, I don’t know much (anything) about cubic B-spline, so I decided to let Graphviz show me how these splines are defined. I wrote a small GVPR program (what else) to add a point-shaped node on top of every point included in an edge pos for any graph.
What did I learn?
- After staring at hundreds of augmented graphs, splines start to make some sense
- A straight line spline is 4 (or more) points, that all fall on a straight line (algebraically) (poor definition)
- circo & twopi use very different routines to define their edges (see below)
- with some care, you can tweak the points that define an edge
The program:
//
// show the points that define an edge (all edges are splines)
//
BEGIN{
int i, cnt, c=0, maxc, pointNum=0;
string st, Color="", colors[int], tok[int];
graph_t Root;
string nextColor(){
string C;
C="#" + colors[c++];
if (c==maxc)c=0;
return(C);
}
void addPt(string Pos){
string pname, nameStr="__splinePt__";
node_t pn;
pname=nameStr + (string)pointNum;
pointNum++;
pn=node(Root,pname);
pn.pos=Pos;
pn.shape="point";
pn.color="red"; // if you want all points to be red
pn.color=Color; // multi-colored
pn.width=.05;
pn.label="";
}
}
BEG_G{
Root=$G;
maxc=split("CC0000 CC6600 CC0066 00BB66 00BB00 000099 770000 007700 000077",colors);
}
E{
Color=nextColor();
cnt=tokens($.pos, tok);
for (i=0;i<cnt;i++){
st=gsub(tok[i],"[ ]"); // remove tabs and spaces !!
if (st=="[es]*"){
st=substr(st,2);
}
addPt(st);
}
}
Command line (Linux):
dot/circo/neato/twopi -Tdot myfile.gv | gvpr -cf showSplinePoints.gvpr | neato -n2 -Tpng >myfile.png
Some examples:
twopi did this! (graph below)