[線分交点]0807
4189 ワード
テンプレートでは、ポイントがチャーシューを求める過程でオーバーフローする可能性があります.解決方法はdoubleを使用します.
doubleを使う:
doubleを使う:
# include <cmath>
const double eps = 1e-8;
struct Point{double x, y;} ;
int dcmp(double x)
{
if (fabs(x) < eps) return 0;
return x>0 ? 1:-1;
}
int direction(Point p1, Point p2, Point p3)
{
double tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y);
return dcmp(tmp);
}
char isCross(Point p1, Point p2, Point p3, Point p4)
{
int d1 = direction(p3, p4, p1);
int d2 = direction(p3, p4, p2);
int d3 = direction(p1, p2, p3);
int d4 = direction(p1, p2, p4);
if (d1*d2 < 0 && d3*d4 < 0) return 1;
return 0;
}
intを使って符号を返す:struct Point{int x, y;} ;
int direction(Point p1, Point p2, Point p3)
{
int tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y);
if (tmp == 0) return 0;
return tmp>0 ? 1:-1;
}
char isCross(Point p1, Point p2, Point p3, Point p4)
{
int d1 = direction(p3, p4, p1);
int d2 = direction(p3, p4, p2);
int d3 = direction(p1, p2, p3);
int d4 = direction(p1, p2, p4);
if (d1*d2 < 0 && d3*d4 < 0) return 1;
return 0;
}