# $nodes[]{X}
# $nodes[]{Y}
# $nodes[]{A}
+# $nodes[]{NodeNum}
# $nodes[]{LayerMin}
# $nodes[]{LayerMax}
# $nodes[]{"Edges$back"}[] = [ \$edges[], $far ]
return ($node,$back);
}
}
- $node= { X => $x, Y => $y, A => $a,
+ $node= { X => $x, Y => $y, A => $a, NodeNum => scalar(@nodes),
LayerMin => $l, LayerMax => $l, LineInfo => $lni };
$back= $isdest;
push @nodes, $node;
sub pr ($$) {
my ($kind,$ref) = @_;
- $ref= "$ref";
- $ref =~ y/()/__/;
- return lc $ref.lc $kind;
+ my ($n);
+ $n= $ref->{"${kind}Num"};
+ return sprintf "%s%d", lc($kind), $n;
}
sub pr_edgeend ($) {
my ($node, $edge, $i, $side, $sideedges);
my ($end, $endnum, $sss, $reverse, $nodeside, $connectnum, $j, $edgeend);
my ($segname, $segment, $movfeats, $movfeat, $delim);
- my ($movfeatpos, $movpos);
+ my ($movfeatpos, $movpos, $maxedgenum);
o("\n");
o("#include \"graph-data.h\"\n");
for $node (@nodes) { o("static Node ",pr(Node,$node),";\n"); }
o("\n }\n};\n");
}
o("\n");
+ $maxedgenum=-1;
for ($i=0; $i<@edges; $i++) {
$edge= $edges[$i];
o("static Edge ",pr(Edge,$edge),"= { $edge->{EdgeNum},\n");
+ if ($edge->{EdgeNum} > $maxedgenum) {
+ $maxedgenum= $edge->{EdgeNum};
+ }
o(" $edge->{Dist}, ");
$sss= $edge->{SubSegSpec};
+ o("/* $sss */ ");
$reverse= !!($sss =~ s/^\-//);
- if ($reverse) { o("/*reverse*/ "); }
$sss =~ m,^(\w*)/(([A-Za-z]*)(\d*))$, or die;
($segname, $movfeatpos, $movfeat, $movpos) = ($1,$2,$3,$4);
o("&movfeats_${segname}","[",
'&'.pr_edgeend($sideedges->[$connectnum-1]) : '0'),
", ".($connectnum < $#$sideedges ?
'&'.pr_edgeend($sideedges->[$connectnum+1]) : '0'));
- o(",\n &".pr(Edge,$edge),", $end, ",
+ o(",\n &".pr(Edge,$edge),", $endnum, ",
"&".pr(Node,$node).".sides[$side]");
o(" }");
$delim= ',';
(@nodes ? '&'.pr(Node,$nodes[0]) : 0), ", ",
(@nodes ? '&'.pr(Node,$nodes[$#nodes]) : 0),
" };\n");
+ o("int next_nodenum= ".scalar(@nodes).";\n".
+ "int next_edgenum= ".($maxedgenum+1).";\n");
}
o("/*autogenerated - do not edit*/\n\n");
sub line ($$$) {
my ($from,$to,$len) = @_;
- parametric_segment(0.0, 1.0, abs($len) + 1e-6, undef, sub {
+ if ($len < 0) {
+ ($from,$to,$len) = ($to,$from,-$len);
+ }
+ parametric_segment(0.0, 1.0, $len + 1e-6, undef, sub {
ev_lincomb({}, $from, $to, $param);
});
}
/*---------- general graph-manipulation and printing stuff ----------*/
static void trace_node(Node *node) {
- trace("n%p",node);
+ trace("node%d",node->nodenum);
}
static void trace_edgeend(EdgeEnd *edge) {
- trace("n%p%c",edge->node->node,"OI"[edge->node->side]);
+ trace("edge%d %c",edge->edge->edgenum,"OI"[edge->end]);
}
static EdgeEnd *edgeend_otherend(EdgeEnd *thisend) {
trace("consistency check (%s) ...\n",why);
for (node=all_nodes.head; node; node=node->next) {
- trace(" consistency node %p\n", node);
+ trace(" consistency node%d\n", node->nodenum);
LIST_CHECKNODE(all_nodes,node);
for (side=0; side<2; side++) {
- trace(" consistency node %p%c\n", node, "OI"[side]);
+ trace(" consistency node%d %c\n", node->nodenum, "OI"[side]);
assert(node->sides[side].node == node);
assert(node->sides[side].side == side);
for (edgeend=node->sides[side].head; edgeend; edgeend=edgeend->next) {
- trace(" consistency node %p%c ", node, "OI"[side]);
+ trace(" consistency node%d %c ", node->nodenum, "OI"[side]);
trace_edgeend(edgeend);
trace("\n");
search_edone < edone + used_edone && search_edone->edge != edge;
search_edone++);
if (search_edone >= edone + used_edone) {
- search_edone->edge= 0;
+ search_edone->edge= edge;
search_edone->endsdone= 0;
used_edone++;
}
}
for (search_edone= edone;
search_edone < edone + used_edone;
- search_edone++)
+ search_edone++) {
+ trace("consistency edge%d count=%d\n",
+ search_edone->edge, search_edone->endsdone);
assert(search_edone->endsdone == 2);
+ }
trace("consistency check (%s) ok\n",why);
}