首先,让我们考虑一条普通的情况,其中的线不过是X轴。我们现在可以肯定地说,点的共轭是该点围绕X轴的反射。
现在,使用平移和旋转坐标轴的方法,我们将找到围绕通用线的点的反射。
翻译的想法已在上一篇文章中进行了描述。在这里,我们描述了旋转的想法。
什么是旋转?
在欧几里得几何中,二维轴旋转是从xy-笛卡尔坐标系到x’y’-笛卡尔坐标系的映射,其中原点保持固定,并且通过旋转获得x’和y’轴x和y轴成角度θ。
如何执行旋转?
旋转可以解释为乘以常数矢量(乘以逆时针旋转)或除以(顺时针旋转)坐标系的每个点。
请注意,如果要围绕原点沿逆时针方向旋转θ,请按SET 1中的讨论将其乘以极性(1.0,θ)。类似地,我们将其除以极性(1.0,θ)以旋转点。在顺时针方向上指向θ。
旋转之后,执行所需的计算,并通过将每个点分别乘以或乘以常数矢量来使旋转无效。
因此,我们必须在点A和点B指定的直线上反射点P,表示为AB。因为我们知道一个点的共轭就是该点围绕X轴的反射。为了能够利用这一事实,我们将首先执行平移(将A作为新系统的原点),然后旋转坐标轴,以使线成为新坐标系中的X轴。
现在,我们可以简单地将公式应用到有关X轴的反射中,然后使旋转和平移的影响无效,以获得最终结果。
这些步骤可以描述如下:
- 平移(在A处移动原点):将所有点都减去A。
Pt = P – A Bt = B – A At is origin
- 旋转(将B t A t移至X轴):用B t除以所有点(除法意味着沿顺时针方向旋转,这是在X轴上的要求)。
Pr = Pt/Bt
- 关于B r A r (除X轴外什么都没有)的P r的反射:只需取该点的共轭即可。
Prreflected = conj(Pr)
- 从旋转恢复:将所有点乘以Bt。
Ptreflected= conj(Pr)*Bt
- 从平移中恢复:将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)