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

📅  最后修改于: 2021-10-23 08:45:58             🧑  作者: Mango

让我们首先考虑一条线只是 X 轴的一般情况。我们现在可以肯定地说,一个点的共轭是该点关于 X 轴的反射。
现在,使用坐标轴的平移和旋转方法,我们将找出一点关于通用线的反射。
翻译的想法在上一篇文章中有所描述。在这里,我们描述了旋转的想法。
什么是旋转?
在欧几里得几何中,二维轴的旋转是从 xy-笛卡尔坐标系到 x’y’-笛卡尔坐标系的映射,其中原点保持固定,通过旋转获得 x’ 和 y’ 轴x 和 y 轴通过角度 θ。
如何进行旋转?
旋转可以解释为将坐标系的每个点乘以(逆时针方向旋转)或除以(顺时针方向旋转)一个常数向量。
这里注意,如果我们想将一个点绕原点逆时针方向旋转 θ,我们将它乘以 polar (1.0, θ),如 SET 1 中讨论的。同样,我们除以 polar (1.0, θ) 以旋转顺时针方向点θ。
旋转后,执行所需的计算,并通过将每个点分别除以或乘以常数向量来取消旋转。
因此,我们必须在由 A 点和 B 点指定的一条直线上反射一个点 P,该直线表示为 AB。因为,我们知道一个点的共轭是该点关于 X 轴的反射。为了能够利用这一事实,我们将首先进行平移(使 A 作为新系统中的原点),然后以这样的方式旋转坐标轴,使该线成为新坐标系统中的 X 轴。
现在我们可以简单地应用关于X轴的反射公式,然后消除旋转和平移的影响以获得最终结果。
这些步骤可以描述如下:

1.平移(在A处移动原点):从所有点中减去A。

Pt = P – A
Bt = B – A
At is origin

2.Rotation (Shifting B t A t to the X-Axis):将所有点除以B t (除法是顺时针方向旋转,这是这里带上X轴的要求)。

Pr = Pt/Bt 

3.P r关于B r A r 的反射(它只是X 轴):简单地取点的共轭。

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
// 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 coordinates 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)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。