void InterpolateBeizers(std::vector& points,
bool bClosedCurve,
double smoothValue,
std::vector<:vector>>& beizers)
{
int size=points.size();
if (size<3)
return;
//if is close curve then add the first point at the end
if (bClosedCurve)
points.push_back(points.at(0));
for (int i=0;i
{
// Assume we need to calculate the control
// points between (x1,y1) and (x2,y2).
// Then x0,y0 - the previous vertex,
// x3,y3 - the next one.
double x1=points[i].x();
double y1=points[i].y();
double x2=points[i+1].x();
double y2=points[i+1].y();
double x0=0.0;
double y0=0.0;
if (i==0) //if is first point
{
if (bClosedCurve)
{
QPointF& previousPoint=points[size-2];//last Point, but one (due inserted the first at the end)
x0=previousPoint.x();
y0=previousPoint.y();
}
else //Get some previouse point
{
QPointF& previousPoint=points[i]; //if is the first point the previous one will be it self
x0=previousPoint.x();
y0=previousPoint.y();
}
}
else
{
x0=points[i-1].x(); //Previous Point
y0=points[i-1].y();
}
double x3=0.0;
double y3=0.0;
if (i==size-2) //if is the last point
{
if (bClosedCurve)
{
QPointF& nextPoint=points[1]; //second Point(due inserted the first at the end)
x3=nextPoint.x();
y3=nextPoint.y();
}
else //Get some next point
{
QPointF& nextPoint=points[i+1]; //if is the last point the next point will be the last one
x3=nextPoint.x();
y3=nextPoint.y();
}
}
else
{
x3=points[i+2].x(); //Next Point
y3=points[i+2].y();
}
double xc1=(x0+x1)*0.5;
double yc1=(y0+y1)*0.5;
double xc2=(x1+x2)*0.5;
double yc2=(y1+y2)*0.5;
double xc3=(x2+x3)*0.5;
double yc3=(y2+y3)*0.5;
double len1=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
double len2=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
double len3=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
double k1=len1/(len1+len2);
double k2=len2/(len2+len3);
double xm1=xc1+(xc2-xc1)*k1;
double ym1=yc1+(yc2-yc1)*k1;
double xm2=xc2+(xc3-xc2)*k2;
double ym2=yc2+(yc3-yc2)*k2;
// Resulting control points. Here smooth_value is mentioned
// above coefficient K whose value should be in range [0...1].
double ctrl1_x=xm1+(xc2-xm1)*smoothValue+x1-xm1;
double ctrl1_y=ym1+(yc2-ym1)*smoothValue+y1-ym1;
double ctrl2_x=xm2+(xc2-xm2)*smoothValue+x2-xm2;
double ctrl2_y=ym2+(yc2-ym2)*smoothValue+y2-ym2;
std::vector beizer;
QPointF startPoint(x1,y1);
QPointF endPoint(x2,y2);
QPointF firstControlPoint=(i==0&&!bClosedCurve?QPointF(x1,y1):QPointF(ctrl1_x,ctrl1_y));
QPointF secondControlPoint=(i==points.size()-2&&!bClosedCurve?QPointF(x2,y2):QPointF(ctrl2_x,ctrl2_y));
beizer.push_back(startPoint);
beizer.push_back(endPoint);
beizer.push_back(firstControlPoint);
beizer.push_back(secondControlPoint);
beizers.push_back(beizer);
}
}