1, 算法原理
设 是一个弧度值,
令
则, 是一个 Householder 变换的矩阵, 而
是二维平面中的一条直线。
设
是一个平面上的二维向量,简记为
计算
则,y 是 x 通过有 S 定义的直线作为镜面,反射而达到的像。
为形象期间,现以 为例,则
镜面矢量为:
现设
于是,
如图:
2. 代码
draw_householder.m
%input x, ta = theta
%x = [-sqrt(2)/2.0, sqrt(2)/2.0]
x = [-1.2, 1.2]
ta = 2.0
S = [cos(ta/2.0), sin(ta/2.0)]
Q = [cos(ta), sin(ta); sin(ta), -cos(ta);]
y = x*Q'
figure;
%1. draw axis
xmin = -2
xmax = 2
ymin = -2
ymax = 2
axisx = xmin:xmax;
axisy = zeros(size(axisx));
plot(axisx, axisy, 'k--', 'LineWidth', 0.7); % Plot x=0 axis
hold on;
plot(axisy, xmin:xmax, 'k--', 'LineWidth', 0.7); % Plot y=0 axis
hold on;
%2. draw surface of mirror
sx = -2*S(1):0.1:2*S(1)
sy = (S(2)/S(1))*sx
plot(sx, sy)
hold on;
%3. draw preimage
plot(x(1), x(2), 'ro')
hold on;
%4. draw image
plot(y(1), y(2), 'bo')
%5. axis label
xlabel("X")
ylabel('Y')
v=[xmin, xmax, ymin, ymax]
axis(v)
%axis on
3, 效果图
下面这张图为
x=(-1.2, 1.2), theta = 2.0 弧度
下图为
x=(0.7, 0.3), theta = 1.0 弧度
下图为
x = [-sqrt(2)/2.0, sqrt(2)/2.0] , theta = 1.0弧度