思路:将题目描述的问题抽象成求点到平面的距离。由平面的三点,利用叉乘求出法向量,再由平面外一点与平面内任意一点组成的向量与该法向量的叉积比上法向量的模,得到点到平面的距离。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct Point {
double x, y, z;
};
Point p[5];
double getmod(double x, double y, double z)
{
return sqrt(x*x + y*y + z*z);
}
double getR(int i, int j, int k)
{
double x, y, z, x1, x2, y1, y2, z1, z2;
x1 = p[i].x - p[k].x;
x2 = p[j].x - p[k].x;
y1 = p[i].y - p[k].y;
y2 = p[j].y - p[k].y;
z1 = p[i].z - p[k].z;
z2 = p[j].z - p[k].z;
x = y1*z2 - y2*z1;
y = x2*z1 - x1*z2;
z = x1*y2 - x2*y1;
x1 = p[0].x - p[k].x;
y1 = p[0].y - p[k].y;
z1 = p[0].z - p[k].z;
double mul, mod;
mul = fabs(x*x1 + y*y1 + z*z1);
mod = getmod(x, y, z);
return mul/mod;
}
int main()
{
int i;
double m, h, H;
scanf("%lf %lf %lf", &m, &h, &H);
for (i = 0; i < 5; ++i) {
scanf("%lf %lf", &p[i].x, &p[i].y);
p[i].z = 0;
}
if (m >= 2*h)
printf("YES\n");
else if (m < h)
printf("NO\n");
else {
bool flag = false;
p[0].z = h;
m -= h;
p[4].z = H;
double r;
r = getR(1, 3, 4);
if (r <= m)
flag = true;
r = getR(1, 2, 4);
if (r <= m)
flag = true;
r = getR(2, 3, 4);
if (r <= m)
flag = true;
if (flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}