summaryrefslogtreecommitdiff
path: root/app/bin/elev.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/elev.c')
-rw-r--r--app/bin/elev.c111
1 files changed, 38 insertions, 73 deletions
diff --git a/app/bin/elev.c b/app/bin/elev.c
index a9e5fee..ff987cc 100644
--- a/app/bin/elev.c
+++ b/app/bin/elev.c
@@ -19,19 +19,19 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include <math.h>
#include "ccurve.h"
+#include "tbezier.h"
+#include "tcornu.h"
#include "cundo.h"
-#include "messages.h"
#include "param.h"
#include "shrtpath.h"
#include "track.h"
-#include "utility.h"
-#include "string.h"
+#include "common-ui.h"
-EXPORT long oldElevationEvaluation = 0;
+/** @logcmd @showrefby fillElev=n elev.c */
static int log_fillElev = 0;
+/** @logcmd @showrefby dumpElev=n elev.c */
static int log_dumpElev = 0;
static BOOL_T log_fillElev_initted;
static int checkTrk = 0;
@@ -140,86 +140,53 @@ BOOL_T ComputeElev(
DIST_T *gradeR,
BOOL_T force )
{
- DIST_T grade;
- DIST_T elev0, elev1, dist0, dist1;
+ DIST_T grade = 0.0;
+ DIST_T elev0;
BOOL_T rc = FALSE;
-if (oldElevationEvaluation) {
- int rc0, rc1;
- if (GetTrkEndElevMode(trk,ep) == ELEV_DEF) {
- if (elevR)
- *elevR = GetTrkEndElevHeight(trk,ep);
- if (gradeR)
- *gradeR = 0.0;
- return TRUE;
- }
- rc0 = FindDefinedElev( trk, ep, 0, onpath, &elev0, &dist0 );
- rc1 = FindDefinedElev( trk, ep, 1, onpath, &elev1, &dist1 );
- if ( rc0 == FDE_DEF && rc1 == FDE_DEF ) {
- if (dist0+dist1 > 0.1)
- grade = (elev1-elev0)/(dist0+dist1);
- else
- grade = 0.0;
- elev0 += grade*dist0;
- rc = TRUE;
- } else if ( rc0 == FDE_DEF && rc1 == FDE_END ) {
- grade = 0.0;
- rc = TRUE;
- } else if ( rc1 == FDE_DEF && rc0 == FDE_END ) {
- grade = 0.0;
- elev0 = elev1;
- rc = TRUE;
- } else if ( rc0 == FDE_END && rc1 == FDE_END ) {
- grade = 0.0;
- elev0 = 0.0;
- rc = TRUE;
- } else {
- grade = 0.0;
- elev0 = 0.0;
- }
-} else {
track_p trk1;
EPINX_T ep1;
- grade = -1;
rc = TRUE;
if ( EndPtIsDefinedElev(trk,ep) ) {
elev0 = GetTrkEndElevHeight(trk,ep);
rc = FALSE;
- } else {
- if (force || (!GetTrkEndElevCachedHeight(trk,ep,&elev0,&dist0))) {
- elev0 = GetElevation( trk );
- dist0 = GetTrkLength( trk, ep, -1 );
- }
- SetTrkEndElevCachedHeight(trk,ep,elev0,dist0);
+ } else if (force || (!GetTrkEndElevCachedHeight(trk,ep,&elev0,&grade))) {
trk1 = GetTrkEndTrk( trk, ep );
if (trk1!=NULL) {
+ // Compute weighted average of the 2 track elevation
ep1 = GetEndPtConnectedToMe(trk1,trk);
- if (force || (!GetTrkEndElevCachedHeight(trk1,ep1,&elev1,&dist1))) {
+ if (force || (!GetTrkEndElevCachedHeight(trk1,ep1,&elev0,&grade))) {
+ // Not cached, need to compute
+ DIST_T elev1, dist0, dist1;
+ elev0 = GetElevation( trk );
+ dist0 = GetTrkLength( trk, ep, -1 );
elev1 = GetElevation( trk1 );
dist1 = GetTrkLength( trk1, ep1, -1 );
- }
- SetTrkEndElevCachedHeight(trk1,ep1,elev1,dist1);
- if (dist0+dist1>0.1) {
- grade = (elev1-elev0)/(dist0+dist1);
- elev0 += grade*dist0;
+ if (dist0+dist1>0.1) {
+ grade = (elev1-elev0)/(dist0+dist1);
+ elev0 += grade*dist0;
+ } else {
+ elev0 = (elev0+elev1)/2.0;
+ rc = FALSE;
+ }
+ SetTrkEndElevCachedHeight(trk,ep,elev0,grade);
+ SetTrkEndElevCachedHeight(trk1,ep1,elev0,-grade);
} else {
- elev0 = (elev0+elev1)/2.0;
- rc = FALSE;
- SetTrkEndElevCachedHeight(trk,ep,elev0,dist0);
- SetTrkEndElevCachedHeight(trk1,ep1,elev0,dist1);
+ // flip grade from connected EP
+ grade = - grade;
}
} else {
- grade = 0.0;
+ // Not connected - use track elevation
+ elev0 = GetElevation( trk );
+ SetTrkEndElevCachedHeight(trk,ep,elev0,0.0);
}
-
}
-}
-if ( elevR )
- *elevR = elev0;
-if ( gradeR )
- *gradeR = grade;
-return rc;
+ if ( elevR )
+ *elevR = elev0;
+ if ( gradeR )
+ *gradeR = grade;
+ return rc;
}
@@ -988,7 +955,7 @@ LOG( log_fillElev, 1, ( "%s: findIslandElevs [%d] (%ld)\n", elevPrefix, islandCn
*
*/
-EXPORT void RecomputeElevations( void )
+EXPORT void RecomputeElevations( void * unused )
{
long time0 = wGetTimer();
elevPrefix = "RECELV";
@@ -1011,19 +978,17 @@ LOG( log_fillElev, 1, ( "%s: Total (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
printf( "%d:%0.2f\n", GetTrkElevMode(trk), elev );
else
printf( "noelev\n" );
-#ifdef LATER
- EPINX_T ep;
- int mode;
+ EPINX_T ep;
+ int mode;
for ( ep=0; ep<GetTrkEndPtCnt(trk); ep++ ) {
mode = GetTrkEndElevMode( trk, ep );
- ComputeElev( trk, ep, FALSE, &elev, NULL );
+ ComputeElev( trk, ep, FALSE, &elev, NULL, FALSE );
printf( "T%4.4d[%2.2d] = %s:%0.3f\n",
GetTrkIndex(trk), ep,
mode==ELEV_NONE?"None":mode==ELEV_DEF?"Def":mode==ELEV_COMP?"Comp":
mode==ELEV_GRADE?"Grade":mode==ELEV_IGNORE?"Ignore":mode==ELEV_STATION?"Station":"???",
elev );
}
-#endif
}
}
}
@@ -1303,7 +1268,7 @@ EXPORT void DrawTrackElev( track_cp trk, drawCmd_p d, BOOL_T drawIt )
(d->options & DC_SIMPLE) != 0 )
return;
- if ( !GetCurveMiddle( trk, &pos ) ) {
+ if ( !GetCurveMiddle( trk, &pos ) && !GetCornuMiddle(trk, &pos) && !GetBezierMiddle(trk, &pos)) {
GetBoundingBox( trk, &hi, &lo );
pos.x = (hi.x+lo.x)/2.0;
pos.y = (hi.y+lo.y)/2.0;