This is soaring.c in view mode; [Download] [Up]
/**************************************************************** * * * I C A O M a p - * * * * A n A v i a t i o n U t i l i t y * * * * * * Copyright (C) 1993, 1994 Martin Pauly * * * * N e x t V e r s i o n * * * * Copyright (C) 1994 Stefan Leuker & Oliver Meyer * * * * This file may be freely distributed only if it includes * * the above copyright notice. * * * ****************************************************************/ #import "soaring.h" char **routearray; char str_km[20]; OBJECT *turn1[MAXROUTES]; /* store suggested routes here */ OBJECT *turn2[MAXROUTES]; OBJECT *selected1, *selected2; /* waypoints of selected route */ int numberofroutes = 0; /* trim name to 30 chars */ char * trim(char *string) { static char temp[256]; int i; strcpy(temp, string); temp[30] = 0; while (strlen(temp) < 30) strcat(temp, " "); for (i = 0; i < strlen(temp); i++) if (temp[i] == '_') temp[i] = ' '; return temp; } /* check if triangle conforms to FAI rules */ int isFAITriangle(LOCATION a, LOCATION b, LOCATION c) { double totaldist, dist1, dist2, dist3, minside, maxside; int ok; ok = 1; dist1 = distance(a, b); dist2 = distance(b, c); dist3 = distance(c, a); totaldist = dist1 + dist2 + dist3; if (totaldist >= 500 / 1.852) minside = totaldist * 0.25; else minside = totaldist * 0.28; maxside = totaldist * 0.45; if ((dist1 < minside) || (dist2 < minside) || (dist3 < minside)) ok = 0; if ((dist1 > maxside) || (dist2 > maxside) || (dist3 > maxside)) ok = 0; return ok; } /* get object name and description string */ char * makedesc(OBJECT * object) { static char temp[256]; int i; if (object->type != O_WAYPOINT) sprintf(temp, "%s (%s)", object->name, objecttypestring(object->type)); else if (object->alias) sprintf(temp, "%s %s", object->name, object->alias); else sprintf(temp, "%s", object->name); for (i = 0; i < strlen(temp); i++) if (temp[i] == '_') temp[i] = ' '; return temp; } /* suggest triangle */ void suggest(int distkm) { int i, j, numberofturns; OBJECT *turns[1000]; /* possible waypoints */ double mindist, maxdist, minside, maxside; double totaldistance, tempdist; totaldistance = distkm / 1.852; /* NM */ if (currentroute[FROM] && totaldistance) /* don't try if no start point * specified */ { numberofturns = 0; /* * FAI triangle: each side must be at least 28% of the total distance, no * side may be longer then 45% of the total distance: */ mindist = totaldistance; maxdist = totaldistance + 8; /* 8 NM tolerance */ minside = mindist * 0.28; maxside = maxdist * 0.45; if (maxdist > 500 / 1.852) /* 500+ km: shortest side only needs to be 25 * % */ minside = mindist * 0.25; for (i = 0; i < db_objects; i++) { tempdist = distance(currentroute[FROM]->location, objectlist[i]->location); if ((tempdist >= minside) && (tempdist <= maxside)) if (((objectlist[i]->type < O_VOR) || (objectlist[i]->type == O_WAYPOINT) || (objectlist[i]->type == O_LAKE)) && (objectlist[i]->name) && ((*objectlist[i]).name[0])) { turns[numberofturns] = objectlist[i]; if (numberofturns < 1000) numberofturns++; } } /* check possible triangles */ numberofroutes = 0; for (i = 0; i < numberofturns - 1; i++) { for (j = i + 1; j < numberofturns; j++) { tempdist = distance(currentroute[FROM]->location, turns[i]->location) + distance(turns[i]->location, turns[j]->location) + distance(turns[j]->location, currentroute[FROM]->location); if ((tempdist >= mindist) && (tempdist <= maxdist)) if (isFAITriangle(currentroute[FROM]->location, turns[i]->location, turns[j]->location)) { turn1[numberofroutes] = turns[i]; turn2[numberofroutes] = turns[j]; if (numberofroutes < MAXROUTES) numberofroutes++; } } } /* evaluate ease of route, sort accordingly */ /* (still to be done...) */ } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.