Поскольку ни один из приведенных ответов на самом деле не показывает, как ограничить перетаскиваемый объект треугольной областью, я подумал, что поделюсь этим jsfiddle, который демонстрирует реальный рабочий пример.
Я думаю, что ключевой момент здесь не в том, чтобы сконцентрироваться на аспекте «треугольника», а, что более важно, в реализации треугольника - это многоугольник. Это позволяет нам решить проблему с использованием многих существующих алгоритмов, которые относятся к точке и многоугольнику.
Эта библиотека 2D-графиков Библиотека 2D-графиков JavaScript предоставляет все инструменты, необходимые для решения этой проблемы. В основном, каждый Shape имеет связанную функцию constrain , которая будет ограничивать Point внутренней областью Shape (включая край ) через LineSegment , который подключается к центроиду Shape . (Также похоже, что вы можете установить центральную точку для Shape в качестве второго аргумента, который пригодится для вогнутых Polygon .) *
Это jsFiddle Ограничение треугольника с помощью jQuery UI Draggable использует обратный вызов jQuery UI Draggable drag в сочетании с библиотекой Graph для выполнения ограничения. Он фактически использует координаты многоугольника SVG для построения многоугольника графа, инвертируя только ось y для переключения между экранными и декартовыми координатами.
Настройка, выполняемая в готовом документе, довольно проста:
var points = $('polygon').attr('points').trim().split(' ').map(function(vertex) { var coordinates = vertex.split(','); return new aw.Graph.Point(Number(coordinates[0]), Number(-coordinates[1])); }),
triangle = new aw.Graph.Polygon(points);
$('.map-selector').draggable({
containment: '.map',
drag: function (event, ui) {
var left = ui.position.left, top = -ui.position.top;
var constrained = triangle.constrain(new aw.Graph.Point(left, top));
ui.position.left = constrained.x; ui.position.top = -constrained.y;
}
});
Ура! 1034 * *