zoukankan      html  css  js  c++  java
  • 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
    ",ansx,ansy);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    LeetCode Combination Sum III
    LeetCode Contains Duplicate
    CSRF & CORS
    LeetCode Kth Largest Element in an Array
    Maven 使用 Nexus 内部库 代理
    可重定位目标文件
    过程(栈帧结构是干货)
    控制语句(if-else+循环+switch)汇编规则
    程序编码(机器级代码+汇编代码+C代码+反汇编)
    转移指令jmp和跳转指令call
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3271588.html
Copyright © 2011-2022 走看看