JD2022-TU1/main/extern/Camcam/LIBS/Trackeur/Spline.cpp

79 lines
2.1 KiB
C++

#include "track.h"
#include "ASM.h"
void SPLINE3_GetSplinePoint3(float F, Vector *OUTVc,Vector *P)
{
float F2 = F * F;
*OUTVc = P[0] * F * F2 + P[1] * F2 + P[2] * F + P[3];
}
void SPLINE3_GetNurbPoint3(float F, Vector *OUTVc,Vector *P)
{
SPLINE3_GetSplinePoint3(F, OUTVc,P);
*OUTVc *= 1.0f/ OUTVc->z;
}
/*
D² = F²(A - 2B + C) + F(2B - 2A) + A
D³ = F³(-A + 3B - 3C + D) + F²(3A - 6B + 3C) + F(3B - 3A) + A
*/
void SPLINE3_GetSplineParams3(Vector *P1,Vector *P2,Vector *P3,Vector *P4,Vector *OutputP)
{
//F³(-A + 3B - 3C + D)
OutputP[0] = *P1 *-1.0f + *P2 * 3.0f - *P3 * 3.0f + *P4;
//F²(3A - 6B + 3C)
OutputP[1] = *P1 * 3.0f - *P2 * 6.0f + *P3 * 3.0f;
//F(3B - 3A)
OutputP[2] = *P2 * 3.0f - *P1 * 3.0f;
//A
OutputP[3] = *P1;
}
void SPLINE3_GetNurbParams3(Vector *P1,Vector *P2,Vector *P3,Vector *P4,Vector *OutputP)
{
Vector hP1,hP2,hP3,hP4;
hP1 = *P1;hP2 = *P2;hP3 = *P3;hP4 = *P4;
hP1.x *= hP1.z;
hP1.y *= hP1.z;
hP2.x *= hP2.z;
hP2.y *= hP2.z;
hP3.x *= hP3.z;
hP3.y *= hP3.z;
hP4.x *= hP4.z;
hP4.y *= hP4.z;
SPLINE3_GetSplineParams3(&hP1,&hP2,&hP3,&hP4,OutputP);
}
void SPLINE3_DrawSpline3(MAP *pSrc,Vector *P1,Vector *P2,Vector *P3,Vector *P4)
{
Vector Params[4];
Vector PointP,PointC;
/* DrawLine(pSrc,P1->x,P1->y,P2->x,P2->y,0xffff00);
DrawLine(pSrc,P3->x,P3->y,P2->x,P2->y,0xffff00);
DrawLine(pSrc,P3->x,P3->y,P4->x,P4->y,0xffff00);//*/
SPLINE3_GetSplineParams3(P1,P2,P3,P4,Params);
SPLINE3_GetSplinePoint3(0.0f,&PointP,Params);
for (int i = 1 ; i < 30 ; i++)
{
SPLINE3_GetSplinePoint3((float)i/30.0f,&PointC,Params);
DrawLine(pSrc,PointC.x,PointC.y,PointP.x,PointP.y,0xffff);
PointP = PointC;
}
}
void SPLINE3_DrawNurb3(MAP *pSrc,Vector *P1,Vector *P2,Vector *P3,Vector *P4)
{
Vector Params[4];
Vector PointP,PointC;
/* DrawLine(pSrc,P1->x,P1->y,P2->x,P2->y,0xffff00);
DrawLine(pSrc,P3->x,P3->y,P2->x,P2->y,0xffff00);
DrawLine(pSrc,P3->x,P3->y,P4->x,P4->y,0xffff00);//*/
SPLINE3_GetNurbParams3(P1,P2,P3,P4,Params);
SPLINE3_GetNurbPoint3(0.0f,&PointP,Params);
for (int i = 1 ; i < 30 ; i++)
{
SPLINE3_GetNurbPoint3((float)i/30.0f,&PointC,Params);
DrawLine(pSrc,PointC.x,PointC.y,PointP.x,PointP.y,0xffff);
PointP = PointC;
}
}