Есть несколько вещей:
Первый
d3.event.translate
не содержит значения x и y преобразования, используйте d3.event.transform, чтобы получить эти значения. Объект преобразования имеет свойства x, y и k.
Секунда
Если вы используете .style()
для размещения преобразования, вам нужно указать, что единица измерения - это пиксели для смещения:
var t = d3.event.transform;
d3.select("zoomedElement")
.style('transform', 'translate('+t.x+"px,"+t.y + 'px)scale(' + t.k + ')');
Альтернативно , вы можете использовать .attr()
без px
:
var t = d3.event.transform;
d3.select("zoomedElement")
.style('transform', 'translate('+[t.x,t.y]+')scale(' + t.k + ')');
Давайте посмотрим на ваш плункер с этими изменениями (и без степени перевода):
var zoom = d3.zoom()
.scaleExtent([1, 100])
.on('zoom', zoomFn);
d3.select('svg')
.select('g')
.style("transform-origin", "50% 50% 0");
function zoomFn() {
var t = d3.event.transform;
d3.select('svg').select('g')
.style('transform', 'translate('+t.x+"px,"+t.y + 'px)scale(' + t.k + ')');
}
d3.select('svg')
.select('rect')
.call(zoom);
.zoom-layer {
fill: #EEE;
fill-opacity: 0.25;
}
Вы, вероятно, хотите сделать выделение, не включающее прямоугольник, - оно должно остаться таким же, чтобы вся поверхность SVG оставалась интерактивной [ 1121]
Третий
Выглядит так, как будто вы хотите перевести экстент, иногда это немного сложно установить. Этот ответ углубляется в степень увеличения / степени масштабирования, но я расскажу, как ограничить ваш круг на экране:
С переводом [0,0] ваш круг сидит в середине SVG. Если мы переведем [-150, -150], ваш круг будет в верхнем левом углу svg. Если круг центрируется на cx = 150 cy = 150, то верхний левый угол видимой области теперь равен [150,150]. Следовательно, справа внизу - [450,450]. Видимый размер: [[150,150],[450,450]]
.
С переводом [150,150] ваш круг находится в правом нижнем углу SVG. Поскольку круг все еще находится в [150,150], нижний правый угол находится в [150,150] (не помогает ясности, что перевод и положение круга имеют одинаковое значение здесь) . Верхний левый угол находится на [-150,-150]
. Тогда видимый размер должен быть: [[-150,-150],[150,150]]
.
Мы берем крайности из пределов видимого экстента, так как это экстент перевода, который держит круг в поле зрения:
var translateExtent = [[-150,-150],[450,450]]
Естественно, если у вас были вещи во всех углах, а не в середине Вы бы имели большую степень.
И мы можем применить все к фрагменту:
var zoom = d3.zoom()
.scaleExtent([1, 100])
.translateExtent([[-150,-150],[450, 450]])
.on('zoom', zoomFn);
d3.select('svg')
.select('g')
.style("transform-origin", "50% 50% 0");
function zoomFn() {
var t = d3.event.transform;
d3.select('svg').select('g')
.style('transform', 'translate('+t.x+"px,"+t.y + 'px)scale(' + t.k + ')');
console.log(t.x,t.y)
}
d3.select('svg')
.select('rect')
.call(zoom);
.zoom-layer {
fill: #aaa;
fill-opacity: 0.25;
}
Я думаю, что Clojure является очень хорошим языком. Если я должен указать на какой-либо дефект, случается так, что это является очень новым, и даже при том, что язык кажется очень сформировавшимся и готовое производство, инструменты и платформы вокруг этого не. Таким образом, если Вы собираетесь сделать, например, веб-приложение, не ожидайте стрелять, три команды и иметь "Ваше первое веб-приложение работает, теперь прочитайте эту документацию для создания моделей" - страница на браузере.
нет то, что многие библиотеки, записанные в Clojure все же также, но это не огромная проблема, если Вы полагаете, что можно использовать почти что-либо записанное в Java.
Haskell в настоящее время имеет большое следующее и растущую основу библиотеки и приложения . Это также используется для образования и исследования. Я нахожу это очень хорошим языком для использования.
Вы перечисляете CouchDB в своем вопросе, и он записан в Erlang, который предназначен, чтобы быть довольно захватывающим языком, после того как Вы входите в него.
Haskell, Erlang и Clojure являются всем хорошим выбором. Я лично рекомендовал бы Clojure, Вы смогли делать некоторый интересный материал базы данных с программным обеспечением Система памяти Transational, которая является частью Clojure.
У меня нет личного опыта работы с Клоюре, но я действительно рекомендую F#. Это довольно мощный язык в стиле OCaml. Мне он очень нравится, потому что это отладочные инструменты, а IDE непревзойденный, и вы можете воспользоваться практически любой библиотекой на (огромной) .NET платформе.