資源簡介
生成經過首尾節點的三次均勻B樣條曲線,代碼簡單,適合初學者

代碼片段和文件信息
#include?“stdafx.h“
#include?“BSpline.h“
#include?
BSpline::BSpline()?:?_degree(3)
{
}
BSpline::~BSpline()
{
}
double?BSpline::EvalBasis(double?u?int?i?int?degree)?const
{
if?(degree?==?0)
{
if?(u?>=?_knots[i]?&&?u? {
return?1.0;
}
else
{
return?0.0;
}
}
double?l0?=?u?-?_knots[i];
double?l1?=?_knots[i?+?degree]?-?_knots[i];
double?l2?=?Divide(l0?l1);
double?k0?=?_knots[i?+?degree?+?1]?-?u;
double?k1?=?_knots[i?+?degree?+?1]?-?_knots[i?+?1];
double?k2?=?Divide(k0?k1);
double?res?=?l2?*?EvalBasis(u?i?degree?-?1)?+?k2?*?EvalBasis(u?i?+?1?degree?-?1);
return?res;
}
double?BSpline::Divide(double?x?double?y)?const
{
if?(y?==?0.0)
{
return?0.0;
}
return?x?/?y;
}
void?BSpline::Add(osg::Vec3d?vertex)?
{
_vertexs.push_back(vertex);
}
osg::Vec3dArray*?BSpline::Generate(int?iStep)?const
?{
if?(_vertexs.size()?4)
{
return?NULL;
}
InitKnots();
int?iLen?=?_knots.size();
double?dStart?=?_knots[0];
double?dEnd?=?_knots[iLen?-?1];
double?dDelta?=?(dEnd?-?dStart)?/?iStep;
osg::ref_ptr?v3dArray?=?new?osg::Vec3dArray;
for?(int?s?=?0;?s?<=?iStep;?s++)
{
double?u?=?s?*?dDelta;
osg::Vec3d?v;
double?sum?=?0.0;
for?(int?i?=?0;?i? {
double?t?=?EvalBasis(u?i?_degree);
v?+=?_vertexs.at(i)?*?t;
sum?+=?t;
}
if?(v?!=?osg::Vec3d())
{
v3dArray->push_back(v);
}
}
return?v3dArray.release();
}
void?BSpline::InitKnots()?const
{
std::size_t?count?=?_vertexs.size();//_vertexs是控制點數組
for?(int?i?=?0;?i? {
_knots.push_back(0.0);?//前p個0
}
double?dParam?=?0.0;
for?(std::size_t?i?=?0;?i? {
if?(i?>?0)
dParam?+=?1.0;
_knots.push_back(dParam);
}
for?(std::size_t?i?=?0;?i? {
_knots.push_back(dParam);?//后p個?0
}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2091??2016-11-03?17:40??BSpline.cpp
?????文件????????552??2016-11-03?17:40??BSpline.h
-----------?---------??----------?-----??----
?????????????????2643????????????????????2
- 上一篇:downloadfrompan.txt
- 下一篇:電流保護PSCAD
評論
共有 條評論