Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Помогите разобраться со скриптом


Автор: neoks 29.1.2019, 12:16
Всем примет, есть скрипт масштабирования, работает вполне себе нормально, захотел сделать чтобы масштаб регулировался поменьше, чтобы при скроле не уменьшался в 2 раза а скажем там в 1.5
Но чет не могу разобрать логику этого масштабирования, крутил и так и сяк, не догоняю как это сделать))

Вот фрагмент когда срабатывает эвент скролла
Код

var delta = 0;
            var r     = canvas.getBoundingClientRect();

            if(!e) e = $.e;

            if (e.wheelDelta){
                delta = e.wheelDelta / 120;

                if ($.opera) delta = -delta;
            } 
            else if (e.detail) delta = -e.detail / 3;

            var canvasZoomX = (e.clientX - r.left);
            var canvasZoomY = (e.clientY - r.top);

            if (delta > 0){   
                // ZOOMING IN
                var zoomedX = canvasPos.deltaX - (canvasZoomX - canvasPos.deltaX);
                var zoomedY = canvasPos.deltaY - (canvasZoomY - canvasPos.deltaY);

                // scale the image up by 2
                self.scale = self.scale * 2;
            }
            else{   
                // ZOOMING OUT
                var zoomedX = (canvasPos.deltaX + canvasZoomX) / 2;
                var zoomedY = (canvasPos.deltaY + canvasZoomY) / 2;

                // scale the image down by 2
                self.scale = self.scale / 2;
            }

            // we need to clear the canvas, otherwise we'll have a bunch of overlapping images
            //ctx.clearRect(0,0, canvas.width, canvas.height);

            self.dispatchEvent({type: 'draw', x: zoomedX, y: zoomedY, scale: self.scale});

            // update the new canvas position
            canvasPos.deltaX = zoomedX;
            canvasPos.deltaY = zoomedY;


Вроде бы как логично править тут
Код

self.scale = self.scale * 2;


и тут
Код

self.scale = self.scale / 2;


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

Автор: Romikgy 29.1.2019, 15:19
Цитата(neoks @  29.1.2019,  11:16 Найти цитируемый пост)
 var zoomedX = (canvasPos.deltaX + canvasZoomX) / 2;
                var zoomedY = (canvasPos.deltaY + canvasZoomY) / 2;
                // scale the image down by 2
                self.scale = self.scale / 2;

Код

var zoom=1.5;
var zoomedX = (canvasPos.deltaX + canvasZoomX) / zoom;
var zoomedY = (canvasPos.deltaY + canvasZoomY) / zoom;
self.scale = self.scale / zoom;

Автор: neoks 29.1.2019, 15:58
Неа, не помогло, тоже так пробовал)

Вот накидал рабочий пример https://jsfiddle.net/vwbsprmy/1/

Автор: Romikgy 29.1.2019, 17:33
Код

            var z=1.5;
            if (delta > 0){   
                // ZOOMING IN
                var zoomedX = canvasZoomX - (canvasZoomX -canvasPos.deltaX ) * z;
                var zoomedY = canvasZoomY - (canvasZoomY-canvasPos.deltaY) * z;
                self.scale = self.scale * z;
                
            }
            else{   
                // ZOOMING OUT
                var zoomedX = canvasZoomX - (canvasZoomX -canvasPos.deltaX ) / z;
                 var zoomedY = canvasZoomY - (canvasZoomY-canvasPos.deltaY) / z;
                                self.scale = self.scale / z; 
            }

Автор: neoks 29.1.2019, 18:28
Цитата(Romikgy @  29.1.2019,  17:33 Найти цитируемый пост)
Romikgy

Большое спасибо, теперь то что надо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)