Является ли отрезок внутренней диагональю многоугольника
Дан многоугольник и индексы двух его вершин
Необходимо узнать, является ли отрезок, проведённый между этими вершинами, внутренней диагональю данного многоугольника
Отрезок, соединяющий вершины многоугольника, является внутренней диагональю тогда и только тогда, когда он не пересекается ни с одной стороной многоугольника и все точки этого отрезка лежат внутри многоугольника.
Асимптотика O(n).
Листинг C++
double SAT (point a, point b, point c)
{
return 0.5 * (a.x * b.y + b.x * c.y + c.x * a.y - a.y * b.x - b.y * c.x - c.y * a.x);
}
int sSAT (point a, point b, point c)
{
double s = SAT (a, b, c);
if (gr (s, 0)) return 1;
if (ls (s, 0)) return - 1;
return 0;
}
bool is_crossing (point a, point b, point c, point d)
{
return sSAT (a, c, b) != sSAT (a, d, b) && sSAT (c, a, d) != sSAT (c, b, d);
}
bool is_diagonal (vector < point > & v, int i1, int i2)
{
int i, j;
int n = v.size ();
if (i1 == (i2 + 1) % n || i2 == (i1 + 1) % n || i1 == i2) return 0;
forn (i, n)
if (i != i1 && i != i2 && i1 != (i + 1) % n && i2 != (i + 1) % n)
{
j = (i + 1) % n;
if (is_crossing (v[i], v[j], v[i1], v[i2])) return 0;
}
return point_in_polygon (part_segment (v[i1], v[i2], 1, 1), v);
}
14:14
04.08.2009
По всем вопросам обращаться: rumterg@gmail.com