数学上有一个经典的结论,初等的证明方法可以考虑用三角函数简单证明,在此不再赘述,只扔一个结论:

两条直线斜率分别为 k1,k2k_1,k_2,它们相互垂直当且仅当 k1k2=1k_1\cdot k_2=-1

那么首先可以考虑通过 U,VU,V 两点的坐标确定 k2,b2k_2,b_2,然后根据这个公式确定 k1k_1

设垂线段为 y=k1x+b1y=k_1x+b_1,代入 PP 点坐标解 b1b_1

然后根据 k1,k2,b1,b2k_1,k_2,b_1,b_2 解一个两直线相交,交点的方程:

k1x+b1=k2x+b2k_1x+b_1=k_2x+b_2

x=b2b1k1k2\Rightarrow x=\dfrac{b_2-b_1}{k_1-k_2}

交点的纵坐标随便代入一个方程即可算出。

#include<cstdio>
int init(){
	char c = getchar();
	int x = 0, f = 1;
	for (; c < '0' || c > '9'; c = getchar())
		if (c == '-') f = -1;
	for (; c >= '0' && c <= '9'; c = getchar())
		x = (x << 1) + (x << 3) + (c ^ 48);
	return x * f;
}
void print(int x){
	if (x < 0) x = -x, putchar('-');
	if (x > 9) print(x / 10);
	putchar(x % 10 + '0');
}
int main(){
    int T = init();
    while (T--) {
        double Px, Py, Ux, Uy, Vx, Vy;
        scanf("%lf%lf%lf%lf%lf%lf", &Px, &Py, &Ux, &Uy, &Vx, &Vy);
        double k2 = (Vy - Uy) / (Vx - Ux);
        double k1 = -1 / k2;
        double b1 = Py - k1 * Px;
        double b2 = Uy - k2 * Ux;
        double x = (b2 - b1) / (k1 - k2);
        double y = k1 * x + b1;
        printf("%.6lf %.6lf\n", x, y);
    }
}