HDU 2671 Can't be easier(数学题,点关于直线对称)

时间:2023-03-09 05:38:44
HDU 2671 Can't be easier(数学题,点关于直线对称)

题目

//数学题
//直线 y = k * x + b
//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2)

/*
*****************************************************************
关于直线对称公式如下:

1。点(a,b)关于直线 y=kx+m (k=1或-1)的
对称点为:(b/k-m/k,ka+m),实际上是将表达式中的x,y的值互换,
因为直线方程 y=kx+m 中有 x=y/k-m/k 且 y=kx+m,这种方法只适用于 k=1或-1
的情况。还可以推广为 曲线 f(x,y)=0关于直线 y=kx+m 的 对称曲线 为
f(y/k-m/k,kx+m)=0。

2.当 k不等于1或-1时,点(a,b)关于直线 Ax+By+C=0 的对称点为
(a-(2A*(Aa+Bb+C))/(A*A+B*B),b-(2B*(Aa+Bb+C))/(A*A+B*B)),
同样可以扩展到曲线关于直线对称方面,有 f(x,y)=0关于
直线 Ax+By+C=0 的对称曲线为
f(x-(2A*(Ax+By+C))/(A*A+B*B),y-(2B*(Ax+By+C))/(A*A+B*B))=0.

以上包含了所有关于直线对称的情况。

顺便把点关于点对称的也写在这,方便大家使用。

点(x,y)关于 点(a,b)对称点是 (2a-x,2b-y);
曲线 f(x,y)=0 关于 点(a,b)对称曲线为 f(2a-x,2b-y)=0。
*****************************************************************

*********************************************
设直线方程为Ax+By+C=0,两点为(x1,y1),(x2,y2)

(Ax1+By1+C)(Ax2+By2+C)>0
同侧

(Ax1+By1+C)(Ax2+By2+C)<0
异侧
*********************************************
*/

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; int main()
{
int m;
double k,ax,ay,bx,by,cx,cy;
scanf("%d",&m);
while(m--)
{
scanf("%lf",&k);
scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy);
double b1 = cy-k*cx;
double A = k, B = -, C = b1; //判断两点是否同侧
if((A * ax + B * ay + C) * ( A * bx + B * by + C) < )//同侧
{
printf("%.2lf\n",sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)));
} else
{
double xn = ax - ( * A * (A * ax + B * ay + C)) / (A * A + B * B);
double yn = ay - ( * B * (A * ax + B * ay + C)) / (A * A + B * B);
printf("%.2lf\n",sqrt((xn - bx) * (xn - bx) + (yn - by) * (yn - by)));
} } return ;
}