【数学物理问题】UVALive - 6921 Refraction

Problem Description

给你水槽,给你水槽的宽度W,水槽的高度H,需要被照射的点的横坐标x,光源点的坐标xe,ye.给你sin∠MPE/sin∠CPN的比值u,让你求水最低多低,光就可以照射到被照射点(具体题目去搜索原题);

思路:列出两个方程,联立方程求h,判断h和H的大小关系。光线肯定过E点H点,这样才能使得h尽可能的小

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    scanf("%d", &T);
    double W, H, x, xe, ye, u;
    while(T--)
    {
        scanf("%lf %lf %lf %lf %lf %lf", &W, &H, &x, &xe, &ye, &u);
        double t = 1.0 * (ye - H) / (xe - W);//光线斜率可以求出tan∠H值

        double dut = atan(t);//∠H
        double du90 = asin(1);//九十度
        double duE = du90 - dut;//九十度-∠H
        double sinp = sin(duE) / u;//sin∠CPN
        double tanp = tan(asin(sinp));//tan∠CPN
        //联立方程 t = 1.0 * (H - h) / (W - xp) 和
        // tanp = (xp - x) / (yp) 求 出h
        double h = (t * (W - x) - H) / (t * tanp - 1);
        if(h - H > 0.000003) printf("Impossible\n");//判断
        else printf("%.4lf\n", h);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值