现在的位置: 首页 > 综合 > 正文

hdu 2857 Mirror and Light 求 两直线交点

2014年01月11日 ⁄ 综合 ⁄ 共 1961字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.