fixed an issue prevent label positions from updating properly

This commit is contained in:
nathan 2020-12-07 16:30:49 -08:00
parent d29a1e04e4
commit e9372475c9
5 changed files with 117 additions and 83 deletions

View file

@ -49,6 +49,8 @@ Aircraft::Aircraft(uint32_t addr) {
lon = 0; lon = 0;
lat = 0; lat = 0;
next = NULL;
} }

View file

@ -40,7 +40,7 @@ public:
uint32_t addr; // ICAO address uint32_t addr; // ICAO address
char flight[16]; // Flight number char flight[16]; // Flight number
unsigned char signalLevel[8]; // Last 8 Signal Amplitudes unsigned char signalLevel[8]; // Last 8 Signal Amplitudes
double messageRate; float messageRate;
int altitude; // Altitude int altitude; // Altitude
int speed; // Velocity int speed; // Velocity
int track; // Angle of flight int track; // Angle of flight
@ -48,7 +48,7 @@ public:
time_t seen; // Time at which the last packet was received time_t seen; // Time at which the last packet was received
time_t seenLatLon; // Time at which the last packet was received time_t seenLatLon; // Time at which the last packet was received
time_t prev_seen; time_t prev_seen;
double lat, lon; // Coordinated obtained from CPR encoded data float lat, lon; // Coordinated obtained from CPR encoded data
//history //history

View file

@ -57,6 +57,10 @@ void AircraftList::update(Modes *modes) {
p = p->next; p = p->next;
} }
//debug
//find(1)->live = 1;
while(a) { while(a) {
p = find(a->addr); p = find(a->addr);
@ -144,6 +148,10 @@ void AircraftList::update(Modes *modes) {
AircraftList::AircraftList() { AircraftList::AircraftList() {
head = nullptr; head = nullptr;
// //debug aircraft attached to mouse
// head = new Aircraft(1);
// memcpy(head->flight, "mouse", sizeof("mouse"));
} }
AircraftList::~AircraftList() { AircraftList::~AircraftList() {

176
View.cpp
View file

@ -874,6 +874,12 @@ void View::drawSignalMarks(Aircraft *p, int x, int y) {
void View::drawPlaneText(Aircraft *p) { void View::drawPlaneText(Aircraft *p) {
//don't draw first time
if(p->x == 0) {
return;
}
int maxCharCount = 0; int maxCharCount = 0;
int currentCharCount; int currentCharCount;
@ -963,6 +969,7 @@ void View::drawSelectedAircraftText(Aircraft *p) {
return; return;
} }
int x = p->cx - 20; int x = p->cx - 20;
int y = p->cy + 22; int y = p->cy + 22;
@ -1016,16 +1023,34 @@ void View::drawSelectedAircraftText(Aircraft *p) {
} }
} }
void View::resolveLabelConflicts() { float View::resolveLabelConflicts() {
Aircraft *p = appData->aircraftList.head; float label_force = 0.001f;
float icon_force = 0.001f;
float label_force = 0.01f; float boundary_force = 0.001f;
float plane_force = 0.01f;
float damping_force = 0.95f; float damping_force = 0.95f;
float spring_force = 0.02f; float spring_force = 0.001f;
float spring_length = 10.0f; float spring_length = 10.0f;
float maxV = 0.0f;
Aircraft *p = appData->aircraftList.head;
while(p) { while(p) {
p->ddox = 0;
p->ddoy = 0;
p = p->next;
}
p = appData->aircraftList.head;
while(p) {
//don't update on first run
if(p->x == 0) {
p = p->next;
continue;
}
Aircraft *check_p = appData->aircraftList.head; Aircraft *check_p = appData->aircraftList.head;
@ -1034,13 +1059,6 @@ void View::resolveLabelConflicts() {
int p_top = p->y - 10 * screen_uiscale; int p_top = p->y - 10 * screen_uiscale;
int p_bottom = p->y + p->h + 10 * screen_uiscale; int p_bottom = p->y + p->h + 10 * screen_uiscale;
//debug box
//rectangleRGBA(renderer, p->x, p->y, p->x + p->w, p->y + p->h, 255,0,0, SDL_ALPHA_OPAQUE);
//lineRGBA(renderer, p->cx, p->cy, p->x, p->y, 0,255,0, SDL_ALPHA_OPAQUE);
p->ddox = 0;
p->ddoy = 0;
float o_mag = sqrt(p->ox*p->ox + p->oy*p->oy); float o_mag = sqrt(p->ox*p->ox + p->oy*p->oy);
//spring back to origin //spring back to origin
@ -1053,19 +1071,19 @@ void View::resolveLabelConflicts() {
// // //screen edge // // //screen edge
if(p_left < 10 * screen_uiscale) { if(p_left < 10 * screen_uiscale) {
p->ox += (float)(10 * screen_uiscale - p_left); p->ddox += boundary_force * (float)(10 * screen_uiscale - p_left);
} }
if(p_right > (screen_width - 10 * screen_uiscale)) { if(p_right > (screen_width - 10 * screen_uiscale)) {
p->ox -= (float)(p_right - (screen_width - 10 * screen_uiscale)); p->ddox -= boundary_force * (float)(p_right - (screen_width - 10 * screen_uiscale));
} }
if(p_top < 10 * screen_uiscale) { if(p_top < 10 * screen_uiscale) {
p->oy += (float)(10 * screen_uiscale - p_top); p->ddoy += boundary_force * (float)(10 * screen_uiscale - p_top);
} }
if(p_bottom > (screen_height - 10 * screen_uiscale)) { if(p_bottom > (screen_height - 10 * screen_uiscale)) {
p->oy -= (float)(p_bottom - (screen_height - 10 * screen_uiscale)); p->ddoy -= boundary_force * (float)(p_bottom - (screen_height - 10 * screen_uiscale));
} }
p->pressure = 0; p->pressure = 0;
@ -1073,17 +1091,14 @@ void View::resolveLabelConflicts() {
//check against other labels //check against other labels
while(check_p) { while(check_p) {
int check_left = check_p->x - 5 * screen_uiscale;
int check_right = check_p->x + check_p->w + 5 * screen_uiscale;
int check_top = check_p->y - 5 * screen_uiscale;
int check_bottom = check_p->y + check_p->h + 5 * screen_uiscale;
if(check_p->addr != p->addr) { if(check_p->addr != p->addr) {
int check_left = check_p->x - 5 * screen_uiscale;
int check_right = check_p->x + check_p->w + 5 * screen_uiscale;
int check_top = check_p->y - 5 * screen_uiscale;
int check_bottom = check_p->y + check_p->h + 5 * screen_uiscale;
p->pressure += 1.0f / ((check_p->cx - p->cx) * (check_p->cx - p->cx) + (check_p->cy - p->cy) * (check_p->cy - p->cy)); p->pressure += 1.0f / ((check_p->cx - p->cx) * (check_p->cx - p->cx) + (check_p->cy - p->cy) * (check_p->cy - p->cy));
//if(check_left > (p_right + 10) || check_right < (p_left - 10)) { //if(check_left > (p_right + 10) || check_right < (p_left - 10)) {
if(check_left > p_right || check_right < p_left) { if(check_left > p_right || check_right < p_left) {
check_p = check_p -> next; check_p = check_p -> next;
@ -1098,72 +1113,48 @@ void View::resolveLabelConflicts() {
//left collision //left collision
if(check_left > p_left && check_left < p_right) { if(check_left > p_left && check_left < p_right) {
check_p->ddox -= label_force * (float)(check_left - p_right); //check_p->ddox -= label_force * (float)(check_left - p_right);
p->ddox += label_force * (float)(check_left - p_right);
} }
//right collision //right collision
if(check_right > p_left && check_right < p_right) { if(check_right > p_left && check_right < p_right) {
check_p->ddox -= label_force * (float)(check_right - p_left); //check_p->ddox -= label_force * (float)(check_right - p_left);
p->ddox += label_force * (float)(check_right - p_left);
} }
//top collision //top collision
if(check_top > p_top && check_top < p_bottom) { if(check_top > p_top && check_top < p_bottom) {
check_p->ddoy -= label_force * (float)(check_top - p_bottom); //check_p->ddoy -= label_force * (float)(check_top - p_bottom);
p->ddoy += label_force * (float)(check_top - p_bottom);
} }
//bottom collision //bottom collision
if(check_bottom > p_top && check_bottom < p_bottom) { if(check_bottom > p_top && check_bottom < p_bottom) {
check_p->ddoy -= label_force * (float)(check_bottom - p_top); //check_p->ddoy -= label_force * (float)(check_bottom - p_top);
p->ddoy += label_force * (float)(check_bottom - p_top);
} }
} }
check_p = check_p -> next;
}
check_p = appData->aircraftList.head; float icon_x = (float)check_p->x;
float icon_y = (float)check_p->y;
//check against plane icons (include self) float boxmid_x = (float)(check_left + check_right) / 2.0f;
float boxmid_y = (float)(check_top + check_bottom) / 2.0f;
p_left = p->x - 5 * screen_uiscale; //check against icons
p_right = p->x + 5 * screen_uiscale; if(icon_x > p_right + 10 * screen_uiscale || icon_x < p_left - 10 * screen_uiscale) {
p_top = p->y - 5 * screen_uiscale;
p_bottom = p->y + 5 * screen_uiscale;
while(check_p) {
int check_left = check_p->x - 5 * screen_uiscale;
int check_right = check_p->x + check_p->w + 5 * screen_uiscale;
int check_top = check_p->y - 5 * screen_uiscale;
int check_bottom = check_p->y + check_p->h + 5 * screen_uiscale;
if(check_left > p_right || check_right < p_left) {
check_p = check_p -> next; check_p = check_p -> next;
continue; continue;
} }
if(check_top > p_bottom || check_bottom < p_top) { if(icon_y > p_bottom + 10 * screen_uiscale || icon_y < p_top - 10 * screen_uiscale) {
check_p = check_p -> next; check_p = check_p -> next;
continue; continue;
} }
//left collision p->ddox += icon_force * (boxmid_x - icon_x);
if(check_left > p_left && check_left < p_right) { p->ddoy += icon_force * (boxmid_y - icon_y);
check_p->ddox -= plane_force * (float)(check_left - p_right);
}
//right collision
if(check_right > p_left && check_right < p_right) {
check_p->ddox -= plane_force * (float)(check_right - p_left);
}
//top collision
if(check_top > p_top && check_top < p_bottom) {
check_p->ddoy -= plane_force * (float)(check_top - p_bottom);
}
//bottom collision
if(check_bottom > p_top && check_bottom < p_bottom) {
check_p->ddoy -= plane_force * (float)(check_bottom - p_top);
}
check_p = check_p -> next; check_p = check_p -> next;
} }
@ -1176,6 +1167,16 @@ void View::resolveLabelConflicts() {
p = appData->aircraftList.head; p = appData->aircraftList.head;
while(p) { while(p) {
// if this is the first update don't update based on physics
if(p->x == 0) {
p->x = p->cx;
p->y = p->cy + 20*screen_uiscale;
p = p->next;
continue;
}
p->dox += p->ddox; p->dox += p->ddox;
p->doy += p->ddoy; p->doy += p->ddoy;
@ -1190,11 +1191,11 @@ void View::resolveLabelConflicts() {
p->doy = sign(p->doy) * 10.0f; p->doy = sign(p->doy) * 10.0f;
} }
if(fabs(p->dox) < 1.0f) { if(fabs(p->dox) < 0.01f) {
p->dox = 0; p->dox = 0;
} }
if(fabs(p->doy) < 1.0f) { if(fabs(p->doy) < 0.01f) {
p->doy = 0; p->doy = 0;
} }
@ -1204,8 +1205,25 @@ void View::resolveLabelConflicts() {
p->x = p->cx + (int)round(p->ox); p->x = p->cx + (int)round(p->ox);
p->y = p->cy + (int)round(p->oy); p->y = p->cy + (int)round(p->oy);
if(fabs(p->dox) > maxV) {
maxV = fabs(p->dox);
}
if(fabs(p->doy) > maxV) {
maxV = fabs(p->doy);
}
//debug box
// rectangleRGBA(renderer, p->x, p->y, p->x + p->w, p->y + p->h, 255,0,0, SDL_ALPHA_OPAQUE);
// lineRGBA(renderer, p->cx, p->cy, p->x, p->y, 0,255,0, SDL_ALPHA_OPAQUE);
// lineRGBA(renderer,p->x, p->y, p->x + p->ddox, p->y+p->ddoy, 255,0,255,255);
// lineRGBA(renderer,p->x, p->y, p->x + p->dox, p->y+p->doy, 0,255,255,255);
p = p->next; p = p->next;
} }
return maxV;
} }
@ -1284,9 +1302,6 @@ void View::drawPlanes() {
} else { } else {
drawPlaneIcon(usex, usey, p->track, planeColor); drawPlaneIcon(usex, usey, p->track, planeColor);
p->x += usex - p->cx;
p->y += usey - p->cy;
p->cx = usex; p->cx = usex;
p->cy = usey; p->cy = usey;
} }
@ -1499,6 +1514,13 @@ void View::registerMouseMove(int x, int y) {
mouseMovedTime = now(); mouseMovedTime = now();
this->mousex = x; this->mousex = x;
this->mousey = y; this->mousey = y;
// aircraft debug
// Aircraft *mouse = appData->aircraftList.find(1);
// if(mouse != NULL) {
// latLonFromScreenCoords(&(mouse->lat), &(mouse->lon), x, screen_height-y);
// mouse->live = 1;
// }
} }
// //
@ -1511,8 +1533,10 @@ void View::draw() {
moveMapToTarget(); moveMapToTarget();
zoomMapToTarget(); zoomMapToTarget();
for(int i = 0; i <8; i++) { for(int i = 0; i < 8; i++) {
resolveLabelConflicts(); if(resolveLabelConflicts() < 0.001f) {
break;
}
} }
lineCount = 0; lineCount = 0;
@ -1524,9 +1548,9 @@ void View::draw() {
//drawMouse(); //drawMouse();
drawClick(); drawClick();
//char fps[60] = " "; char fps[60] = " ";
//snprintf(fps,40," %d lines @ %.1ffps", lineCount, 1000.0 / elapsed(lastFrameTime)); snprintf(fps,40," %d lines @ %.1ffps", lineCount, 1000.0 / elapsed(lastFrameTime));
//drawStringBG(fps, 0,0, mapFont, style.subLabelColor, style.backgroundColor); drawStringBG(fps, 0,0, mapFont, style.subLabelColor, style.backgroundColor);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);

2
View.h
View file

@ -192,7 +192,7 @@ class View {
void drawSignalMarks(Aircraft *p, int x, int y); void drawSignalMarks(Aircraft *p, int x, int y);
void drawPlaneText(Aircraft *p); void drawPlaneText(Aircraft *p);
void drawSelectedAircraftText(Aircraft *p); void drawSelectedAircraftText(Aircraft *p);
void resolveLabelConflicts(); float resolveLabelConflicts();
void drawPlanes(); void drawPlanes();
void animateCenterAbsolute(float x, float y); void animateCenterAbsolute(float x, float y);
void moveCenterAbsolute(float x, float y); void moveCenterAbsolute(float x, float y);