C++ 生成Catmull-Rom样条曲线并返回垃圾
创建Catmull Rom样条曲线后,例如:C++ 生成Catmull-Rom样条曲线并返回垃圾,c++,math,graphics,curves,C++,Math,Graphics,Curves,创建Catmull Rom样条曲线后,例如: vector3 SplineVector = newSpline.createCatmulRomSpline(vectorOne, vectorTwo, vectorThree, vectorFour, i); 然而,当我从 vector3 SplineVector 我得到垃圾值 下面是我的样条线类的列表,是我的vector3类的一段,在初始化的实现中 初始化: for(float i = 0.0f; i <= 1.0f; i += 0.1
vector3 SplineVector = newSpline.createCatmulRomSpline(vectorOne, vectorTwo, vectorThree, vectorFour, i);
然而,当我从
vector3 SplineVector
我得到垃圾值
下面是我的样条线类的列表,是我的vector3类的一段,在初始化的实现中
初始化:
for(float i = 0.0f; i <= 1.0f; i += 0.1f)
{
vector3 SplineVector = newSpline.createCatmulRomSpline(vectorOne, vectorTwo, vectorThree, vectorFour, i);
cout << "\n\ncurve pos X: " << SplineVector.getx();
cout << "\ncurve pos Y: " << SplineVector.gety();
cout << "\ncurve pos Z: " << SplineVector.getz();
}
class vector3
{
public:
vector3::vector3():x(0),y(0),z(0)
{
}
vector3::~vector3()
{
}
vector3(float);
vector3(float inx,float iny,float inz): x(inx), y(iny), z(inz)
{
}
//Vector operators
_inline vector3 operator=(const vector3& invec){ // Assignment
return vector3(this->x=invec.x,this->y=invec.y,this->z=invec.z);
}
_inline vector3 operator+(const vector3& invec){//Addition
return vector3(this->x+invec.x,this->y+invec.y,this->z+invec.z);
}
_inline vector3 operator-(const vector3& invec){//Subtraction
return vector3(this->x-invec.x,this->y-invec.y,this->z-invec.z);
}
_inline vector3 operator*(const vector3& invec){//Multiplication
return vector3(this->x*invec.x,this->y*invec.y,this->z*invec.z);
}
_inline vector3 operator/(const vector3& invec){//Division
return vector3(this->x/invec.x,this->y/invec.y,this->z/invec.z);
}
//Scaler operators
_inline vector3& operator+=(const float& scaler){//Addition self-assignment
return vector3(this->x+=scaler,this->y+=scaler,this->z+=scaler);
}
_inline vector3& operator-=(const float& scaler){//Subtraction self-assignment
return vector3(this->x-=scaler,this->y-=scaler,this->z-=scaler);
}
_inline vector3& operator*=(const float& scaler){//Multiplication self-assignment
return vector3(this->x*=scaler,this->y*=scaler,this->z*=scaler);
}
_inline vector3& operator*(const float& scalar){
return vector3(this->x*scalar, this->y*scalar, this->z*scalar);
}
//Math methods
_inline vector3 operator^(vector3& invec){//Cross product
return vector3( (this->y*invec.z-this->z*invec.y),
(this->z*invec.x-this->x*invec.z),
(this->x*invec.y-this->y*invec.x));
}
_inline vector3 operator&(vector3& invec){//Dot product
return (this->x*invec.x)+(this->y*invec.y)+(this->z*invec.z);
}
_inline vector3 distance(vector3&);//Distance
_inline void normalize(){
float mag = sqrtf(this->x*this->x+this->y*this->y+this->z*this->z);
this->x/=mag;
this->y/=mag;
this->z/=mag;
}
float x;
float y;
float z;
float getx();
float gety();
float getz();
float getMagnitude();
private:
float mag;
};
Catmull Rom样条线生成
_inline vector3 createCatmulRomSpline(vector3 P0, vector3 P1, vector3 P2, vector3 P3, float t)
{
float t2 = t*t;
float t3 = t2*t;
vector3 result = ((P1*2) + (P2 - P0) * t + (P0*2 - P1 * 5 + P2*4 - P3)*t2 + (P1*3 - P0- P2*3 + P3) * t3)*0.5f;
return result;
}
我曾经尝试过其他人的代码,当涉及到将数据输出到最终向量时,它会输出虚假的值 您的操作符有很多地方出了问题,尽管大多数都没有使用。我修改了你的课程。我注意到您没有显示
getx()
(etc)成员的代码。我内联实现了这些,但也许是它们造成了垃圾?这是我修改过的测试程序。看起来效果不错:
class vector3
{
public:
vector3::vector3()
:x(0), y(0), z(0)
{}
vector3::~vector3()
{}
vector3(float inx,float iny,float inz)
: x(inx), y(iny), z(inz)
{}
//Vector operators
_inline vector3& operator=(const vector3& invec) { // Assignment
x = invec.x;
y = invec.y;
z = invec.z;
return *this;
}
_inline vector3 operator+(const vector3& invec) const {//Addition
return vector3(x+invec.x,y+invec.y,z+invec.z);
}
_inline vector3 operator-(const vector3& invec) const {//Subtraction
return vector3(x-invec.x,y-invec.y,z-invec.z);
}
_inline vector3 operator*(const vector3& invec) const {//Multiplication
return vector3(x*invec.x,y*invec.y,z*invec.z);
}
_inline vector3 operator/(const vector3& invec) const {//Division
return vector3(x/invec.x,y/invec.y,z/invec.z);
}
//scalar operators
_inline vector3& operator+=(const float& scalar){//Addition self-assignment
x+=scalar,y+=scalar,z+=scalar;
return *this;
}
_inline vector3& operator-=(const float& scalar){//Subtraction self-assignment
x-=scalar,y-=scalar,z-=scalar;
return *this;
}
_inline vector3& operator*=(const float& scalar){//Multiplication self-assignment
x*=scalar,y*=scalar,z*=scalar;
return *this;
}
_inline vector3 operator*(const float& scalar) const {
return vector3(x*scalar, y*scalar, z*scalar);
}
//Math methods
_inline vector3 operator^(const vector3& invec) const {//Cross product
return vector3( (y*invec.z-z*invec.y),
(z*invec.x-x*invec.z),
(x*invec.y-y*invec.x));
}
_inline float operator&(const vector3& invec) const {//Dot product
return (x*invec.x)+(y*invec.y)+(z*invec.z);
}
_inline float distance(vector3&) const;//Distance
_inline void normalize(){
float mag = sqrtf(x*x+y*y+z*z);
x/=mag;
y/=mag;
z/=mag;
}
float x;
float y;
float z;
_inline float getx() const { return x; }
_inline float gety() const { return y; }
_inline float getz() const { return z; }
float getMagnitude() const;
};
_inline vector3 createCatmulRomSpline(vector3 P0, vector3 P1, vector3 P2, vector3 P3, float t)
{
float t2 = t*t;
float t3 = t2*t;
vector3 result = ((P1*2) + (P2 - P0) * t + (P0*2 - P1 * 5 + P2*4 - P3)*t2 + (P1*3 - P0- P2*3 + P3) * t3)*0.5f;
return result;
}
int main() {
vector3 vectorOne(0,0,0);
vector3 vectorTwo(5,10,1);
vector3 vectorThree(10,10,2);
vector3 vectorFour(15,0,3);
const int ndiv = 10;
for( int i = 0; i <= ndiv; i++ )
{
float t = (float)i / ndiv;
vector3 SplineVector = createCatmulRomSpline(vectorOne, vectorTwo, vectorThree, vectorFour, t);
cout << "curve pos X: " << SplineVector.getx() << "\n";
cout << "curve pos Y: " << SplineVector.gety() << "\n";
cout << "curve pos Z: " << SplineVector.getz() << "\n\n";
}
return 0;
}
类向量3
{
公众:
vector3::vector3()
:x(0),y(0),z(0)
{}
向量3::~vector3()
{}
矢量3(浮点inx、浮点iny、浮点inz)
:x(inx),y(iny),z(inz)
{}
//向量算子
_内联向量3和运算符=(常量向量3和invec){//赋值
x=invec.x;
y=投资收益;
z=invec.z;
归还*这个;
}
_内联向量3运算符+(常量向量3&invec)常量{//加法
返回向量3(x+invec.x,y+invec.y,z+invec.z);
}
_内联向量3运算符-(常量向量3&invec)常量{//减法
返回向量3(x-invec.x,y-invec.y,z-invec.z);
}
_内联向量3运算符*(常量向量3&invec)常量{//乘法
返回向量3(x*invec.x,y*invec.y,z*invec.z);
}
_内联向量3运算符/(常量向量3&invec)常量{//除法
返回向量3(x/invec.x,y/invec.y,z/invec.z);
}
//标量算子
_内联向量3和运算符+=(常量浮点和标量){//加法自赋值
x+=标量,y+=标量,z+=标量;
归还*这个;
}
_内联向量3和运算符-=(常量浮点和标量){//减法自赋值
x-=标量,y-=标量,z-=标量;
归还*这个;
}
_内联向量3和运算符*=(常量浮点和标量){//乘法自赋值
x*=标量,y*=标量,z*=标量;
归还*这个;
}
_内联向量3运算符*(常量浮点和标量)常量{
返回向量3(x*标量,y*标量,z*标量);
}
//数学方法
_内联向量3运算符^(常量向量3&invec)常量{//叉积
返回向量3((y*invec.z-z*invec.y),
(z*invec.x-x*invec.z),
(x*invec.y-y*invec.x));
}
_内联浮点运算符&(常量向量3&invec)常量{//点积
返回值(x*invec.x)+(y*invec.y)+(z*invec.z);
}
_内联浮点距离(矢量3&)常量;//距离
_内联void normalize(){
浮动磁极=sqrtf(x*x+y*y+z*z);
x/=mag;
y/=mag;
z/=mag;
}
浮动x;
浮动y;
浮动z;
_内联浮点getx()常量{return x;}
_内联浮点gety()常量{return y;}
_内联浮点getz()常量{return z;}
float getmagnity()常量;
};
_内联向量3创建CATmulromSpline(向量3 P0、向量3 P1、向量3 P2、向量3 P3、浮点t)
{
浮点数t2=t*t;
浮点数t3=t2*t;
向量3结果=((P1*2)+(P2-P0)*t+(P0*2-P1*5+P2*4-P3)*t2+(P1*3-P0-P2*3+P3)*t3)*0.5f;
返回结果;
}
int main(){
向量3-向量酮(0,0,0);
向量3向量2(5,10,1);
矢量3矢量三(10,10,2);
向量3向量4(15,0,3);
常数int ndiv=10;
对于(int i=0;i),代码看起来是合理的。您应该打印vectorwo
、vectorThree
和vectorFour
的值,看看它们是否看起来也是假的。谢谢您,我感谢您的帮助。