#ifndef __CURVE_H__
#define __CURVE_H__
#include "path2d.h"
#pragma pack(4)
typedef struct{
int type;
double minX, maxX;
double minY, maxY;
double x0, y0;
} POINTDATA;
typedef struct{
int type;
double minX, maxX;
double minY, maxY;
double x0, y0;
double x1, y1;
BOOL valid;
} LINEDATA;
typedef struct{
int type;
double minX, maxX;
double minY, maxY;
double x0, y0;
double x1, y1;
double x2, y2;
BOOL valid;
} QUADDATA;
typedef struct{
int type;
double minX, maxX;
double minY, maxY;
double x0, y0;
double x1, y1;
double x2, y2;
double x3, y3;
BOOL valid;
} CUBICDATA;
typedef struct{
int type;
double minX, maxX;
double minY, maxY;
} COMMONDATA;
typedef struct{
union {
int type;
COMMONDATA c;
POINTDATA pt;
LINEDATA line;
QUADDATA quad;
CUBICDATA cubic;
} u;
} CURVEDATA;
#pragma pack()
double CurveGetX(CURVEDATA *curve, double t);
double CurveGetY(CURVEDATA *curve, double t);
double CurveGetX0(CURVEDATA *curve);
double CurveGetY0(CURVEDATA *curve);
double CurveGetX1(CURVEDATA *curve);
double CurveGetY1(CURVEDATA *curve);
void InitPointData(CURVEDATA *curve, double x, double y);
void InitLineData(CURVEDATA *curve, double x0, double y0, double x1, double y1);
void InitQuadData(CURVEDATA *curve, double *params);
void InitCubicData(CURVEDATA *curve, double *params);
void SplitCurve(
CURVEDATA *curve,
CURVEDATA *curveLeft,
CURVEDATA *curveRight,
double t
);
CURVEDATA *ReduceCurve(
CURVEDATA *curve,
CURVEDATA *curveDst,
double tMin,
double tMax
);
int FindInflectionPoints(CURVEDATA *curve, double *inflections);
int YDirection(CURVEDATA *curve, BOOL yaxis, double y, double t);
int SolveCurve(CURVEDATA *curve, BOOL yaxis, double y, double *r);
BOOL IsHorizontalLine(CURVEDATA * curve);
void DebugOutCurve(CURVEDATA *curve);
BOOL CurvesEqual(CURVEDATA *a, CURVEDATA *b);
double CurveLength(CURVEDATA *curve);
#endif