Обнаружение столкновений Raphael JS со стенами при перетаскивании

#javascript #svg #raphael

#javascript #svg #рафаэль

Вопрос:

У меня есть следующий код для перетаскивания фигур в Raphael:

 var start = function() {
        this.ox = 0;
        this.oy = 0;
        self.bringToFront();
    },
    move = function(dx, dy) {
        var a = self.getAngle(self.rotation),
            bb = self.shape.getBBox();

        switch(a){
            case 90:
                self.shape.translate(dy - this.ox, this.oy - dx);
                this.ox = dy;
                this.oy = dx;
                break;
            case 180:
                self.shape.translate(this.ox - dx, this.oy - dy);
                this.ox = dx;
                this.oy = dy;
                break;
            case 270:
                self.shape.translate(this.ox - dy, dx - this.oy);
                this.ox = dy;
                this.oy = dx;
                break;
            default:
                self.shape.translate(dx - this.ox, dy - this.oy);
                this.ox = dx;
                this.oy = dy;
        }
    },
    end = function() {
    };
  

( self.shape это набор путей и прямоугольников Raphael)

Я пытаюсь сделать так, чтобы вы не могли перетаскивать фигуры из области холста SVG.Прямо сейчас я могу получить координаты ограничивающей рамки формы, bb переменной в move функции. Я пытался добавить проверку if(bb.x < 10)... , но я не знаю, как установить ограничение, чтобы сказать: «Не позволяйте ему двигаться дальше влево». Проблема в том, что я проверяю положение x ограничивающей рамки, но затем пытаюсь ограничить x положение фигуры?

Комментарии:

1. это не сработало? if ( bb.x < 10 ) bb.x = 10

2. Нет. Я использую x в ограничительной рамке для проверки положения, но я перевожу x, y фигуры. Если это имеет смысл.

Ответ №1:

Это не ответ как таковой, но он должен указать вам правильное направление.

ознакомьтесь со ссылкой на raphael 2.0 для перетаскивания

Изображение рядом с ним делает в значительной степени именно то, что вам нужно. Код, стоящий за этим, находится в reference.js досье. Если вы выполните поиск «Element.drag-extra», вы увидите этот фрагмент кода

 (function (r) {
    var x, y;
    r.circle(15, 15, 10).attr(fill).drag(function (dx, dy) {
        this.attr({
            cx: Math.min(Math.max(x   dx, 15), 85),
            cy: Math.min(Math.max(y   dy, 15), 85)
        });
    }, function () {
        x = this.attr("cx");
        y = this.attr("cy");
    });

})(prepare("Element.drag-extra"));
  

Здесь Дмитрий ограничивает перетаскивание между минимальным значением 15 и максимальным значением 85 пикселей. Должна быть возможность использовать небольшую магию DOM, чтобы определить размер холста и соответствующим образом изменить приведенный выше код.

Надеюсь, это немного поможет.

Комментарии:

1. почему «15» и «85»? я могу понять, почему «15», но «85» кажется, что это происходит из ниоткуда

2. потому что прямоугольник размером 100×100, а окружность имеет радиус 15. Вы всегда перемещаете центр окружности, поэтому минимальное положение центра равно 0 радиус (15), а максимальное — 100 радиус (85). На самом деле просто.

3. code r.circle(15, 15, 10) у вас установлен радиус 10. детали — это все

4. Вопрос остается в силе. 15 и 85 ограничивают круг внутри квадрата. Если бы я вернулся и посмотрел на это снова, я, возможно, решил ограничить 10, 90. Серьезно, это был довольно банальный комментарий, учитывая, что я пытался помочь.

5. без правильного радиуса вашего круга логика ваших настроек ограничений становится неясной. все, что вам нужно было сделать, это исправить свой первоначальный ответ