hdu 2857 Mirror and Light 求 两直线交点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值