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.c618
1 files changed, 323 insertions, 295 deletions
diff --git a/app/bin/elev.c b/app/bin/elev.c
index a9e5fee..98fcbab 100644
--- a/app/bin/elev.c
+++ b/app/bin/elev.c
@@ -1,5 +1,5 @@
/** \file elev.c
- *
+ *
*/
/* XTrkCad - Model Railroad CAD
@@ -17,21 +17,21 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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;
@@ -40,10 +40,10 @@ static char * elevPrefix;
static void SetTrkOnElevPath( track_p trk, int mode, DIST_T elev );
typedef struct {
- track_p trk;
- EPINX_T ep;
- DIST_T len;
- } elist_t;
+ track_p trk;
+ EPINX_T ep;
+ DIST_T len;
+} elist_t;
static dynArr_t elist_da;
#define elist(N) DYNARR_N( elist_t, elist_da, N )
#define elistAppend( T, E, L ) \
@@ -52,33 +52,35 @@ static dynArr_t elist_da;
EPINX_T GetNextTrkOnPath( track_p trk, EPINX_T ep )
{
-/* Get next track on Path:
- 1 - there is only 1 connected (not counting ep)
- 2 - there are >1 but only 1 on Path
- 3 - one of them is PST:PSE or PET:PEE
-*/
+ /* Get next track on Path:
+ 1 - there is only 1 connected (not counting ep)
+ 2 - there are >1 but only 1 on Path
+ 3 - one of them is PST:PSE or PET:PEE
+ */
EPINX_T ep2;
track_p trkN;
int epCnt = GetTrkEndPtCnt(trk);
for ( ep2=0; ep2<epCnt; ep2++) {
- if ( ep2 == ep )
+ if ( ep2 == ep ) {
continue;
+ }
trkN = GetTrkEndTrk(trk,ep2);
- if (trkN && (GetTrkBits(trkN)&TB_PROFILEPATH))
+ if (trkN && (GetTrkBits(trkN)&TB_PROFILEPATH)) {
return ep2;
+ }
}
return -1;
}
EXPORT int FindDefinedElev(
- track_p trk,
- EPINX_T ep,
- int dir,
- BOOL_T onpath,
- DIST_T * Relev,
- DIST_T *Rdist )
+ track_p trk,
+ EPINX_T ep,
+ int dir,
+ BOOL_T onpath,
+ DIST_T * Relev,
+ DIST_T *Rdist )
{
track_p trk0, trk1;
EPINX_T ep0, ep1, ep2;
@@ -86,8 +88,9 @@ EXPORT int FindDefinedElev(
if (dir) {
trk1 = GetTrkEndTrk( trk, ep );
- if (trk1 == NULL)
+ if (trk1 == NULL) {
return FDE_END;
+ }
ep = GetEndPtConnectedToMe( trk1, trk );
trk = trk1;
}
@@ -96,7 +99,7 @@ EXPORT int FindDefinedElev(
while (1) {
for (ep2=0; ep2<GetTrkEndPtCnt(trk); ep2++) {
if ((trk!=trk0||ep2!=ep0)&&
- EndPtIsDefinedElev(trk,ep2) ) {
+ EndPtIsDefinedElev(trk,ep2) ) {
dist += GetTrkLength( trk, ep, ep2 );
*Relev = GetTrkEndElevHeight(trk,ep2);
*Rdist = dist;
@@ -126,100 +129,70 @@ EXPORT int FindDefinedElev(
dist += GetTrkLength( trk, ep, ep2 );
trk = trk1;
ep = ep1;
- if (trk == trk0)
+ if (trk == trk0) {
return FDE_UDF;
+ }
}
}
BOOL_T ComputeElev(
- track_p trk,
- EPINX_T ep,
- BOOL_T onpath,
- DIST_T *elevR,
- DIST_T *gradeR,
- BOOL_T force )
+ track_p trk,
+ EPINX_T ep,
+ BOOL_T onpath,
+ DIST_T *elevR,
+ 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;
}
@@ -231,10 +204,10 @@ return rc;
*/
typedef struct {
- track_p trk;
- EPINX_T ep;
- DIST_T elev;
- } defelev_t;
+ track_p trk;
+ EPINX_T ep;
+ DIST_T elev;
+} defelev_t;
static dynArr_t defelev_da;
#define defelev(N) DYNARR_N( defelev_t, defelev_da, N )
@@ -250,8 +223,9 @@ static void FindDefElev( void )
while ( TrackIterate( &trk ) ) {
cnt = GetTrkEndPtCnt( trk );
for ( ep = 0; ep < cnt; ep++ ) {
- if ( !EndPtIsDefinedElev( trk, ep ) )
+ if ( !EndPtIsDefinedElev( trk, ep ) ) {
continue;
+ }
DYNARR_APPEND( defelev_t, defelev_da, 10 );
dep = &defelev( defelev_da.cnt-1 );
dep->trk = trk;
@@ -259,7 +233,8 @@ static void FindDefElev( void )
dep->elev = GetTrkEndElevHeight(trk,ep);
}
}
-LOG( log_fillElev, 1, ( "%s: findDefElev [%d] (%ld)\n", elevPrefix, defelev_da.cnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: findDefElev [%d] (%ld)\n", elevPrefix,
+ defelev_da.cnt, wGetTimer()-time0 ) )
}
@@ -283,15 +258,17 @@ static void FindAttachedDefElev( track_p trk, BOOL_T remove )
DYNARR_RESET( elist_t, elist_da );
elistAppend( trk, 0, 0 );
SetTrkBits( trk, TB_PROCESSED );
- if (remove)
+ if (remove) {
ClrTrkBits( trk, TB_ELEVPATH );
+ }
for ( i1=0; i1<elist_da.cnt; i1++ ) {
trk = elist(i1).trk;
- if (!IsTrack(trk))
+ if (!IsTrack(trk)) {
continue;
+ }
cnt = GetTrkEndPtCnt(trk);
for ( ep=0; ep<cnt; ep++ ) {
- if ( EndPtIsDefinedElev(trk,ep) ) {
+ if ( EndPtIsDefinedElev(trk,ep) ) {
DYNARR_APPEND( defelev_t, defelev_da, 10 );
dep = &defelev( defelev_da.cnt-1 );
dep->trk = trk;
@@ -319,8 +296,9 @@ static void FindAttachedDefElev( track_p trk, BOOL_T remove )
if ( !(GetTrkBits(trk1)&TB_PROCESSED) ) {
elistAppend( trk1, 0, 0 );
SetTrkBits( trk1, TB_PROCESSED );
- if (remove)
+ if (remove) {
ClrTrkBits( trk1, TB_ELEVPATH );
+ }
}
}
}
@@ -344,7 +322,8 @@ static int FindObsoleteElevs( void )
FindAttachedDefElev( trk, TRUE );
}
}
-LOG( log_fillElev, 1, ( "%s: findObsoleteElevs [%d] (%ld)\n", elevPrefix, cnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: findObsoleteElevs [%d] (%ld)\n", elevPrefix, cnt,
+ wGetTimer()-time0 ) )
return cnt;
}
@@ -358,22 +337,22 @@ LOG( log_fillElev, 1, ( "%s: findObsoleteElevs [%d] (%ld)\n", elevPrefix, cnt, w
*/
typedef struct {
- track_p trk;
- EPINX_T ep;
- EPINX_T ep2;
- DIST_T dist;
- DIST_T elev;
- } fork_t;
+ track_p trk;
+ EPINX_T ep;
+ EPINX_T ep2;
+ DIST_T dist;
+ DIST_T elev;
+} fork_t;
static dynArr_t fork_da;
#define fork(N) DYNARR_N( fork_t, fork_da, N )
static int FillElevShortestPathFunc(
- SPTF_CMD cmd,
- track_p trk,
- EPINX_T ep,
- EPINX_T ep2,
- DIST_T dist,
- void * data )
+ SPTF_CMD cmd,
+ track_p trk,
+ EPINX_T ep,
+ EPINX_T ep2,
+ DIST_T dist,
+ void * data )
{
defelev_t * dep = (defelev_t *)data;
track_p trk1;
@@ -384,10 +363,11 @@ static int FillElevShortestPathFunc(
case SPTC_MATCH:
/*if ( (GetTrkBits(trk)&TB_PROCESSED) )
epRc = 0;
- else*/ if ( (dep->trk!=trk || dep->ep!=ep) && EndPtIsDefinedElev(trk,ep))
+ else*/ if ( (dep->trk!=trk || dep->ep!=ep) && EndPtIsDefinedElev(trk,ep)) {
epRc = 1;
- else
+ } else {
epRc = 0;
+ }
break;
case SPTC_MATCHANY:
@@ -407,12 +387,18 @@ static int FillElevShortestPathFunc(
if (!(GetTrkBits(trk)&TB_PROCESSED)) {
SetTrkBits(trk, TB_PROCESSED);
if ( EndPtIsDefinedElev( trk, ep ) ) {
-if (log_shortPath<=0||logTable(log_shortPath).level<4) LOG( log_fillElev, 5, ( " ADD_TRK: T%d:%d D=%0.1f -> DefElev\n", GetTrkIndex(trk), ep, dist ) )
-LOG( log_shortPath, 4, ( "DefElev " ) )
- } else if ( GetNextTrk( trk, ep, &trk1, &ep1, GNTignoreIgnore ) < 0 && trk1 != NULL ) {
-if (log_shortPath<=0||logTable(log_shortPath).level<4) LOG( log_fillElev, 4, ( " ADD_TRK: T%d:%d D=%0.3f E=%0.3f -> Fork[%d]\n", GetTrkIndex(trk), ep, dist, dep->elev, fork_da.cnt ) )
-LOG( log_shortPath, 4, ( "E:%0.3f Fork[%d] ", dep->elev, fork_da.cnt ) )
- DYNARR_APPEND( fork_t, fork_da, 10 );
+ if (log_shortPath<=0
+ ||logTable(log_shortPath).level<4) LOG( log_fillElev, 5,
+ ( " ADD_TRK: T%d:%d D=%0.1f -> DefElev\n", GetTrkIndex(trk), ep, dist ) )
+ LOG( log_shortPath, 4, ( "DefElev " ) )
+ } else if ( GetNextTrk( trk, ep, &trk1, &ep1, GNTignoreIgnore ) < 0
+ && trk1 != NULL ) {
+ if (log_shortPath<=0
+ ||logTable(log_shortPath).level<4) LOG( log_fillElev, 4,
+ ( " ADD_TRK: T%d:%d D=%0.3f E=%0.3f -> Fork[%d]\n", GetTrkIndex(trk), ep,
+ dist, dep->elev, fork_da.cnt ) )
+ LOG( log_shortPath, 4, ( "E:%0.3f Fork[%d] ", dep->elev, fork_da.cnt ) )
+ DYNARR_APPEND( fork_t, fork_da, 10 );
n = &fork(fork_da.cnt-1);
n->trk = trk;
n->ep = ep;
@@ -424,10 +410,10 @@ LOG( log_shortPath, 4, ( "E:%0.3f Fork[%d] ", dep->elev, fork_da.cnt ) )
n->nep = dep->ep;
#endif
} else {
-LOG( log_shortPath, 4, ( "Normal " ) )
+ LOG( log_shortPath, 4, ( "Normal " ) )
}
} else {
-LOG( log_shortPath, 4, ( "Processed " ) )
+ LOG( log_shortPath, 4, ( "Processed " ) )
}
return 0;
@@ -437,10 +423,10 @@ LOG( log_shortPath, 4, ( "Processed " ) )
case SPTC_IGNNXTTRK:
if ( EndPtIsIgnoredElev(trk,ep2) ) {
-LOG( log_shortPath, 4, ( "2 Ignore " ) )
+ LOG( log_shortPath, 4, ( "2 Ignore " ) )
epRc = 1;
} else if ( (!EndPtIsDefinedElev(trk,ep)) && GetTrkEndTrk(trk,ep)==NULL ) {
-LOG( log_shortPath, 4, ( "1 Null && !DefElev " ) )
+ LOG( log_shortPath, 4, ( "1 Null && !DefElev " ) )
epRc = 1;
} else {
epRc = 0;
@@ -469,19 +455,20 @@ static void FindForks( void )
{
int i;
defelev_t * dep;
- int rc;
long time0 = wGetTimer();
DYNARR_RESET( fork_t, fork_da );
for ( i=0; i<defelev_da.cnt; i++ ) {
dep = &defelev(i);
-
+
ClrAllTrkBits( TB_PROCESSED );
-LOG( log_fillElev, 3, ( " findForks from T%d:%d\n", GetTrkIndex(dep->trk), dep->ep ) )
- rc = FindShortestPath( dep->trk, dep->ep, FALSE, FillElevShortestPathFunc, dep );
+ LOG( log_fillElev, 3, ( " findForks from T%d:%d\n", GetTrkIndex(dep->trk),
+ dep->ep ) )
+ FindShortestPath( dep->trk, dep->ep, FALSE, FillElevShortestPathFunc, dep );
}
ClrAllTrkBits( TB_PROCESSED );
-LOG( log_fillElev, 1, ( "%s: findForks [%d] (%ld)\n", elevPrefix, fork_da.cnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: findForks [%d] (%ld)\n", elevPrefix, fork_da.cnt,
+ wGetTimer()-time0 ) )
}
@@ -495,9 +482,9 @@ LOG( log_fillElev, 1, ( "%s: findForks [%d] (%ld)\n", elevPrefix, fork_da.cnt, w
*/
typedef struct {
- DIST_T elev;
- DIST_T dist;
- } elevdist_t;
+ DIST_T elev;
+ DIST_T dist;
+} elevdist_t;
static dynArr_t elevdist_da;
#define elevdist(N) DYNARR_N( elevdist_t, elevdist_da, N );
@@ -521,7 +508,8 @@ static DIST_T ComputeWeightedElev( DIST_T totalDist )
w = &elevdist(i2);
if (w->dist < 0.001) {
e = w->elev;
-LOG( log_fillElev, 3, ( " computeWeightedElev: close! D%0.3f E%0.3f\n", w->dist, e ) )
+ LOG( log_fillElev, 3, ( " computeWeightedElev: close! D%0.3f E%0.3f\n",
+ w->dist, e ) )
return e;
}
d2 += totalDist/w->dist;
@@ -534,13 +522,13 @@ LOG( log_fillElev, 3, ( " computeWeightedElev: close! D%0.3f E%0.3f\n", w-
e += ((totalDist/w->dist)/d2)*w->elev;
}
- if (log_fillElev >= 4) {
- for ( i2=0; i2<elevdist_da.cnt; i2++ ) {
- w = &elevdist(i2);
- lprintf( " E%0.3f D%0.3f\n", w->elev, w->dist );
- }
+ if (log_fillElev >= 4) {
+ for ( i2=0; i2<elevdist_da.cnt; i2++ ) {
+ w = &elevdist(i2);
+ lprintf( " E%0.3f D%0.3f\n", w->elev, w->dist );
}
-LOG( log_fillElev, 3, ( " computeWeightedElev: E%0.3f\n", e ) )
+ }
+ LOG( log_fillElev, 3, ( " computeWeightedElev: E%0.3f\n", e ) )
return e;
}
@@ -569,8 +557,9 @@ static void ComputeForkElev( void )
n1 = &fork(i1);
if ((trk=n1->trk)) {
cnt = GetTrkEndPtCnt(n1->trk);
- if (cnt<=0)
+ if (cnt<=0) {
continue;
+ }
/* collect dist/elev to connected DefElev points */
d1 = 0;
@@ -587,21 +576,25 @@ static void ComputeForkElev( void )
n2->trk = NULL;
d1 += w->dist;
if ( ! ( ( n1->ep == n2->ep && n1->ep2 == n2->ep2 ) ||
- ( n1->ep == n2->ep2 && n1->ep2 == n2->ep ) ) )
+ ( n1->ep == n2->ep2 && n1->ep2 == n2->ep ) ) ) {
singlePath = FALSE;
+ }
}
}
/* Also check my EPs */
for (ep=0; ep<cnt; ep++) {
- if ( (trk1=GetTrkEndTrk(trk,ep)) )
+ if ( (trk1=GetTrkEndTrk(trk,ep)) ) {
SetTrkBits( trk1, TB_PROCESSED );
- if (!EndPtIsDefinedElev(trk,ep))
+ }
+ if (!EndPtIsDefinedElev(trk,ep)) {
continue;
+ }
for (i2=i1; i2<fork_da.cnt; i2++) {
n2 = &fork(i2);
- if (trk==n2->trk && ep==n2->ep)
+ if (trk==n2->trk && ep==n2->ep) {
break;
+ }
}
if (i2 >= fork_da.cnt) {
DYNARR_APPEND( elevdist_t, elevdist_da, 10 );
@@ -624,12 +617,13 @@ static void ComputeForkElev( void )
SetTrkOnElevPath( trk, ELEV_FORK, e );
/* 3 or more EPs are to DefElevs */
n3->ep = -1;
-LOG( log_fillElev, 2, ( " 1 T%d E%0.3f\n", GetTrkIndex(trk), e ) )
+ LOG( log_fillElev, 2, ( " 1 T%d E%0.3f\n", GetTrkIndex(trk), e ) )
}
forkCnt++;
}
}
-LOG( log_fillElev, 1, ( "%s: computeForkElev [%d] (%ld)\n", elevPrefix, forkCnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: computeForkElev [%d] (%ld)\n", elevPrefix, forkCnt,
+ wGetTimer()-time0 ) )
}
@@ -651,8 +645,7 @@ static void RedrawCompGradeElev( track_p trk, EPINX_T ep )
pos = GetTrkEndPos( trk, ep );
if (!OFF_MAIND( pos, pos ) ) {
trk1 = GetTrkEndTrk( trk, ep );
- if ( (trk1=GetTrkEndTrk(trk,ep)) && GetTrkIndex(trk1)<GetTrkIndex(trk) )
-{
+ if ( (trk1=GetTrkEndTrk(trk,ep)) && GetTrkIndex(trk1)<GetTrkIndex(trk) ) {
ep = GetEndPtConnectedToMe( trk1, trk );
trk = trk1;
}
@@ -664,10 +657,10 @@ static void RedrawCompGradeElev( track_p trk, EPINX_T ep )
static void PropogateForkElev(
- track_p trk1,
- EPINX_T ep1,
- DIST_T d1,
- DIST_T e )
+ track_p trk1,
+ EPINX_T ep1,
+ DIST_T d1,
+ DIST_T e )
/* Propogate elev from fork connection
* The track list starting from trk1:ep1 ends at a DefElev or a Fork
* Inputs:
@@ -684,74 +677,77 @@ static void PropogateForkElev(
fork_t * n1;
int i2, i3;
- DYNARR_RESET( elist_t, elist_da );
- while (trk1) {
- if ( GetTrkIndex(trk1) == checkTrk )
- printf( "found btw forks\n" );
- if ( GetTrkOnElevPath( trk1, &e1 ) ) {
- d1 += GetTrkLength( trk1, ep1, -1 );
- goto nextStep;
- }
- cnt2 = GetTrkEndPtCnt(trk1);
- for ( ep2=0; ep2<cnt2; ep2++ ) {
- if ( ep2!=ep1 && EndPtIsDefinedElev(trk1,ep2) ) {
- e1 = GetTrkEndElevHeight( trk1, ep2 );
- d2 = GetTrkLength( trk1, ep1, ep2 )/2.0;
- d1 += d2;
- elistAppend( trk1, ep1, d1 );
- d1 += d2;
- goto nextStep;
- }
- }
- ep2 = GetNextTrk( trk1, ep1, &trkN, &epN, GNTignoreIgnore );
- if ( ep2<0 ) {
- /* is this really a fork? */
- for ( i2=0; i2<forkCnt; i2++ ) {
- n1 = &fork(i2);
- if ( trk1 == n1->trk && n1->ep >= 0 ) {
- /* no: make sure we are on the path */
- if ( n1->ep == ep1 )
- ep2 = n1->ep2;
- else if ( n1->ep2 == ep1 )
- ep2 = n1->ep;
- else
- return;
- trkN = GetTrkEndTrk(trk1,ep2);
- epN = GetEndPtConnectedToMe( trkN, trk1 );
- break;
- }
- }
- if ( i2 >= forkCnt )
- return;
+ DYNARR_RESET( elist_t, elist_da );
+ while (trk1) {
+ if ( GetTrkIndex(trk1) == checkTrk ) {
+ printf( "found btw forks\n" );
+ }
+ if ( GetTrkOnElevPath( trk1, &e1 ) ) {
+ d1 += GetTrkLength( trk1, ep1, -1 );
+ goto nextStep;
+ }
+ cnt2 = GetTrkEndPtCnt(trk1);
+ for ( ep2=0; ep2<cnt2; ep2++ ) {
+ if ( ep2!=ep1 && EndPtIsDefinedElev(trk1,ep2) ) {
+ e1 = GetTrkEndElevHeight( trk1, ep2 );
+ d2 = GetTrkLength( trk1, ep1, ep2 )/2.0;
+ d1 += d2;
+ elistAppend( trk1, ep1, d1 );
+ d1 += d2;
+ goto nextStep;
+ }
+ }
+ ep2 = GetNextTrk( trk1, ep1, &trkN, &epN, GNTignoreIgnore );
+ if ( ep2<0 ) {
+ /* is this really a fork? */
+ for ( i2=0; i2<forkCnt; i2++ ) {
+ n1 = &fork(i2);
+ if ( trk1 == n1->trk && n1->ep >= 0 ) {
+ /* no: make sure we are on the path */
+ if ( n1->ep == ep1 ) {
+ ep2 = n1->ep2;
+ } else if ( n1->ep2 == ep1 ) {
+ ep2 = n1->ep;
+ } else {
+ return;
}
- d2 = GetTrkLength( trk1, ep1, ep2 )/2.0;
- d1 += d2;
- elistAppend( trk1, ep1, d1 );
- d1 += d2;
- trk1 = trkN;
- ep1 = epN;
+ trkN = GetTrkEndTrk(trk1,ep2);
+ epN = GetEndPtConnectedToMe( trkN, trk1 );
+ break;
}
+ }
+ if ( i2 >= forkCnt ) {
+ return;
+ }
+ }
+ d2 = GetTrkLength( trk1, ep1, ep2 )/2.0;
+ d1 += d2;
+ elistAppend( trk1, ep1, d1 );
+ d1 += d2;
+ trk1 = trkN;
+ ep1 = epN;
+ }
nextStep:
- ASSERT(d1>0.0);
- e1 = (e1-e)/d1;
- trk1 = NULL;
- i3 = elist_da.cnt;
- for (i2=0; i2<elist_da.cnt; i2++) {
- trk1 = elist(i2).trk;
- ep1 = elist(i2).ep;
- if ( GetTrkOnElevPath( trk1, &e1 ) ) {
- i3=i2;
- break;
- }
- d2 = elist(i2).len;
- SetTrkOnElevPath( trk1, ELEV_BRANCH, e+e1*d2 );
-LOG( log_fillElev, 2, ( " 2 T%d E%0.3f\n", GetTrkIndex(trk1), e+e1*d2 ) )
- }
- for (i2=0; i2<i3; i2++) {
- trk1 = elist(i2).trk;
- ep1 = elist(i2).ep;
- RedrawCompGradeElev( trk1, ep1 );
- }
+ CHECK(d1>0.0);
+ e1 = (e1-e)/d1;
+ trk1 = NULL;
+ i3 = elist_da.cnt;
+ for (i2=0; i2<elist_da.cnt; i2++) {
+ trk1 = elist(i2).trk;
+ ep1 = elist(i2).ep;
+ if ( GetTrkOnElevPath( trk1, &e1 ) ) {
+ i3=i2;
+ break;
+ }
+ d2 = elist(i2).len;
+ SetTrkOnElevPath( trk1, ELEV_BRANCH, e+e1*d2 );
+ LOG( log_fillElev, 2, ( " 2 T%d E%0.3f\n", GetTrkIndex(trk1), e+e1*d2 ) )
+ }
+ for (i2=0; i2<i3; i2++) {
+ trk1 = elist(i2).trk;
+ ep1 = elist(i2).ep;
+ RedrawCompGradeElev( trk1, ep1 );
+ }
}
static void PropogateForkElevs( void )
@@ -776,8 +772,9 @@ static void PropogateForkElevs( void )
/* propogate elevs between forks */
for ( i1=0; i1<forkCnt; i1++ ) {
n1 = &fork(i1);
- if ( n1->ep >= 0 )
+ if ( n1->ep >= 0 ) {
continue;
+ }
trk = n1->trk;
GetTrkOnElevPath( trk, &e );
cnt = GetTrkEndPtCnt(trk);
@@ -795,7 +792,8 @@ static void PropogateForkElevs( void )
}
}
}
-LOG( log_fillElev, 1, ( "%s: propogateForkElev (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: propogateForkElev (%ld)\n", elevPrefix,
+ wGetTimer()-time0 ) )
}
static void PropogateDefElevs( void )
@@ -816,11 +814,14 @@ static void PropogateDefElevs( void )
dep = &defelev(i1);
if (GetTrkOnElevPath( dep->trk, &e ))
/* propogateForkElevs beat us to it */
+ {
continue;
+ }
e = GetTrkEndElevHeight( dep->trk, dep->ep );
PropogateForkElev( dep->trk, dep->ep, 0, e );
}
-LOG( log_fillElev, 1, ( "%s: propogateDefElevs [%d] (%ld)\n", elevPrefix, defelev_da.cnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: propogateDefElevs [%d] (%ld)\n", elevPrefix,
+ defelev_da.cnt, wGetTimer()-time0 ) )
}
@@ -836,16 +837,16 @@ LOG( log_fillElev, 1, ( "%s: propogateDefElevs [%d] (%ld)\n", elevPrefix, defele
*/
typedef struct {
- track_p trk;
- coOrd pos;
- DIST_T elev;
- } pivot_t;
+ track_p trk;
+ coOrd pos;
+ DIST_T elev;
+} pivot_t;
static dynArr_t pivot_da;
#define pivot(N) DYNARR_N(pivot_t, pivot_da, N)
static void SurveyIsland(
- track_p trk,
- BOOL_T stopAtElevPath )
+ track_p trk,
+ BOOL_T stopAtElevPath )
/* Find the tracks in this island and the pivots of this island
* Outputs:
* elist_da - tracks in the island
@@ -866,8 +867,9 @@ static void SurveyIsland(
SetTrkBits( trk, TB_PROCESSED );
for ( i1=0; i1 < elist_da.cnt; i1++ ) {
trk = elist(i1).trk;
- if ( GetTrkIndex(trk) == checkTrk )
+ if ( GetTrkIndex(trk) == checkTrk ) {
printf( "found in island\n" );
+ }
cnt = GetTrkEndPtCnt(trk);
for ( ep=0; ep<cnt; ep++ ) {
trk1 = GetTrkEndTrk( trk, ep );
@@ -895,7 +897,7 @@ static void SurveyIsland(
}
static void ComputeIslandElev(
- track_p trk )
+ track_p trk )
/* Compute elev of tracks connected to 'trk'
* An island is the set of tracks bounded by a DefElev EP or a track already on ElevPath
* Inputs:
@@ -918,8 +920,9 @@ static void ComputeIslandElev(
for ( i1=0; i1 < elist_da.cnt; i1++ ) {
trk = elist(i1).trk;
- if ( !IsTrack(trk) )
+ if ( !IsTrack(trk) ) {
continue;
+ }
mode = ELEV_ISLAND;
if (pivot_da.cnt == 0) {
elev = 0;
@@ -945,7 +948,7 @@ static void ComputeIslandElev(
elev = ComputeWeightedElev( totalDist );
}
SetTrkOnElevPath( trk, mode, elev );
-LOG( log_fillElev, 1, ( " 3 T%d E%0.3f\n", GetTrkIndex(trk), elev ) )
+ LOG( log_fillElev, 1, ( " 3 T%d E%0.3f\n", GetTrkIndex(trk), elev ) )
}
for ( i1=0; i1<elist_da.cnt; i1++ ) {
@@ -978,17 +981,18 @@ static void FindIslandElevs( void )
}
}
}
-LOG( log_fillElev, 1, ( "%s: findIslandElevs [%d] (%ld)\n", elevPrefix, islandCnt, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: findIslandElevs [%d] (%ld)\n", elevPrefix,
+ islandCnt, wGetTimer()-time0 ) )
}
/*
* DYNAMIC ELEVATION COMPUTATION
- *
+ *
* Drivers
*
*/
-EXPORT void RecomputeElevations( void )
+EXPORT void RecomputeElevations( void * unused )
{
long time0 = wGetTimer();
elevPrefix = "RECELV";
@@ -1001,29 +1005,29 @@ EXPORT void RecomputeElevations( void )
PropogateDefElevs();
FindIslandElevs();
MainRedraw(); // RecomputeElevations
-LOG( log_fillElev, 1, ( "%s: Total (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: Total (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
if ( log_dumpElev > 0 ) {
track_p trk;
DIST_T elev;
for ( trk=NULL; TrackIterate( &trk ); ) {
printf( "T%4.4d = ", GetTrkIndex(trk) );
- if ( GetTrkOnElevPath( trk, &elev ) )
+ if ( GetTrkOnElevPath( trk, &elev ) ) {
printf( "%d:%0.2f\n", GetTrkElevMode(trk), elev );
- else
+ } 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 );
+ 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
}
}
}
@@ -1037,18 +1041,20 @@ EXPORT void UpdateAllElevations( void )
elevPrefix = "UPDELV";
if ( !log_fillElev_initted ) { log_fillElev = LogFindIndex( "fillElev" ); log_dumpElev = LogFindIndex( "dumpElev" ); log_fillElev_initted = TRUE; }
- if (!needElevUpdate)
+ if (!needElevUpdate) {
return;
+ }
work = FindObsoleteElevs();
- if (!work)
+ if (!work) {
return;
+ }
FindForks();
ComputeForkElev();
PropogateForkElevs();
PropogateDefElevs();
FindIslandElevs();
needElevUpdate = FALSE;
-LOG( log_fillElev, 1, ( "%s: Total (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
+ LOG( log_fillElev, 1, ( "%s: Total (%ld)\n", elevPrefix, wGetTimer()-time0 ) )
}
@@ -1073,13 +1079,15 @@ EXPORT DIST_T GetElevation( track_p trk )
ComputeForkElev();
PropogateForkElevs();
PropogateDefElevs();
- if ( GetTrkOnElevPath(trk,&elev) )
+ if ( GetTrkOnElevPath(trk,&elev) ) {
return elev;
+ }
ComputeIslandElev( trk );
- if ( GetTrkOnElevPath(trk,&elev) )
+ if ( GetTrkOnElevPath(trk,&elev) ) {
return elev;
+ }
printf( "GetElevation(T%d) failed\n", GetTrkIndex(trk) );
return 0;
@@ -1088,7 +1096,7 @@ EXPORT DIST_T GetElevation( track_p trk )
/*
* DYNAMIC ELEVATION COMPUTATION
- *
+ *
* Utilities
*
*/
@@ -1107,8 +1115,9 @@ static void PropogateElevMode( track_p trk, DIST_T elev, int mode )
{
int i1;
SurveyIsland( trk, FALSE );
- for ( i1=0; i1<elist_da.cnt; i1++ )
+ for ( i1=0; i1<elist_da.cnt; i1++ ) {
SetTrkOnElevPath( elist(i1).trk, mode, elev );
+ }
}
@@ -1116,17 +1125,20 @@ static BOOL_T CheckForElevAlone( track_p trk )
{
int i1;
SurveyIsland( trk, FALSE );
- if ( pivot_da.cnt!=0 )
+ if ( pivot_da.cnt!=0 ) {
return FALSE;
- for ( i1=0; i1<elist_da.cnt; i1++ )
+ }
+ for ( i1=0; i1<elist_da.cnt; i1++ ) {
SetTrkOnElevPath( elist(i1).trk, ELEV_ALONE, 0.0 );
+ }
return TRUE;
}
-EXPORT void SetTrkElevModes( BOOL_T connect, track_p trk0, EPINX_T ep0, track_p trk1, EPINX_T ep1 )
+EXPORT void SetTrkElevModes( BOOL_T connect, track_p trk0, EPINX_T ep0,
+ track_p trk1, EPINX_T ep1 )
{
- int mode0, mode1;
+ int mode0, mode1;
DIST_T elev, diff, elev0, elev1;
char * station;
BOOL_T update = TRUE;
@@ -1147,11 +1159,13 @@ EXPORT void SetTrkElevModes( BOOL_T connect, track_p trk0, EPINX_T ep0, track_p
}
} else {
if ( mode0 == ELEV_ISLAND ) {
- if (CheckForElevAlone( trk0 ))
+ if (CheckForElevAlone( trk0 )) {
update = FALSE;
+ }
} else if ( mode1 == ELEV_ISLAND ) {
- if (CheckForElevAlone( trk1 ))
+ if (CheckForElevAlone( trk1 )) {
update = FALSE;
+ }
}
}
@@ -1161,13 +1175,15 @@ EXPORT void SetTrkElevModes( BOOL_T connect, track_p trk0, EPINX_T ep0, track_p
elev = 0.0;
station = NULL;
if (mode0 == ELEV_DEF && mode1 == ELEV_DEF) {
- mode0 = GetTrkEndElevUnmaskedMode( trk0, ep0 ) | GetTrkEndElevUnmaskedMode( trk1, ep1 );
+ mode0 = GetTrkEndElevUnmaskedMode( trk0,
+ ep0 ) | GetTrkEndElevUnmaskedMode( trk1, ep1 );
elev0 = GetTrkEndElevHeight( trk0, ep0 );
elev1 = GetTrkEndElevHeight( trk1, ep1 );
elev = (elev0+elev1)/2.0;
diff = fabs( elev0-elev1 );
- if (diff>0.1)
+ if (diff>0.1) {
ErrorMessage( MSG_JOIN_DIFFER_ELEV, PutDim(diff) );
+ }
} else if (mode0 == ELEV_DEF) {
mode0 = GetTrkEndElevUnmaskedMode( trk0, ep0 );
elev = GetTrkEndElevHeight( trk0, ep0 );
@@ -1203,18 +1219,18 @@ EXPORT void SetTrkElevModes( BOOL_T connect, track_p trk0, EPINX_T ep0, track_p
EXPORT void UpdateTrkEndElev(
- track_p trk,
- EPINX_T ep,
- int newMode,
- DIST_T newElev,
- char * newStation )
+ track_p trk,
+ EPINX_T ep,
+ int newMode,
+ DIST_T newElev,
+ char * newStation )
{
int oldMode;
DIST_T oldElev;
char * oldStation;
BOOL_T changed = TRUE;
track_p trk1;
- EPINX_T ep1;
+// EPINX_T ep1;
oldMode = GetTrkEndElevUnmaskedMode( trk, ep );
if ( (oldMode&ELEV_MASK) == (newMode&ELEV_MASK) ) {
@@ -1222,8 +1238,9 @@ EXPORT void UpdateTrkEndElev(
case ELEV_DEF:
oldElev = GetTrkEndElevHeight( trk, ep );
if ( oldElev == newElev ) {
- if ( oldMode == newMode )
+ if ( oldMode == newMode ) {
return;
+ }
changed = FALSE;
}
break;
@@ -1239,8 +1256,9 @@ EXPORT void UpdateTrkEndElev(
} else {
changed = TRUE;
if ( (newMode&ELEV_MASK)==ELEV_DEF || (oldMode&ELEV_MASK)==ELEV_DEF ||
- (newMode&ELEV_MASK)==ELEV_IGNORE || (oldMode&ELEV_MASK)==ELEV_IGNORE )
+ (newMode&ELEV_MASK)==ELEV_IGNORE || (oldMode&ELEV_MASK)==ELEV_IGNORE ) {
changed = TRUE;
+ }
}
UndoModify( trk );
if ( (trk1 = GetTrkEndTrk( trk, ep )) ) {
@@ -1252,7 +1270,7 @@ EXPORT void UpdateTrkEndElev(
if ( changed ) {
ClrTrkElev( trk );
if ( trk1 ) {
- ep1 = GetEndPtConnectedToMe( trk1, trk );
+// ep1 = GetEndPtConnectedToMe( trk1, trk );
ClrTrkElev( trk1 );
}
UpdateAllElevations();
@@ -1266,23 +1284,28 @@ static void SetTrkOnElevPath( track_p trk, int mode, DIST_T elev )
DIST_T oldElev;
coOrd hi, lo;
- if ( !GetTrkOnElevPath( trk, &oldElev ) )
+ if ( !GetTrkOnElevPath( trk, &oldElev ) ) {
oldElev = 0.0;
+ }
GetBoundingBox( trk, &hi, &lo );
if ((labelEnable&LABELENABLE_TRACK_ELEV) &&
- labelScale >= mainD.scale &&
- (! OFF_MAIND( lo, hi ) ) &&
- (GetTrkVisible(trk) || drawTunnel!=0/*DRAW_TUNNEL_NONE*/) &&
- GetLayerVisible(GetTrkLayer(trk)) )
+ labelScale >= mainD.scale &&
+ (! OFF_MAIND( lo, hi ) ) &&
+ (GetTrkVisible(trk) || drawTunnel!=0/*DRAW_TUNNEL_NONE*/) &&
+ GetLayerVisible(GetTrkLayer(trk)) ) {
redraw = TRUE;
-
- if ( (GetTrkBits(trk)&TB_ELEVPATH) && (oldElev == elev && oldMode == mode) )
+ }
+
+ if ( (GetTrkBits(trk)&TB_ELEVPATH) && (oldElev == elev && oldMode == mode) ) {
return;
- if ( redraw && (GetTrkBits(trk)&TB_ELEVPATH))
+ }
+ if ( redraw && (GetTrkBits(trk)&TB_ELEVPATH)) {
DrawTrackElev( trk, &mainD, FALSE );
+ }
SetTrkElev( trk, mode, elev );
- if ( redraw )
+ if ( redraw ) {
DrawTrackElev( trk, &mainD, TRUE );
+ }
}
@@ -1295,40 +1318,45 @@ EXPORT void DrawTrackElev( track_cp trk, drawCmd_p d, BOOL_T drawIt )
coOrd lo, hi;
if ( (!IsTrack(trk)) ||
- (!(labelEnable&LABELENABLE_TRACK_ELEV)) ||
- (d == &mapD) ||
- (labelScale < d->scale) ||
- (!GetTrkOnElevPath( trk, &elev )) ||
- ((GetTrkBits(trk)&TB_ELEVPATH) == 0) ||
- (d->options & DC_SIMPLE) != 0 )
+ (!(labelEnable&LABELENABLE_TRACK_ELEV)) ||
+ (d == &mapD) ||
+ (labelScale < d->scale) ||
+ (!GetTrkOnElevPath( trk, &elev )) ||
+ ((GetTrkBits(trk)&TB_ELEVPATH) == 0) ||
+ (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;
}
- if ( d==&mainD && OFF_MAIND( pos, pos ) )
+ if ( d==&mainD && OFF_MAIND( pos, pos ) ) {
return;
+ }
switch ( GetTrkElevMode(trk) ) {
case ELEV_FORK:
- color = drawColorBlue;
+ color = drawColorDkBlue;
break;
case ELEV_BRANCH:
color = drawColorPurple;
break;
case ELEV_ISLAND:
- color = drawColorGold;
+ color = drawColorDkAqua;
break;
case ELEV_ALONE:
return;
}
- if ( !drawIt )
+ if ( !drawIt ) {
color = wDrawColorWhite;
+ }
sprintf( message, "%s", FormatDistance(elev));
fp = wStandardFont( F_HELV, FALSE, FALSE );
- DrawBoxedString( BOX_INVERT, d, pos, message, fp, (wFontSize_t)descriptionFontSize, color, 0 );
+ DrawBoxedString( BOX_INVERT, d, pos, message, fp,
+ (wFontSize_t)descriptionFontSize, color, 0 );
}