Окружности и многоугольники. Справочник
Пересечение прямой и окружности
double k = a * a + b * b;
if (c * c > r * r * k + EPS)
{
//точек пересечения нет
}
else if (abs (c * c – r * r * k)) < EPS)
{
//одна точка -(x0, y0)
}
else
{
double d = r * r – c * c / k;
double mult = Math.sqrt (d / k);
double ax, ay, bx, by;
ax = x0 + b * mult;
bx = x0 - b * mult;
ay = y0 - a * mult;
by = y0 + a * mult;
//две точки -(ax, ay) и (bx, by)
}
Площадь многоугольника методом трапеций
static double sPolygon (Point poly[])
{
double S = 0;
for (int i=0; i < convex.length; i++)
{
Point p1 = fig[i];
Pоint p2 = (i + 1 == poly.length ? fig[0] : fig[i+1));
S += (p1.x - p2.x) * (p1.y + p2.y) / 2;
}
return Math.abs (S);
}
Принадлежность точки многоугольнику в вершинах с целыми координатами
static long cross (Point a1, Point a2, Point b1, Point b2)
{
return (long)(a2.x - a1.x)*(b2.y - b1.y) –
(long)(b2.x - b1.x)*(a2.y - a1.y);
}
static boolean pointInPolygon(Point[] poly, Point M)
{
int N = poly.length;
Point[] p = new Point[N];
for (int i = 0; i < p.length; i++)
{
p[i] = new Point(poly[i].x - M.x, poly[i].y - M.y);
}
M.x = 0;
M.y = 0;
int ncross = 0;
for (int j = 0; j < N; j++)
{
int i = (j + 1) % N;
if (p[i].y == 0 && (p[i].x == 0 ||
p[j].y == 0 && (p[i].x < 0) != p[j].x < 0))
return false;
if (p[i].y > 0 != p[j].y > 0)
{
double det = cross(M, p[j], M, p[i]);
if (det == 0)
return false;
if (det > 0 != p[j].y - p[i].y > 0)
ncross++;
}
}
return ncross % 2 == 0 ? false : true;
}