98 lines
3.1 KiB
C++
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;
|
|
}
|
|
}
|