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 = -1, C = b1;

        //判断两点是否同侧
        if((A * ax + B * ay + C) * ( A * bx + B * by + C) < 0)//同侧
        {
            printf("%.2lf
",sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)));
        }

        else 
        {
            double xn = ax - (2 * A * (A * ax + B * ay + C)) / (A * A + B * B);
            double yn = ay - (2 * B * (A * ax + B * ay + C)) / (A * A + B * B);
            printf("%.2lf
",sqrt((xn - bx) * (xn - bx) + (yn - by) * (yn - by)));
        }
        
    }

    return 0;
}
View Code
一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3801045.html