/* **************************************************************************** * * MODULE: v.transform * AUTHOR(S): See other files as well... * Eric G. Miller * PURPOSE: To transform a vector layer's coordinates via a set of tie * points. * COPYRIGHT: (C) 2002 by the GRASS Development Team * * This program is free software under the GNU General Public * License (>=v2). Read the file COPYING that comes with GRASS * for details. * *****************************************************************************/ /* * * ask_transform_coor (n_points) - * Uses Vask to get the sets of coordinates from the user. * * shrink_map_coor() - condense the arrays used for the transform * library, also turns on the use[] if the coordinate set if valid. * * Written by the GRASS Team, 02/16/90, -mh . */ #ifndef __MINGW32__ #include #include #include #include #include #include "trans.h" static int shrink_map_coor (void); int ask_transform_coor (int n_points) { int i; int coor_cnt ; int at_line ; int at_point[MAX_COOR] ; /* at_point must be an array for Vask */ char tmp[82] ; /* number of coordinates we can handle. this may be the second time * to this menu and some points may have been registered */ coor_cnt = MAX_COOR - reg_cnt ; V_clear(); V_line(1," MAP REGISTRATION"); V_line(2," ------------------------------------------------------------------------"); V_line(3,"| | Existing Map | New Map |"); V_line(4,"| Point # | X coord Y coord | X coord Y coord |"); V_line(5," ------------------------------------------------------------------------"); for ( i=0; i < MAX_COOR; i++) { at_line = i + 7 ; at_point[i] = i + 1 ; V_const (&at_point[i], 'i', at_line, 6, 6); V_ques ( &ax[i], 'd', at_line, 15, 12); V_ques ( &ay[i], 'd', at_line, 30, 12); V_ques ( &bx[i], 'd', at_line, 45, 12); V_ques ( &by[i], 'd', at_line, 60, 12); } /* show min needed and max they can go to */ sprintf(tmp," Enter %d to %d points. Current number of points: %d", (MIN_COOR > reg_cnt) ? MIN_COOR - reg_cnt : 0 , coor_cnt, n_points); V_line(at_line + 3, tmp); V_intrpt_ok(); /* add message before exit */ if (!V_call()) { V_exit (); G_message ( _("ask_transform_coor(): Leaving session.. \n")); sleep(2); return(-1); } return ( shrink_map_coor()) ; } /* * Condense the arrays and update use[]. */ static int shrink_map_coor (void) { int i, k ; for ( i = 0, k = 0; i < MAX_COOR; i++) { if ( ax[i] == 0.0 || ay[i] == 0.0 || bx[i] == 0.0 || by[i] == 0.0) continue ; use[i] = 1 ; /* same place count it, but skip it */ if( i == k) { ++k ; continue ; } /* valid point store them */ *(bx+k) = *(bx+i) ; *(by+k) = *(by+i) ; *(ax+k) = *(ax+i) ; *(ay+k) = *(ay+i) ; *(use+k) = *(use+i) ; *(residuals+k) = *(residuals+i) ; ++k ; } /* now make sure everything else is zero'ed out */ i = (k <= 0) ? 0 : k ; for ( ; i < MAX_COOR ; i++) { *(bx+i) = 0.0 ; *(by+i) = 0.0 ; *(ax+i) = 0.0 ; *(ay+i) = 0.0 ; *(use+i) = 0 ; *(residuals+i) = 0.0 ; } return(k) ; } #endif /* __MINGW32__ */