复数对于旋转的表示非常重要
- 它引入了旋转算子(rotational operator)的思想:可以通过复数表示一个旋转变换。
- 它是四元数和多向量的内在属性。
两个复数的乘积
- 两个复数的乘积就是各项分别相乘并相加
z1z2=(a+bi)(c+di)=(ac−bd)+(ad+bc)i
- 两个复数的加减和乘积都是一个复数。
共轭复数
- 两个复数相乘还有个特殊情况:
(a+bi)(a−bi)=a^2+b^2
两个复数的除法
- 利用共轭复数的性质,
z1/z2=(ac+bd)+(bc−ad)i / c^2+d^2
复数与旋转
- 乘以
i^2
看成是绕原点 180° 的旋转、乘以 i
表示90° 的旋转。旋转 45° 究竟是乘以 0.5i
- 乘以一个复数,可以同时带来两种变换的效果。
长度的缩放(通过改变模长)。旋转(通过改变幅角)。
旋转子
- 乘以一个模为 1 的复数时,不会导致缩放,只会产生旋转。这样的复数就称为旋转子(rotor)
- 旋转子的共轭复数等于顺时针旋转
自定义复数类
class ComplexNum
{
public:
ComplexNum();
ComplexNum(double a,double b);
public:
ComplexNum operator +(const ComplexNum& num);
ComplexNum operator -(const ComplexNum& num);
ComplexNum operator *(const ComplexNum& num);
ComplexNum operator /(const ComplexNum& num);
void setComplexNumValue(double a,double b);
double getComplexNumMold();
double A();
double B();
private:
double a,b;
};
ComplexNum::ComplexNum():a(0),b(0)
{
}
ComplexNum::ComplexNum(double a,double b){
this->a=a;
this->b=b;
}
ComplexNum ComplexNum::operator +(const ComplexNum& num){
return ComplexNum(this->a+num.a,this->b+num.b);
}
ComplexNum ComplexNum::operator -(const ComplexNum& num){
return ComplexNum(this->a-num.a,this->b-num.b);
}
ComplexNum ComplexNum::operator *(const ComplexNum& num){
return ComplexNum(this->a*num.a-this->b*num.b,this->b*num.a+this->a*num.b);
}
ComplexNum ComplexNum::operator /(const ComplexNum& num){
if (!num.a && !num.b){
qDebug()<<"除数不能位0";
return ComplexNum(a, b);
}else{
return ComplexNum((a*num.a + b*num.b) / (num.a*num.a + num.b*num.b),
(b*num.a - a*num.b) / (num.a*num.a + num.b*num.b));
}
}
void ComplexNum::setComplexNumValue(double a,double b){
this->a=a;
this->b=b;
}
double ComplexNum::getComplexNumMold(){
return sqrt(a*a+b*b);
}
double ComplexNum::A(){
return this->a;
}
double ComplexNum::B(){
return this->b;
}