Files
Work/mdiwin/MESHFRM.CPP
2024-08-07 09:16:27 -04:00

98 lines
3.1 KiB
C++

#include <mdiwin/meshfrm.hpp>
WORD MeshFrames::interpolateMeshFrames(Vector<FloatPairs> &srcPairs,Vector<FloatPairs> &dstPairs,Vector<VectoredPairs> &meshVectors,int nFrames)
{
Vector<FloatPairs> resamplePairs;
Vector<FloatPairs> tempPairs;
CatmullRom catmullRom;
size_t vectorSize((int)srcPairs.size());
meshVectors.size(nFrames);
resamplePairs.size(nFrames);
tempPairs.size(MaxTempPairs);
for(int i=0;i<nFrames;i++)meshVectors[i].size(vectorSize);
for(i=0;i<vectorSize;i++)
{
if(distanceBetween(srcPairs[i],dstPairs[i]))
{
if(srcPairs[i].column()!=dstPairs[i].column())
{
tempPairs[SourceTempPair].setPairs(srcPairs[i].column(),srcPairs[i].row());
tempPairs[DestTempPair].setPairs(dstPairs[i].column(),dstPairs[i].row());
distributeMeshPoints(srcPairs[i].column(),dstPairs[i].column(),resamplePairs);
catmullRom.performSpline(tempPairs,resamplePairs);
replaceMeshColumn(meshVectors,resamplePairs,i);
}
else
{
tempPairs[SourceTempPair].setPairs(srcPairs[i].row(),srcPairs[i].column());
tempPairs[DestTempPair].setPairs(dstPairs[i].row(),dstPairs[i].column());
distributeMeshPoints(srcPairs[i].row(),dstPairs[i].row(),resamplePairs);
catmullRom.performSpline(tempPairs,resamplePairs);
for(int j=0;j<nFrames;j++)resamplePairs[j].setPairs(srcPairs[i].column(),resamplePairs[j].column());
replaceMeshColumn(meshVectors,resamplePairs,i);
}
}
else
{
for(int j=0;j<nFrames;j++)resamplePairs[j].setPairs(srcPairs[i].column(),dstPairs[i].row());
replaceMeshColumn(meshVectors,resamplePairs,i);
}
}
return TRUE;
}
void MeshFrames::distributeMeshPoints(float srcPoint,float dstPoint,Vector<FloatPairs> &resamplePairs)
{
int nFrames((int)resamplePairs.size());
int index;
double incremental;
double i;
if(dstPoint>srcPoint)
{
incremental=((double)dstPoint-(double)srcPoint)/(double)nFrames;
for(i=srcPoint+incremental,index=0;index<nFrames;i+=incremental,index++)
resamplePairs[index].column(i);
}
else
{
incremental=((double)srcPoint-(double)dstPoint)/(double)nFrames;
for(i=srcPoint-incremental,index=0;index<nFrames;i-=incremental,index++)
resamplePairs[index].column(i);
}
}
void MeshFrames::replaceMeshColumn(Vector<VectoredPairs> &meshVectors,Vector<FloatPairs> &resamplePairs,int meshRow)
{
int nFrames((int)resamplePairs.size());
if(nFrames!=meshVectors.size())return;
for(int i=0;i<nFrames;i++)
(meshVectors[i])[meshRow].setPairs(resamplePairs[i].column(),resamplePairs[i].row());
}
WORD MeshFrames::distanceBetween(FloatPairs &srcPair,FloatPairs &dstPair)const
{
float distanceBetween;
distanceBetween=
((srcPair.column()-dstPair.column())*(srcPair.column()-dstPair.column()))+
((srcPair.row()-dstPair.row())*(srcPair.row()-dstPair.row()));
return distanceBetween;
}
void MeshFrames::dumpMeshFrames(Vector<VectoredPairs> &meshVectors)
{
size_t meshCols((int)meshVectors.size());
size_t meshRows((int)meshVectors[0].size());
ofstream output("OUTPUT.DAT");
for(int row=0;row<meshRows;row++)
{
for(int col=0;col<meshCols;col++)
output << "(" << (meshVectors[col])[row].column() << "," << (meshVectors[col])[row].row() << "),";
output << endl;
}
}