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
2
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 }
************
用解析几何,两点到直线的距离公式上方互为相反数导出来的。
哈哈哈
反击第一步