diff options
| -rw-r--r-- | src/GipfelWidget.cxx | 20 | ||||
| -rw-r--r-- | src/Hill.H | 7 | ||||
| -rw-r--r-- | src/Hill.cxx | 19 | 
3 files changed, 41 insertions, 5 deletions
| diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index c72cb39..f0403cf 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -344,6 +344,7 @@ GipfelWidget::set_labels(Hills *v) {  	for (int i = 0; i < v->get_num(); i++) {  		Hill *m = v->get(i); +		Hills colliding;  		if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT))  			continue; @@ -363,13 +364,22 @@ GipfelWidget::set_labels(Hills *v) {  			if (!show_hidden && (n->flags & Hill::HIDDEN))  				continue; +			if (overlap(m->x, m->label_x, +					n->x - CROSS_SIZE, n->label_x + CROSS_SIZE)) +				colliding.add(n); +		} + +		colliding.sort_label_y(); + +		for (int j = 0; j < colliding.get_num(); j++) { +			Hill *n = colliding.get(j); +  			// Check for overlapping labels and  			// overlaps between labels and peak markers -			if ((overlap(m->x, m->label_x, n->x, n->label_x) && -					overlap(m->y + m->label_y - height, height, -						n->y + n->label_y - height, height)) || -				(overlap(m->x, m->label_x, n->x - 2, 4) && -				 overlap(m->y + m->label_y - height, height, n->y - 2, 4))) { +			if (overlap(m->y + m->label_y - height, height, +					n->y + n->label_y - height, height) || +				overlap(m->y + m->label_y - height, +					height, n->y - CROSS_SIZE, 2 * CROSS_SIZE)) {  				m->label_y = (int) rint(n->y + n->label_y - m->y - height - 2);  			} @@ -41,6 +41,12 @@ class Hills {  		Hill **m;  	public: +		typedef enum { +			SORT_PHI, +			SORT_NAME, +			SORT_LABEL_Y +		} SortType; +	  		Hills();  		Hills(const Hills *h);  		~Hills(); @@ -52,6 +58,7 @@ class Hills {  		void add(Hills *h);  		void sort_phi();  		void sort_name(); +		void sort_label_y();  		void sort();  		void clear();  		void clobber(); diff --git a/src/Hill.cxx b/src/Hill.cxx index f4ba112..9056d2f 100644 --- a/src/Hill.cxx +++ b/src/Hill.cxx @@ -225,6 +225,17 @@ comp_mountains_name(const void *n1, const void *n2) {  	}  } +static int +comp_mountains_label_y(const void *n1, const void *n2) { +	Hill *m1 = *(Hill **)n1; +	Hill *m2 = *(Hill **)n2; + +	if (m1 && m2) +		return (m2->y + m2->label_y) - (m1->y + m1->label_y); +	else +		return 0; +} +  void  Hills::sort() {  	if (!m) @@ -250,6 +261,14 @@ Hills::sort_name() {  }  void +Hills::sort_label_y() { +	if (!m) +		return; + +	qsort(m, num, sizeof(Hill *), comp_mountains_label_y); +} + +void  Hills::clear() {  	if (m) {  		free(m); | 
