Cambio para poder emplear la z al calcular la distancia 2D, si tienen z distinta, le pone dist 2D infinita

master
Elena 2023-02-07 23:51:37 +01:00
parent 8000b28924
commit ea591c698d
6 changed files with 20 additions and 14 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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);
}
//*****************************************************************************************

View File

@ -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);
};

View File

@ -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; i<nn; i++)
{
p2 = line->getPto(i);
if (usa_z)
{
if ((p[2] != p1[2]) || (p[2] != p2[2]))
return DBL_MAX;
}
disa=DpSeg(p1,p2,p,&laux);
if(disa<dis)
{
@ -344,7 +350,7 @@ double GeometryFunction::DisMedLines( SetPtsR* line1, SetPtsR* line2, double l_a
//*****************************************************************************************
//Siempre se le debe llamar de forma que line1 sea de menor longitud que line2
//calculando la distancia de los puntos de line1 a line2
double GeometryFunction::DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv/*=NULL*/)
double GeometryFunction::DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv/*=NULL*/, BOOL usa_z /*=FALSE*/)
{
double dis, dd, dd2;
int i,n;
@ -357,7 +363,7 @@ double GeometryFunction::DisMedLines( SetPtsR* line1, SetPtsR* line2, double *de
while(i<n)
{
p=line1->getPto(i);
dis = DisPtoLine(line2,p);
dis = DisPtoLine(line2,p, NULL,NULL,usa_z);
dd+=dis/n;
dd2+=Poten(dis)/n;
i++;

View File

@ -32,9 +32,9 @@ public:
//calcula envoltura convexa
static Cgarray<double[3]>* EnvConvex(SetPtsR* pts, Cgarray<double[3]>* 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);