У меня есть класс, который содержит параметр с именем values. Это используется для сохранения значений точек, которые представляют определенные c фигуры на холсте.
Мне нужно реализовать функциональность, которая позволяет мне перетаскивать эти фигуры, поэтому мне нужно изменить каждую конкретную c точку формы, удалив из них перетаскиваемую величину.
Итак, я решил, что при запуске события mousedown (которым является метод StartMove) я сохраню значения моих точек в переменной startValues , и когда я перемещаю мышь (перемещение метода), я затем обновляю значения, используя startValues и расстояние между начальной точкой и текущим положением мыши, чтобы определить местоположение моей новой точки.
Проблема в том, что , this.startValues фактически изменяется, чтобы соответствовать this.values каждый раз, когда мой курсор перемещается, и я понятия не имею, почему . Что мне не хватает простого? а затем преобразовать обратно в значение. Я включил родительский класс Grf, чтобы вы могли видеть методы, которые меняют значения на позицию и позицию на значения.
Класс с проблемами
class Test {
constructor(grf){
this.grf = grf; // Another class, which contains important methods
this.values = [];
this.startValues = [];
}
startMove(p0){ // p0 = [x,y]
const {grf} = this;
this.startValues = [...this.values]; //I also tried this.startValues = this.values
this.p0 = p0;
grf.canvas.addEventListener('mousemove',this.move);
grf.canvas.addEventListener('mouseup', this.endMove);
}
move = (evt) => { // arrow function so 'this' is bound to Test class instead of grf.canvas
const {grf, p0, values, startValues} = this;
const coords = grf.canvas.getBoundingClientRect();
const px = evt.clientX - coords.left;
const py = evt.clientY - coords.top;
for (let i = 0, iMax = this.values.length; i < iMax; i++){
values[i][0] = grf.valX(grf.posX(startValues[0]) - (p0[0] - px));
values[i][1] = grf.valY(grf.posY(startValues[1]) - (p0[1] - py));
}
console.log(this.startValues); // It changes to the same as this.values
}
endMove = (evt) => { // arrow function so 'this' is bound to Test class instead of grf.canvas
const {grf} = this;
grf.canvas.removeEventListener('mousemove',this.move);
grf.canvas.removeEventListener('mouseup',this.endMove);
}
}
Другой класс
class Grf {
constructor(canvas){ // Not the actual constructor, just an example of what the values could look like
this.translateX = 1000;
this.translateY = 1000;
this.scaleY = 10.7;
this.scaleX = 11.2;
this.canvas = canvas;
}
posX (value){
return (value-this.translateX)*this.scaleX;
}
posY (value){
return (this.canvas.height-(100*(value))-this.translateY)*this.scaleY;
};
valX(pos){
return (pos/this.scaleX) + this.translateX
}
valY(pos){
return (-1)*((pos/this.scaleY) + this.translateY - this.canvas.height)/100
}
}