Рисование шкалы времени от div до div с помощью canvas

0

У меня есть следующая разметка div

<div data-x="-1000" data-y="-1500">
// content
</div>
<div data-x="0" data-y="-1500">
// content
</div>

И у меня есть много из этих divs с разными значениями data-x и data-y в зависимости от их положения.

То, что я хочу достичь здесь, - это нарисовать что-то вроде временной шкалы между divs, поэтому div1 line to div2 line to div 3 и т.д.

Я хочу, чтобы это было сделано автоматически. Поэтому я пытаюсь создать цикл для него, но мои знания javascript/jquery не так уж хороши. Может ли кто-нибудь указать мне в хорошем направлении?

теперь у меня есть

    function drawTimeline() {

  var divs = document.getElementsByTagName('div');
   var canvas = document.getElementById('timeline');

  // Make sure we don't execute when canvas isn't supported
  if (canvas.getContext){

    // use getContext to use the canvas for drawing
    var ctx = canvas.getContext('2d');
    var prevCoord = {};

    for (var i = -1; div = divs[++i]; ) {
      if (div.dataset.x && div.dataset.y) {
        var x = parseInt(div.dataset.x);
        var y = parseInt(div.dataset.y);
        if ({} !== prevCoord) {

          ctx.beginPath();
          ctx.lineWidth="5";
          ctx.strokeStyle="purple"; // Purple path
          ctx.moveTo(prevCoord.x, prevCoord.y);
          ctx.lineTo(x, y);
          ctx.closePath();
          ctx.stroke()
        }

          prevCoord.x = x;
          prevCoord.y = y;
      }
    }

  } else {
    alert('You need Safari or Firefox 1.5+ to see this.');
  }

}

к сожалению, линия не правильна, как линейная линия, и это... может кто-то помочь мне с этим?

  • 0
    Не могли бы вы лучше объяснить проблему? Что вы подразумеваете под linear line ? В вашем примере есть только 2 точки данных (каждая из которых имеет позиции вне холста) и, таким образом, рисует невидимый отрезок прямой линии от <-1000, -1500> до <0, -1500> - вертикальная линия 1000 пикселей долго. Желаете ли вы масштабировать линии так, чтобы неизвестное количество сегментов неизвестной длины всегда помещалось в области рисования известного и заранее определенного размера?
Теги:
html5-canvas

1 ответ

0

У вас есть правильная идея, но ваша проблема заключается в том, что холст не рисует отрицательные координаты.

Поэтому вы должны сопоставить все ваши данные-x и data-y в положительные координаты.

Здесь функция, которая отображает ваши отрицательные значения в положительные значения:

function mapRange(value, sourceLow, sourceHigh, mappedLow, mappedHigh) {
    return mappedLow + (mappedHigh - mappedLow) * (value - sourceLow) / (sourceHigh - sourceLow);
}

Поэтому в вашем примере для сопоставления значения data-x -300 в экранном диапазоне 0-1000 можно сделать следующее:

var x = mapRange(-300, -1500,0, 0,1000);  // The mapped x is 466.66.

Вы должны переместить свои divs в сопоставленные координаты x, y, которые вы можете сделать с помощью CSS.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню