📜  关于C++中的一条线的一点反映

📅  最后修改于: 2021-04-29 12:40:47             🧑  作者: Mango

首先,让我们考虑一条普通的情况,其中的线不过是X轴。我们现在可以肯定地说,点的共轭是该点围绕X轴的反射。

现在,使用平移和旋转坐标轴的方法,我们将找到围绕通用线的点的反射。
翻译的想法已在上一篇文章中进行了描述。在这里,我们描述了旋转的想法。

什么是旋转?

在欧几里得几何中,二维轴旋转是从xy-笛卡尔坐标系到x’y’-笛卡尔坐标系的映射,其中原点保持固定,并且通过旋转获得x’和y’轴x和y轴成角度θ。

如何执行旋转?
旋转可以解释为乘以常数矢量(乘以逆时针旋转)或除以(顺时针旋转)坐标系的每个点。
请注意,如果要围绕原点沿逆时针方向旋转θ,请按SET 1中的讨论将其乘以极性(1.0,θ)。类似地,我们将其除以极性(1.0,θ)以旋转点。在顺时针方向上指向θ。
旋转之后,执行所需的计算,并通过将每个点分别乘以或乘以常数矢量来使旋转无效。

因此,我们必须在点A和点B指定的直线上反射点P,表示为AB。因为我们知道一个点的共轭就是该点围绕X轴的反射。为了能够利用这一事实,我们将首先执行平移(将A作为新系统的原点),然后旋转坐标轴,以使线成为新坐标系中的X轴。
现在,我们可以简单地将公式应用到有关X轴的反射中,然后使旋转和平移的影响无效,以获得最终结果。

这些步骤可以描述如下:

  1. 平移(在A处移动原点):将所有点都减去A。
    Pt = P – A
    Bt = B – A
    At is origin
  2. 旋转(将B t A t移至X轴):用B t除以所有点(除法意味着沿顺时针方向旋转,这是在X轴上的要求)。
    Pr = Pt/Bt 
  3. 关于B r A r (除X轴外什么都没有)的P r的反射:只需取该点的共轭即可。
    Prreflected = conj(Pr) 
  4. 从旋转恢复:将所有点乘以Bt。
    Ptreflected= conj(Pr)*Bt 
  5. 从平移中恢复:将A添加到所有点。
    P反射= conj(P r )* B t + A

因此,

return conj(Pr)*Bt + A
where, Bt = B – A 
Pt = P – A 
Pr = Pt/Bt

坐标轴旋转

// CPP example to illustrate the 
// reflection of a point about a line
#include 
#include 
  
using namespace std;
  
typedef complex point;
#define x real()
#define y imag()
  
// Constant PI for providing angles in radians
#define PI 3.1415926535897932384626
  
// Function used to display X and Y coordiantes of a point
void displayPoint(point P)
{
    cout << "(" << P.x << ", " << P.y << ")" << endl;
}
  
// Function for Reflection of P about line AB
point reflect(point P, point A, point B)
{
    // Performing translation and shifting origin at A
    point Pt = P-A;
    point Bt = B-A;
  
    // Performing rotation in clockwise direction
    // BtAt becomes the X-Axis in the new coordinate system
    point Pr = Pt/Bt;
  
    // Reflection of Pr about the new X-Axis
    // Followed by restoring from rotation
    // Followed by restoring from translation
  
    return conj(Pr)*Bt + A;
}
  
int main()
{
    // Rotate P about line AB
    point P(4.0, 7.0);
    point A(1.0, 1.0);
    point B(3.0, 3.0);
  
      
    point P_reflected = reflect(P, A, B);
    cout << "The point P on reflecting about AB becomes:";
    cout << "P_reflected"; displayPoint(P_reflected);
  
    return 0;
}

输出:

The point P on reflecting about AB becomes: P_reflected(7, 4)