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

66 lines
2.1 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <mdiwin/catmull.hpp>
WORD CatmullRom::performSpline(Vector<FloatPairs> &sourcePairs,Vector<FloatPairs> &destPairs)
{
double a0,a1,a2,a3;
double dx,dx1,dx2;
double dy,dy1,dy2;
double endPointOne,endPointTwo,resamplingPos;
double xPoint;
int clampOne,clampTwo;
int direction;
int destSize((int)destPairs.size());
int sourceSize((int)sourcePairs.size());
int inputIndex,index;
if(sourceSize<2||destSize<2)return FALSE;
if(sourcePairs[0].column()<sourcePairs[1].column())
{
if(destPairs[0].column()<sourcePairs[0].column()||
destPairs[destSize-1].column()>sourcePairs[sourceSize-1].column())
direction=0;
else direction=1;
}
else
{
if(destPairs[0].column()>sourcePairs[0].column()||
destPairs[destSize-1].column()<sourcePairs[sourceSize-1].column())
direction=0;
else direction=-1;
}
if(!direction)return FALSE;
if(1==direction)endPointTwo=destPairs[0].column()-1;
else endPointTwo=destPairs[0].column()+1;
for(index=0;index<destSize;index++)
{
resamplingPos=destPairs[index].column();
if((1==direction&&resamplingPos>endPointTwo)||
(-1==direction&&resamplingPos<endPointTwo))
{
for(inputIndex=0;
inputIndex<sourceSize&&
resamplingPos>sourcePairs[inputIndex].column();
inputIndex++);
if(resamplingPos<sourcePairs[inputIndex].column())inputIndex--;
if(inputIndex<0)inputIndex=0;
endPointOne=sourcePairs[inputIndex].column();
endPointTwo=sourcePairs[inputIndex+1].column();
clampOne=FloatPairs::max(inputIndex-1,0);
clampTwo=FloatPairs::min(inputIndex+2,sourceSize-1);
dx=1.0/(endPointTwo-endPointOne);
dx1=1.0/(endPointTwo-sourcePairs[clampOne].column());
dx2=1.0/(sourcePairs[clampTwo].column()-endPointOne);
dy=(sourcePairs[inputIndex+1].row()-sourcePairs[inputIndex].row())*dx;
dy1=(sourcePairs[inputIndex+1].row()-sourcePairs[clampOne].row())*dx1;
dy2=(sourcePairs[clampTwo].row()-sourcePairs[inputIndex].row())*dx2;
a0=sourcePairs[inputIndex].row();
a1=dy1;
a2=dx*(3*dy-2*dy1-dy2);
a3=dx*dx*(-2*dy+dy1+dy2);
}
xPoint=resamplingPos-endPointOne;
destPairs[index].row(((a3*xPoint+a2)*xPoint+a1)*xPoint+a0);
}
return TRUE;
}