Nano Hash - криптовалюты, майнинг, программирование

Как сделать так, чтобы html-холст прокручивался бесконечно?

У меня есть элемент холста, который автоматически заполняет все окно браузера клиента при загрузке. На нем можно рисовать мышкой, как в любом учебнике по созданию чертежной доски. Что я хочу сделать, так это сделать так, чтобы, если вы переместите мышь в любую крайнюю точку холста (или, возможно, выберете определенный инструмент «перемещения», вы можете перетащить холст в любом направлении, которое вы хотите), это свитки. В частности, я хочу, чтобы теоретически можно было прокручивать бесконечно, поэтому я не могу предварительно генерировать, я должен генерировать «больше холста» на лету. Кто-нибудь знает, как это сделать?

Если это поможет, это javascript на стороне клиента прямо сейчас: (html - это просто тег холста)

$(document).ready(function() {
    init();
});

function init() {
    var canvas = document.getElementById('canvas')
      , ctx = canvas.getContext('2d')
      , width = window.innerWidth
      , height = window.innerHeight;

    // Sets the canvas size to be the same as the browser size
    canvas.width = width;
    canvas.height = height;

    // Binds mouse and touch events to functions
    $(canvas).bind({
        'mousedown':  startDraw,
        'mousemove':  draw,
        'mouseup':    stopDraw,
    });
};

// Triggered on mousedown, sets draw to true and updates X, Y values.
function startDraw(e) {
    this.draw = true;
    this.X = e.pageX;
    this.Y = e.pageY;
};

// Triggered on mousemove, strokes a line between this.X/Y and e.pageX/Y
function draw(e) {
    if(this.draw) {
        with(ctx) {
            beginPath();
            lineWidth = 4;
            lineCap = 'round';
            moveTo(this.X, this.Y);
            lineTo(e.pageX, e.pageY);
            stroke();
        }
        this.X = e.pageX;
        this.Y = e.pageY;
    }
};

// Triggered on mouseup, sets draw to false
function stopDraw() {
    this.draw = false;
};
28.03.2011

  • Вы пытались просто установить переменную для сохранения значений прокрутки X и Y, а затем просто добавить ее к координатам того, что вы будете рисовать? 29.03.2011
  • Вы когда-нибудь получали рабочую версию этого? 22.03.2012
  • Возможный дубликат сделать холст бесконечным 31.12.2016

Ответы:


1

Элемент холста использует реальную память вашего компьютера, поэтому нет бесконечного холста, который прокручивается вечно. Но вы можете имитировать это поведение с помощью виртуального холста. Просто запишите координаты xy, захваченные функцией draw(), в массив и вычислите новый центр виртуального холста, если мышь коснется границы. Затем отфильтруйте координаты xy, которые вписываются в центр + размер экрана, и нарисуйте их.

Однако массив, записывающий координаты xy, не может расти бесконечно, и код фильтра будет работать медленнее по мере увеличения размера массива. Достаточно ли 10 000 баллов?

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

29.03.2011
  • ›Элемент холста использует реальную память вашего компьютера, поэтому нет бесконечного холста, который прокручивается вечно. Да, я понимаю это. Прямо сейчас я отправляю каждую нарисованную строку с помощью socket.io на сервер node.js, поэтому она потенциально может быть сохранена на стороне сервера. Что я имел в виду под предварительным рендерингом, так это то, что как только пользователь начал прокручивать/двигаться в одном направлении, клиент запрашивал данные о том, что было нарисовано в этом направлении ранее, и рисовал это прямо перед тем, как оно появится на экране. 29.03.2011
  • У вас есть решение, как только вы установите верхние пределы ширины и высоты вашего виртуального холста. 29.03.2011
  • Я не уверен, что понимаю, что вы имеете в виду. Сейчас у меня вообще нет виртуального холста, пользователь может рисовать в том пространстве, которое у него есть в окне браузера, вот и все. Вы имеете в виду, что я должен каким-то образом абстрагироваться от координат и вычислить смещение от реального холста? 29.03.2011
  • Да, как только вы говорите, что виртуальный холст имеет, например. 10 000 x 10 000 пикселей, вы избежите головной боли. 29.03.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..