Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.01.2021, 19:05
Новичок на форуме
Отправить личное сообщение для DragonFly Посмотреть профиль Найти все сообщения от DragonFly
 
Регистрация: 28.01.2021
Сообщений: 3

ARR в canvas.onmouse
Товарищи! Имеем следующую часть кода, задача которой во время движения мыши считывать ее координаты по X, Y и записывать эти координаты в массивы mgx=[] и mgy=[] так, чтобы пара координат была записана туда лишь единожды, без повторения, по одному разу. Как только массив достигает значения в 16 символов, будет выполнена команда отпускания мыши.

Попробовал реализовать данную задачу работой массива внутри функции canvas.onmousedown = function(event) {...}, а именно так, что при нажатии onmouseclick мы получаем на вход первую пару координат, далее при движении onmousemove по плану идет сверка новой пары коодинат с координатами в массиве, таким образом достигается отсутствие повторений, но массив не хочет работать внутри функций onmouse. Кто шарит, подскажите что изменить в коде чтобы заработало или мб попробовать другую логику?


const canvas = document.getElementById("TFG");
const ctx = canvas.getContext("2d");

var mgx = [];
var mgy = [];


canvas.onmousedown = function(event) {

  var x = event.offsetX;
  var y = event.offsetY;
  x = Math.floor(x/30); //работаем с боксами 30x30 пикселей по X
  y = Math.floor(y/30); //и по Y соответственно
  mgx.push(x);
  mgy.push(y);
  console.log(mgx);
  console.log(mgy);
  canvas.onmousemove = function(event) {

    var x = event.offsetX;
    var y = event.offsetY;
    x = Math.floor(x/30);
    y = Math.floor(y/30);
    for (var i=0; i < mgy.lenght; i++) {
      if (x == mgx[i] && y == mgy[i]) {
        break;
      }
      if (i == (mgy.length - 1)) {
        mgx.push(x);
        mgy.push(y);
      }
    }
    canvas.onmouseup = function() {
      canvas.onmousemove = null;
    }

  }
}
Ответить с цитированием
  #2 (permalink)  
Старый 28.01.2021, 19:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,700

const canvas = document.getElementById("TFG");
const ctx = canvas.getContext("2d");
 
var mgx = [];
var mgy = [];
 
 
canvas.onmousedown = function(event) {
 
  var x = event.offsetX;
  var y = event.offsetY;
  x = Math.floor(x/30); //работаем с боксами 30x30 пикселей по X
  y = Math.floor(y/30); //и по Y соответственно
  mgx.push(x);
  mgy.push(y);
  console.log(mgx);
  console.log(mgy);
  canvas.onmousemove = function(event) {
 
    var x = event.offsetX;
    var y = event.offsetY;
    x = Math.floor(x/30);
    y = Math.floor(y/30);
    let exist = false;
    for (var i=0; i < mgy.length; i++) {
      if (x == mgx[i] && y == mgy[i]) {
        exist = true;
        break;
      }
    }
    if (! exist) {
        mgx.push(x);
        mgy.push(y);
    }
    if (mgy.length == 16)  canvas.onmousemove = null;
 }

   
    canvas.onmouseup = function() {
      canvas.onmousemove = null;
      canvas.onmouseup = null;
    }
}

В принципе ваш код тоже может работать, если ошибку исправить
for (var i=0; i < mgy.lenght; i++) {

Последний раз редактировалось voraa, 28.01.2021 в 20:06.
Ответить с цитированием
  #3 (permalink)  
Старый 28.01.2021, 19:59
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от DragonFly
Как только массив достигает значения в 16 символов, будет выполнена команда отпускания мыши.
Это как это? Вы разрабатываете устройство, которое по рукам пользователю бить будет?

Попробуйте так:
const BOX_SIDE_SIZE = 30;
const MAX_DISTANCE = 16;

const canvas = document.getElementById('TFG');
const ctx = canvas.getContext('2d');

const getKeyByCoordinates = ({x, y}) => `${x}*${y}`;
const getCoordinatesByEvent = e => ({
    x: Math.floor(e.offsetX / BOX_SIDE_SIZE),
    y: Math.floor(e.offsetY / BOX_SIDE_SIZE),
});

let coordinates = {}, 
    coordsLength = 0, 
    mouseStillPressed = false;

canvas.addEventListener('mousedown', e => {
    const eventCoordinates = getCoordinatesByEvent(e);
    
    coordinates = {
        [getKeyByCoordinates(eventCoordinates)]: eventCoordinates
    };
    coordsLength = 1;
    mouseStillPressed = true;
});

canvas.addEventListener('mousemove', e => {
    if (!mouseStillPressed || coordsLength >= MAX_DISTANCE) {
        return;
    }
    
    const eventCoordinates = getCoordinatesByEvent(e);
    const key = getKeyByCoordinates(eventCoordinates);
    
    if (!coordinates[key]) {
        coordinates[key] = eventCoordinates;
        ++coordsLength;
    }
});

canvas.addEventListener('mousemove', e => {
    mouseStillPressed = false;
});
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2021, 22:48
Новичок на форуме
Отправить личное сообщение для DragonFly Посмотреть профиль Найти все сообщения от DragonFly
 
Регистрация: 28.01.2021
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
let exist = false;
    for (var i=0; i < mgy.length; i++) {
      if (x == mgx[i] && y == mgy[i]) {
        exist = true;
        break;
      }
    }
    if (! exist) {
        mgx.push(x);
        mgy.push(y);
    }

В принципе ваш код тоже может работать, если ошибку исправить
for (var i=0; i < mgy.lenght; i++) {


Благодарю! Код действительно заработал после исправления ошибки, но я все таки обновил его, мне понравился ход с переменной exist
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2021, 22:50
Новичок на форуме
Отправить личное сообщение для DragonFly Посмотреть профиль Найти все сообщения от DragonFly
 
Регистрация: 28.01.2021
Сообщений: 3

Сообщение от Nexus Посмотреть сообщение
Это как это? Вы разрабатываете устройство, которое по рукам пользователю бить будет?

Попробуйте так:
const BOX_SIDE_SIZE = 30;
const MAX_DISTANCE = 16;

const canvas = document.getElementById('TFG');
const ctx = canvas.getContext('2d');

const getKeyByCoordinates = ({x, y}) => `${x}*${y}`;
const getCoordinatesByEvent = e => ({
    x: Math.floor(e.offsetX / BOX_SIDE_SIZE),
    y: Math.floor(e.offsetY / BOX_SIDE_SIZE),
});

let coordinates = {}, 
    coordsLength = 0, 
    mouseStillPressed = false;

canvas.addEventListener('mousedown', e => {
    const eventCoordinates = getCoordinatesByEvent(e);
    
    coordinates = {
        [getKeyByCoordinates(eventCoordinates)]: eventCoordinates
    };
    coordsLength = 1;
    mouseStillPressed = true;
});

canvas.addEventListener('mousemove', e => {
    if (!mouseStillPressed || coordsLength >= MAX_DISTANCE) {
        return;
    }
    
    const eventCoordinates = getCoordinatesByEvent(e);
    const key = getKeyByCoordinates(eventCoordinates);
    
    if (!coordinates[key]) {
        coordinates[key] = eventCoordinates;
        ++coordsLength;
    }
});

canvas.addEventListener('mousemove', e => {
    mouseStillPressed = false;
});


Да! Только не бить по рукам, а сверху будет падать шкаф, если вовремя не отпустить!

Ваш код разбирать и разбирать для понимания, взял на вооружения в качестве оптимизации, благодарю!
Ответить с цитированием
  #6 (permalink)  
Старый 28.01.2021, 23:29
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от DragonFly
Ваш код разбирать и разбирать для понимания
Код на самом деле простой.

Используется: деструктуризация, стрелочные функции, template strings, переменные let и псевдоконстанты const, работа с событиями и присвоение объекту динамического ключа (как это «по-умному» называется - не знаю).
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
javascript сортировка option и value по алфавиту mopsusha Элементы интерфейса 55 21.06.2018 09:30
Что быстрее? arr.pop vs arr = [] ? Maxfashko Общие вопросы Javascript 4 25.06.2016 16:06
Движение по массиву с помощью другого массива. dimast Общие вопросы Javascript 10 01.02.2013 09:26
Кроссбраузерная обертка AttachEvent Dim@ Ваши сайты и скрипты 13 21.08.2012 21:21
когда можно использовать for(var k in arr) scuter Общие вопросы Javascript 17 29.08.2008 15:34