hdu 2857 Mirror and Light 两直线交点

#include <iostream>


#include <cstring>

#include <cstdio>

#include <cmath>

#define eps 1e-8

using namespace std;

double x[5],y[5],k1;

void qiushuzhi()

{

    double k2;

    k2=(y[4]-y[3])/(x[4]-x[3]);

    printf("%.3lf %.3lf\n",x[1],k2*(x[1]-x[3])+y[3]);

}

void qiushuipin()

{

    double k2;

    k2=(y[4]-y[3])/(x[4]-x[3]);

    printf("%.3lf %.3lf\n",(y[1]-y[3])/k2+x[3],y[1]);

}

void qiucrosspoint()

{   double k2,a,b;

    if(fabs(x[3]-x[4])<eps)

    {

       printf("%.3lf %.3lf\n",x[3],k1*(x[3]-x[1])+y[1]);

       return ;

    }

    k2=(y[4]-y[3])/(x[4]-x[3]);

    if(fabs(k1-k2)<eps)return;

    a=(y[3]-y[1]+k1*x[1]-k2*x[3])/(k1-k2);

    b=k1*(a-x[1])+y[1];

    printf("%.3lf %.3lf\n",a,b);

}

int main()

{

    int t;

    double xzh,yzh;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2]);

        scanf("%lf%lf%lf%lf",&x[3],&y[3],&x[4],&y[4]);

        if(fabs(x[1]-x[2])<eps)

         {

             x[3]=-x[3];

             qiushuzhi();

             continue;

         }

         if(fabs(y[1]-y[2])<eps)

         {

             y[3]=-y[3];

             qiushuipin();

             continue;

         }

        k1=(y[2]-y[1])/(x[2]-x[1]);

        xzh=(k1*y[3]-k1*y[1]+k1*k1*x[1]+x[3])/(k1*k1+1);

        yzh=k1*(xzh-x[1])+y[1];

         x[3]=2*xzh-x[3];

         y[3]=2*yzh-y[3];

         qiucrosspoint();

    }

    return 0;


}




较简洁的代码:



#include<stdio.h>
int  main()
{
     int  t;
     double  x1,y1,x2,y2,xs,ys,xe,ye;
     double  k1,k2,x3,y3,a,b;
     scanf( "%d",&t);
     while(t--)
     {
           scanf( "%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&xs,&ys,&xe,&ye);
           if(x1==x2)
           {
                 y3=ys;
                 x3=(- 1)*xs;
                 k2=(ye-y3)/(xe-x3);
                 a= 0;
                 b=ye-k2*xe;
           }
           else
           {
                 k1=(y1-y2)/(x1-x2);
                 y3=(k1*k1*ys-ys+ 2*xs*k1+ 2*y2- 2*k1*x2)/( 1+k1*k1);
                 x3=xs-k1*y3+k1*ys;
                 if(xe==x3)
                 {
                       a= 0;
                       b=y2-k1*x2;
                 }
                 else
                 {
                       k2=(ye-y3)/(xe-x3);
                       a=(ye-y2+k1*x2-k2*xe)/(k1-k2);
                       b=k1*a-k1*x2+y2;
                 }
           }
           printf( "%.3f %.3f \n ",a,b);
     }
     return  0;
}