最近在研究捕鱼的路径点问题。
上司要求路径由几个贝塞尔曲线的特征点来生成鱼的路径。
倒腾了一会 真没想到自己写出来了。
也算是自己毕业后写的第一个有关游戏的算法。
写这篇日志做一个笔记。这里只放出关键代码。
//首先它肯定需要一个递归调用,因为每个比例都要生成一个点,
//然而,每次计算都要从n个点计算为n-1个点,最后到一个点。这个点就是需要的路径点。
//typedef std::vector Points;
void MathAide::calcBezier(Points bps, float rat, Points &pathView)
{
Points newBezierPoints;
//如果只有一个点,那么这个点就是路径点,把他加入路径里。
if (bps.size() == 1){
pathView.push_back(bps.bezierPoints[0]);
}else{
//否则继续计算出下一轮的若干点位置
for (int i = 0; i < bps.size() - 1; i++)
{
float tpx = bps[i].x_;
float tpy = bps[i].y_;
float tlx = bps[i + 1].x_;
float tly = bps[i + 1].y_;
float nx;
float ny;
nx = tpx + (tlx - tpx)*rat;
ny = tpy + (tly - tpy)*rat;
newBezierPoints.push_back(Point(nx, ny));
}
MathAide::calcBezier(newBezierPoints, rat, pathView);
}
}//以上是一个比例,那么每个比例都要生成。
//关于调用
float fPointNumber =200.0;
for(float rat=0.0;rat<1;rat+=1/fPointNumber)
{
MathAide::calcBezier(bps,rat,pathView);
}