#pragma once #ifndef DijkstraUtiles_h #define DijkstraUtiles_h #include #include #include #include "mapmatrix.h" #ifndef MAYUSCULO #define MAYUSCULO (double) 1.e+30 #endif #ifndef MINUSCULO #define MINUSCULO (double) 1.e-20 #endif #define EXT_ARCH_DIJ_DEFAULT "ndj" #define NOMB_ARCH_DIJ_DEF "snodos_dj" /** * Estructura de elemento de la cola para el cálculo de caminos óptimos por Dijkstra */ struct Djkt_elem_cola { int id; // dat; inline BOOL operator[](__int64 i) { BYTE j =(BYTE)(1<<(i%(sizeof(BYTE)*8))); return (BOOL)((dat[(int)(i/(sizeof(BYTE)*8.))] & j) == j); } inline void set(__int64 i, BOOL v) { BYTE j; j =(BYTE)(1<<(i%(sizeof(BYTE)*8))); if(!v) { j = ~j; dat[(int)(i/(sizeof(BYTE)*8.))] &= j; return; } dat[(int)(i/(sizeof(BYTE)*8.))] |= j; } inline BOOL dimensiona(__int64 n) { dat.n = 0; int nn = (int)(0.5+n/(sizeof(BYTE)*8.)); if(!(dat+=nn)) return FALSE; dat.n = nn; return TRUE; } inline void setAll(BOOL v) { BYTE j = 0; if(v) j =~j; memset(dat.ptr, j, dat.n*sizeof(BYTE)); } }; //************************************************************************************* class UTILES_EXPORT DijkstraUtiles { public: static BOOL dijkstra_ang_inv_ok(CmapMatFloat &costes, Djkt_ang_ady *angs, int n, int fin, Djkt_nodo **nodos, FlagsArray *visto_ang_); static double ruta_dj_inv_ok(int id_ini, int *secu, Djkt_nodo *nodos, int nmax, int *n); static double ruta_dj_inv(int id_ini, int *secu, Djkt_nodo *nodos, int nmax, int *n); }; //************************************************************************************* /** * Clase de manejo de archivos de nodos djtra * cada archivo tiene un numero de bloques o array de nodos de longitud fija "nnod" */ //estructura cabecera de archivo typedef struct Head_dj_arch { int version; //version del archivo int nn; //numero de nodos por bloque int nb; //numero de bloques del dj int max_conex; //maximo de conexiones por nodo }Head_dj_arch; #define VERSION_DJ_ARCHI 100 #define MAX_CONEX_DJ_ARCHI 16 class UTILES_EXPORT InfoIndice { public: virtual int get(int iamb, int iextremo) = 0;//da del ambito iamb el indice a inicio o a fin //si iextremo es o o 1 }; class UTILES_EXPORT Cdijkstra_arch { public: char extension[16];//extension de archivos char path[MAX_PATH];//nombre sin extension Head_dj_arch hd;//cabecera de archivo int sizn;//tamaño en BYTES de cada nodo BOOL salta_ids_padres; //int flags;//0x1-->modo escritura 0x2-->modo lectura //info de distancias ambitos float *dis;//distancia de un nodo a otro (matriz de nnod*nnod) int nod_amb;//nodos por ambito int nambi;//numero de ambitos int nnod;//numero de nodos por fila int id_instal;//fila planta int id_plan;//fila instal int nod_instal;//nodo instalacion int nod_plan;//nodo planta int tip_ambitos; InfoIndice* ia;//puntero a info asoc //funciones-------------------------------------------------------------------------- Cdijkstra_arch(); ~Cdijkstra_arch(); BOOL inicia(char* path_arch, BOOL nuevo=FALSE, BOOL borra = TRUE, int n_nod=0, int max_conex=MAX_CONEX_DJ_ARCHI);//si nuevo -> crea vacio BOOL add_b(Djkt_nodo* blq, int iref, int inod, BOOL pon_inf=FALSE);//añade un bloque a el archivo BOOL inicia_inf_amb(InfoIndice* ina, int namb,int tip_amb, int id_instal=-1, int id_plan=-1); void pon_info_amb(Djkt_nodo* nodos, int iref,int ib); Djkt_nodo* get_b(int iref, int ibloq, Djkt_nodo* buf=NULL);//develve el bloque ibloq-esimo float dame_dis(int aorig,int norig, int ades, int n_des); Djkt_nodo* dame_buf_nodos(BOOL angulos=FALSE ); void libera_buf(Djkt_nodo* buf ); BOOL graba_dis(int id); BOOL lee_dis(); }; #endif