#pragma once
#include <stdexcept>
#include <intrin.h>
#include "Preprocessor.h"
class Vector4
{
public:
Vector4(float vx, float vy, float vz, float vw);
Vector4();
Vector4(float vx, float vy, float vz);
__forceinline explicit Vector4(__m128 m) :Vector4(m.m128_f32[0], m.m128_f32[1], m.m128_f32[2], m.m128_f32[3]) {}
Vector4 operator+(const Vector4& right)const;
Vector4 operator-(const Vector4& right)const;
Vector4 operator*(float right)const;
Vector4 operator/(float right)const;
float SquareMagnitude();
float Magnitude();
Vector4& Normalize();
float static Dot(const Vector4& left, const Vector4& right);
float Dot(const Vector4& right);
Vector4 static Cross(const Vector4& left, const Vector4& right);
Vector4 static Lerp(const Vector4& left, const Vector4& right, float t);
void standardization()
{
if (w == 0)
{
//std::cout << "error w==0" << std::endl;
return;
}
x /= w;
y /= w;
z /= w;
w = 1;
}
void Print();
__m128 getM128()
{
return _mm_set_ps(x, y, z, w);
}
__forceinline float& operator[](int index);
private:
float x, y, z, w;
};
Vector4::Vector4(float vx, float vy, float vz, float vw) :x(vx), y(vy), z(vz), w(vw) {}
Vector4::Vector4() : Vector4(0, 0, 0, 1) {}
Vector4::Vector4(float vx, float vy, float vz) :Vector4(vx, vy, vz, 1) {}
// 报错,无法访问this中的getM128函数,right更是什么成员都访问不到
Vector4 Vector4::operator+(const Vector4& right)const
{
return Vector4(_mm_add_ps(this.getM128(), right.getM128()));
}
报错:
试试:
Vector4 Vector4::operator+(const Vector4& right)const
{
return Vector4(_mm_add_ps(this->getM128(), right.getM128()));
}
对于报错原因无法确定,需要看具体的报错信息,以及四维向量类的具体实现代码。可能是定义的四维向量类中缺失了相应的成员变量或者运算符函数,或者代码中存在语法错误等问题。
一般定义四维向量类,需要定义成员变量x、y、z、w,同时重载"+"运算符方法,可以从以下两种方式中选择实现:
class FourDimensionalVector {
public:
FourDimensionalVector(double i, double j, double k, double l) {
x = i;
y = j;
z = k;
w = l;
}
FourDimensionalVector operator+(FourDimensionalVector& vec) {
FourDimensionalVector res(x + vec.x, y + vec.y, z + vec.z, w + vec.w);
return res;
}
private:
double x;
double y;
double z;
double w;
};
class FourDimensionalVector {
public:
FourDimensionalVector(double i, double j, double k, double l) {
x = i;
y = j;
z = k;
w = l;
}
friend FourDimensionalVector operator+(FourDimensionalVector& vec1, FourDimensionalVector& vec2) {
FourDimensionalVector res(vec1.x + vec2.x, vec1.y + vec2.y, vec1.z + vec2.z, vec1.w + vec2.w);
return res;
}
private:
double x;
double y;
double z;
double w;
};
注意:以上代码中定义的“FourDimensionalVector”类仅供参考,实际代码会因需求不同而有所不同。