195 lines
4.7 KiB
C++
195 lines
4.7 KiB
C++
#include "StdAfx.h"
|
||
#include "CartoBaseElements.h"
|
||
#include "CartoElements.h"
|
||
#include "CartoBase.h"
|
||
#include "GeometryFunction.h"
|
||
//*****************************************************************************************
|
||
CartoBaseEntity* CartoComun::get(CartoBaseEntity * dst)
|
||
{
|
||
dst->flagsUser = flagsUser;
|
||
dst->ia=ia;
|
||
dst->type = getType();
|
||
return dst;
|
||
}
|
||
//*****************************************************************************************
|
||
CartoBasePaintedProps* CartoComun::get(CartoBasePaintedProps * dst)
|
||
{
|
||
dst->peso = peso;
|
||
return dst;
|
||
}
|
||
//*****************************************************************************************
|
||
CartoBaseColor* CartoComun::get(CartoBaseColor * dst)
|
||
{
|
||
dst->color = color;
|
||
return dst;
|
||
}
|
||
//*****************************************************************************************
|
||
bool CartoComun::setInfo(CartoBaseInfoEntity * info)
|
||
{
|
||
CartoBaseEntity *e =info->entity();
|
||
CartoBaseColor *c =info->color();
|
||
CartoBasePaintedProps *p =info->paintp();
|
||
if(!e || !c || !p)
|
||
return false;
|
||
flagsUser = e->flagsUser;
|
||
color= c->color;
|
||
peso= p->peso;
|
||
id= e->id;
|
||
return true;
|
||
}
|
||
//*****************************************************************************************
|
||
CartoEntity* CartoPto::set(CartoBaseInfoEntity *src)
|
||
{
|
||
if(!setInfo(src))
|
||
return NULL;
|
||
CartoBasePoint *p = src->pto();
|
||
if(!p)
|
||
return NULL;
|
||
memcpy(pt,p->pts,sizeof(double)*3);
|
||
return this;
|
||
}
|
||
//*****************************************************************************************
|
||
double* CartoPto::getPto(int i)
|
||
{
|
||
if(i==0)
|
||
return pt;
|
||
return NULL;
|
||
}
|
||
//*****************************************************************************************
|
||
int CartoPto::CopyInTo(CartoBase *src)
|
||
{
|
||
CartoBaseEntity e;
|
||
CartoBasePaintedProps p;
|
||
CartoBaseColor c;
|
||
CartoBasePoint pt;
|
||
memcpy(pt.pts, &this->pt, sizeof(double)*3);
|
||
e.id = src->add(&pt);
|
||
|
||
if(idPropsP<0)
|
||
{
|
||
p.color = src->add(get(&c));
|
||
if(p.color<0)
|
||
return -1;
|
||
e.idPaintp = src->add(get(&p));
|
||
}
|
||
else
|
||
e.idPaintp = idPropsP;
|
||
|
||
if(e.idPaintp<-1)
|
||
return -1;
|
||
if(e.id<-1)
|
||
return -1;
|
||
return src->add(get(&e));
|
||
}
|
||
//*****************************************************************************************
|
||
double* CartoLine::getPto(int i)
|
||
{
|
||
return pts[i];
|
||
}
|
||
//*****************************************************************************************
|
||
double CartoLine::getLong()
|
||
{
|
||
return GeometryFunction::LongLine2d(this);
|
||
}
|
||
//*****************************************************************************************
|
||
double *CartoLine::GetPtoDis(double dis, double *dst, double *distTot)
|
||
{
|
||
return GeometryFunction::GetPto(this, dis, dst, distTot);
|
||
}
|
||
//*****************************************************************************************
|
||
bool CartoLine::addPto(double *p)
|
||
{
|
||
if(!(pts+=1))
|
||
return false;
|
||
pts.n++;
|
||
memcpy(pts[pts.n-1],p, sizeof(double)*3);
|
||
return true;
|
||
|
||
}
|
||
//*****************************************************************************************
|
||
CartoEntity* CartoLine::set(CartoBaseInfoEntity *src)
|
||
{
|
||
if(!setInfo(src))
|
||
return NULL;
|
||
CartoBaseLine *l = src->line();
|
||
if(!l)
|
||
return NULL;
|
||
pts.n = 0;
|
||
pts+=l->n;
|
||
pts.n = l->n;
|
||
CartoBasePoint *p = src->pto();
|
||
for(int i =0 ; i<l->n; i++)
|
||
{
|
||
memcpy(pts.ptr[i],p->pts,sizeof(double)*3);
|
||
p=&p[1];
|
||
}
|
||
return this;
|
||
}
|
||
//*****************************************************************************************
|
||
int CartoLine::CopyInTo(CartoBase *src)
|
||
{
|
||
if(pts.n<=0)
|
||
return -1;
|
||
|
||
CartoBaseEntity e;
|
||
CartoBasePaintedProps p;
|
||
CartoBaseColor c;
|
||
CartoBasePoint pt;
|
||
CartoBaseLine l;
|
||
|
||
l.n= pts.n;
|
||
if(!(src->_lines+=pts.n))
|
||
return -1;
|
||
memcpy(pt.pts,pts[0], sizeof(double)*3);
|
||
l.ini = src->add(&pt);
|
||
|
||
for(int i = 1; i<pts.n; i++)
|
||
{
|
||
memcpy(pt.pts,pts[i], sizeof(double)*3);
|
||
src->add(&pt);
|
||
}
|
||
|
||
if(idPropsP<0)
|
||
{
|
||
p.color = src->add(get(&c));
|
||
if(p.color<0)
|
||
return -1;
|
||
e.idPaintp = src->add(get(&p));
|
||
}
|
||
else
|
||
e.idPaintp = idPropsP;
|
||
|
||
if(e.idPaintp<-1)
|
||
return -1;
|
||
e.id = src->add(&l);
|
||
if(e.id<-1)
|
||
return -1;
|
||
return src->add(get(&e));
|
||
}
|
||
//*****************************************************************************************
|
||
void CartoLine::invert()
|
||
{
|
||
int ini =0;
|
||
int fin =pts.n-1;
|
||
double d;
|
||
while(ini<fin)
|
||
{
|
||
for(int i =0; i<3; i++)
|
||
{
|
||
d=pts[ini][i];
|
||
pts[ini][i]=pts[fin][i];
|
||
pts[fin][i] = d;
|
||
}
|
||
ini++;
|
||
fin--;
|
||
}
|
||
}
|
||
//*****************************************************************************************
|
||
//*****************************************************************************************
|
||
//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)
|
||
{
|
||
return GeometryFunction::DisMedLines(this,line2,desv);
|
||
}
|
||
//*****************************************************************************************
|