From ea591c698d7dfb0ff7fcb1194a3c640ae123a572 Mon Sep 17 00:00:00 2001 From: Elena Date: Tue, 7 Feb 2023 23:51:37 +0100 Subject: [PATCH] Cambio para poder emplear la z al calcular la distancia 2D, si tienen z distinta, le pone dist 2D infinita --- CartoBaseElements.cpp | 8 ++++---- CartoBaseElements.h | 4 ++-- CartoElements.cpp | 4 ++-- CartoElements.h | 2 +- GeometryFunction.cpp | 12 +++++++++--- GeometryFunction.h | 4 ++-- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/CartoBaseElements.cpp b/CartoBaseElements.cpp index b44ab8d..038de93 100644 --- a/CartoBaseElements.cpp +++ b/CartoBaseElements.cpp @@ -198,9 +198,9 @@ double CartoBaseInfoEntity::disMedLines(SetPtsR *line2, double l_avan, double *d //***************************************************************************************** //la distancia media a una línea de longitud mayor que this, //calculando la distancia de los puntos de this a line2 -double CartoBaseInfoEntity::disMedLines(SetPtsR *line2, double *desv) +double CartoBaseInfoEntity::disMedLines(SetPtsR *line2, double *desv, BOOL usa_z /*= FALSE*/) { - return GeometryFunction::DisMedLines(this,line2); + return GeometryFunction::DisMedLines(this,line2, usa_z); } //***************************************************************************************** double *CartoBaseInfoEntity::GetPtoDis(double dis, double *dst, double *distTot) @@ -208,9 +208,9 @@ double *CartoBaseInfoEntity::GetPtoDis(double dis, double *dst, double *distTot) return GeometryFunction::GetPto(this, dis, dst, distTot); } //***************************************************************************************** -double CartoBaseInfoEntity::DisPtoLine(double*p, int* idpto, double *lamb) +double CartoBaseInfoEntity::DisPtoLine(double*p, int* idpto, double *lamb, BOOL usa_z) { - return GeometryFunction::DisPtoLine(this,p,idpto,lamb); + return GeometryFunction::DisPtoLine(this,p,idpto,lamb,usa_z); } //***************************************************************************************** double CartoBaseInfoEntity::DplineSeg(double* s1, double *s2,int *n, double *lamd1,double *lamb2) diff --git a/CartoBaseElements.h b/CartoBaseElements.h index eab9336..806ea37 100644 --- a/CartoBaseElements.h +++ b/CartoBaseElements.h @@ -111,8 +111,8 @@ public: void* getIa(); double getLong(); double disMedLines(SetPtsR *line2, double l_avan, double *desv=NULL); - double disMedLines(SetPtsR *line2, double *desv=NULL); - double DisPtoLine(double*p, int* idpto=NULL, double *lamb=NULL); + double disMedLines(SetPtsR *line2, double *desv=NULL, BOOL usa_z = FALSE); + double DisPtoLine(double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z=FALSE); SetPtsW *GetNPrimePtos(SetPtsW *ldst, int nptos, double dis, BOOL avanza); bool DivLine(SetPtsW* ldst1, SetPtsW* ldst2, int ip, double lamb); double *GetPtoDis(double dis, double *dst, double *distTot); diff --git a/CartoElements.cpp b/CartoElements.cpp index f166591..2e3e7d2 100644 --- a/CartoElements.cpp +++ b/CartoElements.cpp @@ -188,8 +188,8 @@ void CartoLine::invert() //***************************************************************************************** //la distancia media a una línea de longitud mayor que this, //calculando la distancia de los puntos de this a line2 -double CartoEntity::disMedLines(SetPtsR *line2, double *desv) +double CartoEntity::disMedLines(SetPtsR *line2, double *desv, BOOL usa_z /*=FALSE*/) { - return GeometryFunction::DisMedLines(this,line2,desv); + return GeometryFunction::DisMedLines(this,line2,desv,usa_z); } //***************************************************************************************** \ No newline at end of file diff --git a/CartoElements.h b/CartoElements.h index aaffae3..449becf 100644 --- a/CartoElements.h +++ b/CartoElements.h @@ -31,7 +31,7 @@ public: virtual double* getPto(int i){return 0;} virtual int getNumberPtos(){return 0;} - virtual double disMedLines(SetPtsR *line2, double *desv=NULL); + virtual double disMedLines(SetPtsR *line2, double *desv=NULL, BOOL usa_z = FALSE); }; diff --git a/GeometryFunction.cpp b/GeometryFunction.cpp index 3ba6a59..feb856d 100644 --- a/GeometryFunction.cpp +++ b/GeometryFunction.cpp @@ -84,7 +84,8 @@ double GeometryFunction::DpSeg(double* s1, double *s2, double *p, double *lamb) return dis; } //***************************************************************************************** -double GeometryFunction::DisPtoLine(SetPtsR* line, double*p, int* idpto, double *lamb) +//si usa_z, descarta puntos de distinta z (los pone a dist infinita) +double GeometryFunction::DisPtoLine(SetPtsR* line, double*p, int* idpto, double *lamb, BOOL usa_z) { int nn = line->getNumberPtos(); double dis = DBL_MAX; @@ -105,6 +106,11 @@ double GeometryFunction::DisPtoLine(SetPtsR* line, double*p, int* idpto, double for(int i =1; igetPto(i); + if (usa_z) + { + if ((p[2] != p1[2]) || (p[2] != p2[2])) + return DBL_MAX; + } disa=DpSeg(p1,p2,p,&laux); if(disagetPto(i); - dis = DisPtoLine(line2,p); + dis = DisPtoLine(line2,p, NULL,NULL,usa_z); dd+=dis/n; dd2+=Poten(dis)/n; i++; diff --git a/GeometryFunction.h b/GeometryFunction.h index 90095c8..f156fc7 100644 --- a/GeometryFunction.h +++ b/GeometryFunction.h @@ -32,9 +32,9 @@ public: //calcula envoltura convexa static Cgarray* EnvConvex(SetPtsR* pts, Cgarray* dst); //distancia de un punto a una linea - static double DisPtoLine(SetPtsR* line, double*p, int* idpto=NULL, double *lamb=NULL); + static double DisPtoLine(SetPtsR* line, double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z = FALSE); //distancia media entre dos líneas - static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv=NULL); + static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv=NULL, BOOL usa_z =FALSE); static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double l_avan, double *desv=NULL); //parte una linea en 2 static bool DivLine(SetPtsR* linesrc, SetPtsW* ldst1, SetPtsW* ldst2, double dis);