Вот тот же алгоритм на Java, если кому-то интересно.
boolean isPolygonsIntersecting(Polygon a, Polygon b)
{
for (int x=0; x<2; x++)
{
Polygon polygon = (x==0) ? a : b;
for (int i1=0; i1<polygon.getPoints().length; i1++)
{
int i2 = (i1 + 1) % polygon.getPoints().length;
Point p1 = polygon.getPoints()[i1];
Point p2 = polygon.getPoints()[i2];
Point normal = new Point(p2.y - p1.y, p1.x - p2.x);
double minA = Double.POSITIVE_INFINITY;
double maxA = Double.NEGATIVE_INFINITY;
for (Point p : a.getPoints())
{
double projected = normal.x * p.x + normal.y * p.y;
if (projected < minA)
minA = projected;
if (projected > maxA)
maxA = projected;
}
double minB = Double.POSITIVE_INFINITY;
double maxB = Double.NEGATIVE_INFINITY;
for (Point p : b.getPoints())
{
double projected = normal.x * p.x + normal.y * p.y;
if (projected < minB)
minB = projected;
if (projected > maxB)
maxB = projected;
}
if (maxA < minB || maxB < minA)
return false;
}
}
return true;
}
Да, вы можете использовать cookie и установить срок действия очень далеко в будущем; однако ничто не мешает кому-либо очистить кэш и снова проголосовать.
Лучше всего использовать cookie и не разрешать голоса с одного и того же IP-адреса в течение 15 минут друг от друга ... без регистрации, вот и все. лучшее, что вы можете сделать.
Вы можете идентифицировать пользователей не только по их IP-адресу. Например, вы можете включить IP + всю информацию заголовка запроса (такую как браузер, номера версий, возможности) и хэш. Это будет более или менее однозначно идентифицировать вашего пользователя (хотя, к сожалению, не на 100%).
Вы можете разрешить им входить в систему, используя OpenId , это позволит им использовать существующую учетную запись для голосования, и им не придется создавать новую учетную запись.
У Google, Yahoo и других есть службы, позволяющие вам аутентифицировать пользователей.
Если вы не аутентифицируете пользователей каким-либо образом, система голосования будет открыта для злоупотреблений.
В принципе невозможно, используя файл cookie, отличить посетителя, который никогда не заходил, и посетителя, который посетил, но удалил файл cookie. Следовательно, любое решение на основе файлов cookie будет уязвимо для банального фальсификации голосования.
Рассмотрите возможность принятия этой реальности в духе Дж. Генри Ловенгарда , который, когда он настраивал сайт 100 лучших на WFMU еще в середине 1990-х при наличии кнопки на странице «ваш голос подсчитан» с надписью «Вернитесь и проголосуйте еще!»
Фактически, перейдите туда сейчас и проголосуйте за (или против) StackOverflow!
Пользовательский агент IP + намного более уникален, чем IP; не уверен, подходит ли он для ваших целей. Если вы отправите им файл cookie, он будет возвращен этим компьютером (если они используют один и тот же браузер) до тех пор, пока cookie остается, независимо от IP-адреса, но обратите внимание, что пользователь может избавиться от файла cookie в любое время. .
Если вас вообще беспокоит использование этой системы для предотвращения фальсификации голосования, я не думаю, что вы не сможете обойтись без создания учетной записи.