对称点line

2 线
题⽬描述

有一天rax看到了男神,有时可爱美丽的她派ypq去把yyqx抓回来给rax欣赏,但ypq和yyqx间隔了一条线,她必须跳到yyqx以前待得点的对称点才有可能抓到yyqx
给出⼀条直线,在这过程中yyqx可能移动位置,于是进行n 组询问,每组询问yyqx的坐标,求这个点关于这条直线的 对称点,输出ypq围堵的位置。

可爱帅气的ypq翻山越岭的为rax找yyqx,历尽千辛万苦,路上她还幸运的遇到了zx和sln两位帅气逼人的强盗,只劫财不劫色,可怜的ypq,灰头土脸,兜比脸还干净的,向前走,没留意到前方的大沟,然后哈哈哈哈,最后她回到了rax的身边(ps.当然还带上了yyqx啦),然后他们三个人幸福的生活的在一起了。(赤果果的甜蜜三角恋)

输⼊输出格式
输⼊格式 第⼀⾏四个数 x1 , y1 , x2 , y2 , 描述⼀条线。之后⼀⾏⼀个数字 n, 接下来 n ⾏每⾏ 两个整数 x, y 表⽰⼀个点坐标,保证点不在直线上。 输出格式 输出 n ⾏,分别为输⼊给出点的对称点的坐标,误差不超过1e-3即可。 输⼊输出样例
样例1
样例2 
0 0 1 1

 1 

1 0 

输出:0.000 1.000 
line.in  line.out

0 1 2 5 

1 1

 3 10

输出 -0.600 1.800

 5.400 8.800 
数据范围
对于0%的数据,和样例⼀模⼀样 对于10%的数据,直线和样例1或2⼀样 对于另外10%的数据,n = 1 对于100%的数据,n <=10^5,任何点不在直线上,坐标的范围是[-1000,1000]

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 int main()
 7 {
 8     /*freopen("line.in","r",stdin);
 9     freopen("line.out","w",stdout);
10 */
11     int ax,bx,cx,ay,by,cy,t,i;
12     double k,m,n,c,qx,qy;
13     scanf("%d %d %d %d",&ax,&ay,&bx,&by);
14     k = (double)(by - ay) / (bx - ax);
15     c = (double)by - k * bx;
16     m = (double)-1 / k;
17     scanf("%d",&t);
18     for(i = 3;i <= t + 2;i++)
19     {
20         scanf("%d %d",&cx,&cy);
21         n = (double)cy - m * cx;
22         qx = (double)(k * cx - cy + 2 * c - n) / (m - k);
23         qy = (double)m * qx + n;
24         if(qx == -0)
25         {
26             qx = 0;
27         }
28         if(qy == -0)
29         {
30             qy = 0;
31         }
32         printf("%0.3lf %0.3lf
",qx,qy);
33     }
34     
35     return 0;
36 }

************

用解析几何,两点到直线的距离公式上方互为相反数导出来的。

哈哈哈

反击第一步

原文地址:https://www.cnblogs.com/rax-/p/8463485.html