2010-04-17 1 views
3

У меня есть форма raphael.js, на которой я рисую круг сверху. Я хочу, чтобы круг появлялся только в том случае, если круг не покидает границу формы, на которую он нанесен.Обнаруживание точки внутри или снаружи формы raphael.js

Чтобы сделать это более ясным, вот пример того, что я не хочу, чтобы это произошло:

Example http://img682.imageshack.us/img682/4168/shapeh.png

Я хочу, чтобы круги за пределами серой области не появляться. Как бы я обнаружил, что круг внутри или снаружи серой формы?

ответ

3

Вы можете просто применить клип-путь (который должен быть определен как серая фигура в вашем примере) в группе (<g>), содержащей круги.

См. this example от w3c SVG testsuite, как использовать клип-пути.

+0

Это сработало, однако мне пришлось взломать raphael.js, чтобы поиграть с ним. Raphael.js поддерживает только прямоугольники, поэтому я добавил немного к настройке кода. См. Http://github.com/DmitryBaranovskiy/raphael/issues/issue/100/#comment_212698 для получения дополнительной информации. NB. Я знаю, что это ужасное решение, но оно работает, и пока это все, о чем я беспокоюсь. – betamax

4

Один из возможных способов dertermine если точка находится внутри замкнутого контура заключается в следующем:

  1. Выберите координаты, которые, безусловно, вне формы.
  2. Сделайте линию от этой точки до вашей фактической точки.
  3. Подсчитайте, как часто линия пересекается с дорожкой.
  4. Если число пересечений нечетное, то ваша точка внутри. Если это так, точка снаружи.

Я не знаю, если это вам очень поможет, так как я вообще не знаю raphael.js. Но это рабочий геометрический подход к проблеме.

+0

интересно :) как вычислить взаимодействия? Есть ли команда, или вы должны сделать это сами? – Bakaburg

+0

Простите, вам придется сделать это самостоятельно. Я только что описал математическую концепцию. – selfawaresoup

1

Это похоже на «Hit-testing SVG shapes?».

Вам нужно просто вызвать getIntersectionList() в позиции круга и посмотреть, вернет ли он большую серовую форму.

+0

Спасибо, это похоже на прочное решение, но, согласно сообщению в блоге, на которое было указано, это пока не поддерживается Firefox/Safari, что является обязательным требованием для меня. Я должен был упомянуть об этом в своем оригинальном посте. – betamax

+0

Возможно, я не понимаю, но я попробовал пример на своем блоге, и он отлично работал в Firefox, Safari и Chrome. – Ken

+0

А, я просто шел по тексту в сообщении, в котором говорилось, что Safari или Firefox не поддерживается, но, похоже, этот пример работает и для меня. Я должен проверить это, потому что это кажется немного более надежным, чем маска. Благодаря! – betamax