X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=blobdiff_plain;f=bgl.cpp;h=c35110b0682be288013d45eca339eb59f1a3f503;hp=28c6ee6fe45816724bf5148d931f40ea3a40ef70;hb=9e8860ae32184285e451568d39df79baf7f44aff;hpb=134d36d51a86567bba2a9cfe1b209c4bc7d1a7f0 diff --git a/bgl.cpp b/bgl.cpp index 28c6ee6..c35110b 100644 --- a/bgl.cpp +++ b/bgl.cpp @@ -47,8 +47,6 @@ extern "C" { #define VMASK (YMASK|XMASK) #define ESHIFT (YBITS+XBITS) -class Graph { }; // this is a dummy as our graph has no actual representation - using namespace boost; /* @@ -98,13 +96,15 @@ class OutEdgeIterator : } static int voe_min(int _v) { return (_v & YMASK) ? 2 : 3; } - static int voe_max(int _v) { return (~_v & YMASK) ? V6 : 4; } - static int voe_degree(int _v) { return (_v & YMASK | ~_v & YMASK) ? 4 : V6; } + static int voe_max(int _v) { return (_v & YMASK)==(Y-1) ? V6 : 4; } + static int voe_degree(int _v) { return RIM_VERTEX_P(_v) ? 4 : V6; } }; typedef counting_iterator VertexIterator; namespace boost { + class Graph { }; // this is a dummy as our graph has no actual representation + // We make Graph a model of various BGL Graph concepts. // This mainly means that graph_traits has lots of stuff. @@ -115,6 +115,7 @@ namespace boost { public virtual vertex_list_graph_tag, public virtual edge_list_graph_tag { }; + template<> struct graph_traits { // Concept Graph: typedef int vertex_descriptor; /* vertex number, -1 => none */ @@ -152,7 +153,8 @@ namespace boost { } // Concept VertexListGraph: - inline std::pair vertices(const Graph&) { + inline + std::pair vertices(const Graph&) { return std::make_pair(VertexIterator(0), VertexIterator(N)); } inline unsigned num_vertices(const Graph&) { return N; } @@ -168,7 +170,34 @@ static void single_source_shortest_paths(int v1, vertex_index_map(identity_property_map()). distance_map(vertex_distances)); } - + +static int distances[N][N]; + +void graph_layout_prepare() { + Graph g; + int v1, v2; + + FOR_VERTEX(v1) { + int *d= distances[v1]; + FOR_VERTEX(v2) d[v2]= -1; + d[v1]= 0; + breadth_first_search + (g, v1, + vertex_index_map(identity_property_map()). + visitor(make_bfs_visitor(record_distances(d,on_tree_edge())))); + printf("%02x:",v1); + FOR_VERTEX(v2) printf(" %02x:%d",v2,d[v2]); + putchar('\n'); + } + printf("---\n"); + FOR_VERTEX(v1) { + int *d= distances[v1]; + printf("%02x:",v1); + FOR_VERTEX(v2) printf(" %02x:%d",v2,d[v2]); + putchar('\n'); + } +} + double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { /* For each (vi,vj) computes shortest path s_ij = |vi..vj| * along edges, and actual distance d_ij = |vi-vj|. @@ -187,33 +216,48 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { * divisions, to avoid division by zero.) */ static const double d2_epsilon= 1e-6; - - double edge_weights[N*V6], vertex_distances[N], total_cost=0; - int v1,v2,e,f; - FOR_VERTEX(v1) - FOR_VEDGE_X(v1,e,v2, - f= v1 | e << ESHIFT, - edge_weights[f]= NAN) - edge_weights[f]= hypotD(v[v1], v[v2]); + // double edge_weights[V6<=0); + + double s= dist * meanedgelength * 0.03; + + double enoughdistance= d - s; + if (enoughdistance > 1e-6) continue; + + /* energy = 1/2 stiffness deviation^2 + * where stiffness = 1/d + */ + + double cost= pow(enoughdistance,4); + + //double s2= s*s + d2_epsilon; + //double sd2= s2 / d2; + //double cost_contrib= a1*a2 * (sd2 - 1) / (d2*d2); + //double cost_contrib= sd2; + + printf("layout %03x..%03x dist=%d mean=%g s=%g d=%g enough=%g" + " cost+=%g\n", v1,v2, dist, meanedgelength, + s,d, enoughdistance, cost); + total_cost += cost; } } return total_cost;