多维空间中求一个点相对一条线的对称点
首先我们应该知道如何求在二维平面中求一个点相对于一条线的对称点
struct node {
int x,y;
};
node H(node a,node k1,node k2) {
node res;
double dx,dy,u = 0,v = 0;
dx = k1.x - k2.x;
dy = k1.y - k2.y;
u += (a.x-k1.x)*(k1.x-k2.x);
u += (a.y-k1.y)*(k1.y-k2.y);
v += dx*dx;
v += dy*dy;
u = u/v;
res.x = k1.x +u*dx;
res.y = k1.y +u*dy;
return res;
}
node Get(node a,node k1,node k2) {
node q = H(a,k1,k2);
q.x = 2*q.x - a.x;
q.y = 2*q.y - a.y;
return q;
}
然后我们将二维拓展为多维即可
struct node {//n维
double x[n];
};
node H(node a,node k1,node k2) {
node res;
double u = 0,v = 0;
for(i=0;i<n;i++)
d[i] = k1.x[i] - k2.x[i];
for(i=0;i<n;i++)
u += (a.x[i]-k1.x[i])*(k1.x[i]-k2.x[i]);
for(i=0;i<n;i++)
v+=d[i]*d[i];
u = u/v;
for(i=0;i<n;i++) {
res.x[i] = k1.x[i] + u*d[i];
}
return res;
}
node Get(node a,node k1,node k2) {
node q = H(p,a,b);
for(int i=0;i<n;i++)
q.x[i] = 2*q.x[i] - a.x[i];
return q;
}