#include <math.h>
#include <ucw/lib.h>
-#include <ucw/conf.h>
#include <ucw/gary.h>
#include <ucw/mempool.h>
DIR_BWD,
};
+// List of lines (osm_ways) making up a logical line
struct longline
{
uns id;
osm_id_t id;
struct osm_node *o;
struct graph_edge **edges;
- int num;
+ int num; // Used for debug, mostly debug prints
};
struct graph_edge
{
- osm_id_t id;
- double length;
+ osm_id_t id; // Actual line (osm_way) ID
+ struct sym_line *line;
color_t color;
- int visited;
- struct graph_edge *prev;
- struct graph_edge *next;
- struct graph_node *n1;
- struct graph_node *n2;
- uns longline;
struct symbol *label;
- struct sym_line *line;
- z_index_t zindex;
- enum edge_dir dir;
- struct graph_node *anode;
- struct graph_node *bnode; // DEBUG PRINT
- int num; // DEBUG
+ z_index_t zindex; // z-index of label
+ double length;
+ int visited; // Iteration when line was last visited with BFS
+ uns longline; // Logical line this line was made part of
+ enum edge_dir dir; // Direction with respect to logical line, used by BFS
+ struct graph_node *n1; // Actual line endpoints
+ struct graph_node *n2;
+ struct graph_edge *prev; // Neighbouring lines in logical line
+ struct graph_edge *next;
+ int num; // Used for debug
};
#define HASH_NODE struct graph_node
static struct graph_edge **bfs_queue;
-static double conf_max_section_length = 80, conf_max_section_overlay = 10;
-
-static struct cf_section lines_cf = {
- CF_ITEMS {
- CF_DOUBLE("MaxSectionLenght", &conf_max_section_length),
- CF_DOUBLE("MaxSectionOverlay", &conf_max_section_overlay),
- CF_END
- }
-};
-
-void lines_conf(void)
-{
- cf_declare_section("Labelling", &lines_cf, 0);
-}
+double conf_max_section_length = 80, conf_max_section_overlay = 10;
static struct request_line *make_new_line(void)
{
struct request_section *rls = GARY_PUSH(rl->sections);
rls->request.ind = num_requests++;
rls->request.type = REQUEST_SECTION;
- rls->num_segments = 0;
GARY_INIT(rls->segments, 0);
GARY_INIT(rls->request.variants, 0);
static struct request_segment *make_new_segment(struct request_section *rls, struct symbol *sym)
{
struct request_segment *rs = GARY_PUSH(rls->segments);
- rls->num_segments++;
rs->request.ind = num_requests++;
rs->request.type = REQUEST_SEGMENT;
if (((other->n1->id == node->id) || (other->n2->id == node->id)) &&
(e->label) && (other->label) &&
- (e->label->type == SYMBOLIZER_TEXT) && (other->label->type == SYMBOLIZER_TEXT) &&
- (((struct sym_text *) e->label)->text == ((struct sym_text *) other->label)->text))
+ (sym_look_same(e->label, other->label)))
{
if (! candidate || (other->length > candidate->length))
candidate = other;
*new = *e;
e->next = new;
- switch (e->label->type)
- {
- case SYMBOLIZER_TEXT:
- new->label = xmalloc(sizeof(struct sym_text));
- *((struct sym_text *) new->label) = *((struct sym_text *) e->label);
- break;
- default:
- ;
- }
+ new->label = sym_copy(e->label);
struct osm_node *n1 = e->n1->o;
struct osm_node *n2 = e->n2->o;
return;
}
+ // BEWARE: This creates new OSM object and modifies original data
+ // FIXME: Though this doesn't crash anything now, it could become deathly curse one day
struct osm_node *n11 = xmalloc(sizeof(struct osm_node));
struct graph_node *gn = xmalloc(sizeof(struct graph_node));
gn->o = n11;
rs->x2 = e->n2->o->x;
rs->y2 = e->n2->o->y;
- rs->slope = (rs->y2 - rs->y1) / (rs->x2 - rs->x1);
- ((struct sym_text *) rs->label)->rotate = convert_to_deg(atan(rs->slope));
+ if (fabs(rs->x2 - rs->x1) > 0.01)
+ {
+ rs->slope = (rs->y2 - rs->y1) / (rs->x2 - rs->x1);
+ // This works a little bit magically :)
+ // It's possible not to care about quadrants as it "just works" as expected
+ ((struct sym_text *) rs->label)->rotate = convert_to_deg(atan(rs->slope));
+ }
+ else
+ {
+ rs->slope = 142; // Magic!
+ ((struct sym_text *) rs->label)->rotate = 1;
+ }
struct variant *v = GARY_PUSH(rs->request.variants);
make_bitmap(v, rs->label);
e = e->next;
}
- if (request->sections[0].num_segments == 0)
+ if (GARY_SIZE(request->sections[0].segments) == 0)
{
DEBUG(dbg_segments, VERBOSITY_INDIVIDUAL, "WARNING: Longline without any segment, skipped\n");