У меня есть алгоритм, который может найти, находится ли точка внутри многоугольника.Помогите с этим алгоритмом
int CGlEngineFunctions::PointInPoly(int npts, float *xp, float *yp, float x, float y)
{
int i, j, c = 0;
for (i = 0, j = npts-1; i < npts; j = i++) {
if ((((yp[i] <= y) && (y < yp[j])) ||
((yp[j] <= y) && (y < yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i])/(yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}
Моя единственная проблема заключается в том, что он принимает правило странной обмотки. Я имею в виду, что если многоугольник самопересекающийся, некоторые части, которые он считал бы «пустыми», вернутся как ложные. То, что мне нужно, даже если оно самопересекается, что-либо внутри полигона вернет true.
Благодаря
Возможно, вы могли бы просто переупорядочить точки так, чтобы порядок, в который вы их нарисовали, не будет пересекаться? –
Нет, мое приложение представляет собой векторный рисунок, который допускает различные виды правил намотки. – jmasterx
Алгоритм основан на теореме кривой Йордона. Существует по существу 2 пробела, связанных с ограниченным объектом - либо в или из. Извлечение луча из рассматриваемой точки пересечет границу либо нечетным, либо четным числом раз. Если это нечетно, то точка находится на границе, если ее четная тогда точка находится за пределами границы. Также эта конкретная версия алгоритма предполагает простую оптимизацию, основанную на том, что луч, который выполняется, является горизонтальным. – 2010-08-10 09:58:28