tweaking label hysteresis approach

This commit is contained in:
nathan 2020-12-10 23:03:28 -08:00
parent 6dbdaca8d0
commit c3bfbe4ff0
3 changed files with 40 additions and 26 deletions

View file

@ -52,7 +52,8 @@ Aircraft::Aircraft(uint32_t addr) {
lon = 0;
lat = 0;
drawLevel = 0;
labelLevel = 0;
dlabelLevel = 0.0f;
next = NULL;
}

View file

@ -71,7 +71,8 @@ public:
int x, y, cx, cy, w, h;
float ox, oy, dox, doy, ddox, ddoy;
float drawLevel;
int labelLevel;
float dlabelLevel;
/// methods

View file

@ -895,6 +895,12 @@ void View::drawPlaneText(Aircraft *p) {
if(p->w != 0) {
SDL_Color boxColor = style.labelLineColor;
if(p == selectedAircraft) {
boxColor = style.selectedColor;
}
int tick = 4;
int anchor_x, anchor_y, exit_x, exit_y;
@ -929,25 +935,22 @@ void View::drawPlaneText(Aircraft *p) {
static_cast<Sint16>(exit_y),
static_cast<Sint16>(anchor_y)};
bezierRGBA(renderer,vx,vy,3,2,style.labelLineColor.r,style.labelLineColor.g,style.labelLineColor.b,SDL_ALPHA_OPAQUE);
// lineRGBA(renderer, p->cx, p->cy, anchor_x, anchor_y, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
bezierRGBA(renderer, vx, vy, 3, 2, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
// boxRGBA(renderer, p->x, p->y - margin, p->x + p->w, p->y + p->h + margin, 0, 0, 0, 255);
// rectangleRGBA(renderer, p->x, p->y - margin, p->x + p->w, p->y + p->h + margin, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x,p->y - margin, p->x + tick, p->y - margin, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x,p->y - margin, p->x, p->y - margin + tick, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x,p->y - margin, p->x + tick, p->y - margin, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x,p->y - margin, p->x, p->y - margin + tick, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x + p->w, p->y - margin, p->x + p->w - tick, p->y - margin, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x + p->w, p->y - margin, p->x + p->w, p->y + margin + tick, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x + p->w, p->y - margin, p->x + p->w - tick, p->y - margin, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x + p->w, p->y - margin, p->x + p->w, p->y - margin + tick, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x, p->y + p->h + margin, p->x + tick, p->y + p->h + margin, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x, p->y + p->h + margin, p->x, p->y + p->h + margin - tick, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x, p->y + p->h + margin, p->x + tick, p->y + p->h + margin, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x, p->y + p->h + margin, p->x, p->y + p->h + margin - tick, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x + p->w, p->y + p->h + margin,p->x + p->w - tick, p->y + p->h + margin, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x + p->w, p->y + p->h + margin,p->x + p->w, p->y + p->h + margin - tick, style.labelLineColor.r, style.labelLineColor.g, style.labelLineColor.b,255);
lineRGBA(renderer, p->x + p->w, p->y + p->h + margin,p->x + p->w - tick, p->y + p->h + margin, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
lineRGBA(renderer, p->x + p->w, p->y + p->h + margin,p->x + p->w, p->y + p->h + margin - tick, boxColor.r, boxColor.g, boxColor.b, boxColor.a);
}
if(p->drawLevel < 2) {
if(p->labelLevel < 2 || p == selectedAircraft) {
// drawSignalMarks(p, p->x, p->y);
char flight[10] = "";
@ -961,7 +964,7 @@ void View::drawPlaneText(Aircraft *p) {
}
}
if(p->drawLevel < 1) {
if(p->labelLevel < 1 || p == selectedAircraft) {
char alt[10] = "";
if (metric) {
charCount = snprintf(alt,10," %dm", (int) (p->altitude / 3.2828));
@ -1103,7 +1106,7 @@ float View::resolveLabelConflicts() {
int collision_count = 0;
while(check_p) {
if(check_p->addr != p->addr) {
if(check_p->addr == p->addr) {
check_p = check_p -> next;
continue;
}
@ -1128,9 +1131,9 @@ float View::resolveLabelConflicts() {
float x_mag = std::max(0.0f,(target_length_x - fabs(offset_x)));
float y_mag = std::max(0.0f,(target_length_y - fabs(offset_y)));
if(x_mag > 0 || y_mag > 0) {
collision_count ++;
}
// if(x_mag > 0 || y_mag > 0) {
// collision_count ++;
// }
// stay at least label_dist away from other icons
@ -1168,13 +1171,22 @@ float View::resolveLabelConflicts() {
p->ddox += density_force * all_x / count;
p->ddoy += density_force * all_y / count;
//drawlevel hysteresis
//label drawlevel hysteresis
if((float)p->labelLevel < (float)collision_count / 4.0f) {
p->dlabelLevel += 0.002f;
float densityScale = 85.0f;
if(p->drawLevel < 0.6f * (float)collision_count / 4.0f) {
p->drawLevel += 0.1f;
} else if (p->drawLevel > 1.4f * (float)collision_count / 4.0f) {
p->drawLevel -= 0.1f;
if(p->dlabelLevel > 1.0f) {
p->labelLevel++;
p->dlabelLevel = 0;
}
} else if (p->labelLevel > (float)collision_count / 4.0f) {
p->dlabelLevel -= 0.002f;
if(p->dlabelLevel < 0.0f) {
p->labelLevel--;
p->dlabelLevel = 0;
}
}
p = p->next;