static int Factorial(int number)
{
int factorial = 1;
int temp = number;
for (int i = 0; i < number; ++i)
{
factorial *= temp;
--temp;
}
return factorial;
}
static int Combination(int count, int r) {
return Factorial(count) / (Factorial(r) * Factorial(count - r));
}
static float BezierLenth(const CCPoint points[], int points_count)
{
std::vector<CCPoint> move_points;
move_points.clear();
move_points.push_back(points[0]);
int index = 0;
CCPoint temp_pos;
float t = 0.f;
int count = points_count - 1;
float temp_value = 0.f;
float lenth = 0;
CCPoint oldP = points[0];
while (t < 1.0f)
{
temp_pos.x = 0.f;
temp_pos.y = 0.f;
index = 0;
while (index <= count)
{
temp_value = std::pow(t, (float)index) * std::pow(1.f - t, float(count - index)) * Combination(count, index);
temp_pos.x += points[index].x * temp_value;
temp_pos.y += points[index].y * temp_value;
++index;
}
move_points.push_back(temp_pos);
CCPoint tempP = CCPoint((temp_pos.x - oldP.x), (temp_pos.y - oldP.y));
lenth += sqrt( tempP.x*tempP.x+ tempP.y*tempP.y );
oldP = temp_pos;
t += 0.002f;
}
CCPoint tempP = CCPoint((points[points_count - 1].x - oldP.x), (points[points_count - 1].y - oldP.y));
lenth += sqrt( tempP.x*tempP.x+ tempP.y*tempP.y );
return lenth;
}
<pre name="code" class="cpp">void FishArmature::update( float dt )
{
m_pastDt+=(dt)/m_duration;
int b = move_points.size()*(m_pastDt+m_pastDuration/m_duration);
if (b>=move_points.size())
{
swimDonCallback();
return;
}
this->m_armature->setPosition(move_points[b]);
if(oldPosition.x == m_armature->getPosition().x && oldPosition.y == m_armature->getPosition().y )
{
return;
}
CCPoint dp = oldPosition - m_armature->getPosition();
float deg = CC_RADIANS_TO_DEGREES(atan2(dp.x,dp.y));
m_armature->setRotation(deg );
oldPosition = m_armature->getPosition();
//CCLOG("%f", m_pastDt);
}