HDU 2857 Mirror and Light(镜面反射模板)

http://acm.hdu.edu.cn/showproblem.php?pid=2857

这题是求关于已知前后光路上的两点,和镜面位置,求出反射点的位置。这里需要有

1:两点求直线方程,即得到直线的三系数

已知x1,x2,y1,y2,则a=y2-y1;b=x1-x2;c=x2*y1-x1*y2;

2:已知两直线,求交点

struct line
{
       double a,b,c;
}p,s;
void jiaodian()
{
      if(fabs(p.b)<1e-6)//如果是平行于y轴,需要另外求
       {
          ansx = -p.c / p.a;
          ansy = (-s.c - s.a * ansx) / s.b;
       }
       else//否则常规来
       {
           ansx = (p.c * s.b - p.b * s.c) / (p.b * s.a - s.b * p.a);
           ansy = (-p.c- p.a* ansx) / p.b;
       }
}
View Code

3:已知直线跟点,求对称点

struct line
{
       double a,b,c;
}p,s;
void duichen()
{
       double d;
       d=p.a*p.a+p.b*p.b;
       x=(p.b * p.b * xs - p.a * p.a * xs - 2 * p.a * p.b * ys - 2 * p.a * p.c) / d;
       y=(p.a * p.a * ys - p.b * p.b * ys - 2 * p.a * p.b * xs - 2 * p.b * p.c) / d;
}
View Code

不得不说……这题目太恶心了

#include<stdio.h>
#include<math.h>
struct line
{
       double a,b,c;
}p,s;
double x3, y3, x2, y2, x, y;//表示对称的那个点
double xs,xe,ys,ye,ansx,ansy;
void jiaodian()
{
       s.a=y-ye;
       s.b=xe-x;
       s.c=x*ye-y*xe;//求直线模板
       if(fabs(p.b)<1e-6)//如果是平行于y轴,需要另外求
       {
          ansx = -p.c / p.a;
          ansy = (-s.c - s.a * ansx) / s.b;
       }
       else//否则常规来
       {
           ansx = (p.c * s.b - p.b * s.c) / (p.b * s.a - s.b * p.a);
           ansy = (-p.c- p.a* ansx) / p.b;
       }
}
void duichen()
{
       double d;
       p.a=y3-y2;
       p.b=x2-x3;
       p.c=x3*y2-y3*x2;//求直线模板
       d=p.a*p.a+p.b*p.b;
       x=(p.b * p.b * xs - p.a * p.a * xs - 2 * p.a * p.b * ys - 2 * p.a * p.c) / d;
       y=(p.a * p.a * ys - p.b * p.b * ys - 2 * p.a * p.b * xs - 2 * p.b * p.c) / d;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&x3,&y3,&x2,&y2);
        scanf("%lf%lf%lf%lf",&xs,&ys,&xe,&ye);
        duichen();
        jiaodian();
        if(fabs(ansx)<1e-6)ansx=fabs(ansx);
        if(fabs(ansy)<1e-6)ansy=fabs(ansy);
        printf("%.3lf %.3lf\n",ansx,ansy);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/huzhenbo113/p/3271588.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值