刘汝佳的训练指南上铁人三项的代码中
if (fabs(a) > fabs(b)) P = Point(-c / a, 0);
else P = Point(0, -c / b);
到底为什么啊,同一条直线选点不同不应该对结果没影响吗,是我学的不对吗
完整代码:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-8;
const int inf = 0x3f3f3f3f;
struct Point {
double x, y;
Point(double x = 0, double y = 0) :x(x), y(y) {}
}p[105], poly[105];
int n;
typedef Point Vector;
Vector operator + (Vector A, Vector B) {
return Vector(A.x + B.x, A.y + B.y);
}
Vector operator - (Point A, Point B) {
return Vector(A.x - B.x, A.y - B.y);
}
Vector operator * (Vector A, double p) {
return Vector(A.x * p, A.y * p);
}
int sgn(double x) {
if (fabs(x) < eps)
return 0;
if (x < 0)
return -1;
return 1;
}
double Dot(Vector A, Vector B) {
return A.x * B.x + A.y * B.y;
}
double Cross(Vector A, Vector B) {
return A.x * B.y - A.y * B.x;
}
double Length(Vector A) {
return sqrt(Dot(A, A));
}
Vector Normal(Vector A) {
double L = Length(A);
return Vector(-A.y / L, A.x / L);
}
struct Line {
Point p;
Vector v;
double ang;
Line() {}
Line(Point p, Vector v) : p(p), v(v) {
ang = atan2(v.y, v.x);
}
bool operator < (const Line& L) const {
return ang < L.ang;
}
}L[105];
bool OnLeft(Line L, Point p) {
return Cross(L.v, p - L.p) >= 0;
}
Point GetIntersection(Line a, Line b) {
Vector u = a.p - b.p;
double t = Cross(b.v, u) / Cross(a.v, b.v);
return a.p + a.v * t;
}
int HalfplaneIntersection(Line* L, int n, Point* poly) {
sort(L, L + n);
int fst = 0, lst = 0;
Point* P = new Point[n];
Line* q = new Line[n];
q[fst = lst = 0] = L[0];
for (int i = 1; i < n; ++i) {
while (fst < lst && !OnLeft(L[i], P[lst - 1])) --lst;
while (fst < lst && !OnLeft(L[i], P[fst])) ++fst;
q[++lst] = L[i];
if (sgn(Cross(q[lst].v, q[lst - 1].v)) == 0) {
--lst;
if (OnLeft(q[lst], L[i].p)) q[lst] = L[i];
}
if (fst < lst)
P[lst - 1] = GetIntersection(q[lst - 1], q[lst]);
}
while (fst < lst && !OnLeft(q[fst], P[lst - 1])) --lst;
if (lst - fst <= 1) return 0;
P[lst] = GetIntersection(q[lst], q[fst]);
int m = 0;
for (int i = fst; i <= lst; ++i) poly[m++] = P[i];
return m;
}
int u[105], v[105], w[105];
int main() {
int n;
while (~scanf("%d", &n) && n) {
for (int i = 0; i < n; i++)
scanf("%d%d%d", &v[i], &u[i], &w[i]);
for (int i = 0; i < n; i++) {
int flag = 1, cnt = 0;
double k = 10000;
for (int j = 0; j < n; j++) {
if (i != j) {
if (v[i] <= v[j] && u[i] <= u[j] && w[i] <= w[j]) {
flag = 0;
break;
}
if (v[i] >= v[j] && u[i] >= u[j] && w[i] >= w[j])
continue;
double a = (k / v[j] - k / w[j]) - (k / v[i] - k / w[i]);
double b = (k / u[j] - k / w[j]) - (k / u[i] - k / w[i]);
double c = k / w[j] - k / w[i];
Point P;
Vector v(b, -a);
if (fabs(a) > fabs(b)) P = Point(-c / a, 0);
else P = Point(0, -c / b);
L[cnt++] = Line(P, v);
}
}
if (flag) {
L[cnt++] = Line(Point(0, 0), Vector(0, -1));
L[cnt++] = Line(Point(0, 0), Vector(1, 0));
L[cnt++] = Line(Point(0, 1), Vector(-1, 1));
if (!HalfplaneIntersection(L, cnt, poly)) flag = 0;
}
if (flag) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}