日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

Web前端笔记-画布拖动及放缩(two.js)

發布時間:2025/3/15 HTML 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web前端笔记-画布拖动及放缩(two.js) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序運行截圖如下:

結構圖如下:

關鍵代碼如下:

界面調用

HelloWorld.vue

<template><div><div id="draw-shapes"></div></div> </template><script>import "JS/two"import "JS/zui";import {demo1} from "JS/test1";export default {name: 'HelloWorld',data () {return {msg: 'Welcome to Your Vue.js App'}},mounted() {demo1();}} </script><style scoped></style>

js關鍵代碼如下:

zui.js

(function(Two){let _ = Two.Utils;let Surface = function(object) {this.object = object;};_.extend(Surface.prototype, {limits: function(min, max) {let min_exists = !_.isUndefined(min);let max_exists = !_.isUndefined(max);if (!max_exists && !min_exists) {return { min: this.min, max: this.max };}this.min = min_exists ? min : this.min;this.max = max_exists ? max : this.max;return this;},apply: function(px, py, s) {this.object.translation.set(px, py);this.object.scale = s;return this;}});let ZUI = Two.ZUI = function(group, domElement) {this.limits = {scale: ZUI.Limit.clone(),x: ZUI.Limit.clone(),y: ZUI.Limit.clone()};this.viewport = domElement || document.body;this.viewportOffset = {matrix: new Two.Matrix()};this.surfaceMatrix = new Two.Matrix();this.surfaces = [];this.reset();this.updateSurface();this.add(new Surface(group));};_.extend(ZUI, {Surface: Surface,Clamp: function(v, min, max) {return Math.min(Math.max(v, min), max);},Limit: {min: -Infinity,max: Infinity,clone: function() {let result = {};for (let k in this) {result[k] = this[k];}return result;}},TranslateMatrix: function(m, x, y) {m.elements[2] += x;m.elements[5] += y;return m;},PositionToScale: function(pos){return Math.exp(pos);},ScaleToPosition: function(scale){return Math.log(scale);}});_.extend(ZUI.prototype, {constructor: ZUI,add: function(surface){this.surfaces.push(surface);let limits = surface.limits();this.addLimits(limits.min, limits.max);return this;},addLimits: function(min, max, type) {type = type || 'scale';if (!_.isUndefined(min)){if(this.limits[type].min){this.limits[type].min = Math.max(min, this.limits[type].min);}else{this.limits[type].min = min;}}if(_.isUndefined(max)){return this;}if(this.limits[type].max){this.limits[type].max = Math.min(max, this.limits[type].max);}else{this.limits[type].max = max;}return this;},clientToSurface: function(x, y) {this.updateOffset();let m = this.surfaceMatrix.inverse();let n = this.viewportOffset.matrix.inverse().multiply(x, y, 1);return m.multiply.apply(m, _.toArray(n));},surfaceToClient: function(v) {this.updateOffset();let vo = this.viewportOffset.matrix.clone();let sm = this.surfaceMatrix.multiply.apply(this.surfaceMatrix, _.toArray(v));return vo.multiply.apply(vo, _.toArray(sm));},graphicMove: function(clientX, clientY){let dx = clientX;let dy = clientY;this.translateSurface(dx, dy);return this;},zoomBy: function(byF, clientX, clientY){let s = ZUI.PositionToScale(this.zoom + byF);this.zoomSet(s, clientX, clientY);return this;},zoomSet: function(zoom, clientX, clientY) {let newScale = this.fitToLimits(zoom);this.zoom = ZUI.ScaleToPosition(newScale);if (newScale === this.scale) {return this;}let sf = this.clientToSurface(clientX, clientY);let scaleBy = newScale / this.scale;this.surfaceMatrix.scale(scaleBy);this.scale = newScale;let c = this.surfaceToClient(sf);let dx = clientX - c.x;let dy = clientY - c.y;this.translateSurface(dx, dy);return this;},translateSurface: function(x, y) {ZUI.TranslateMatrix(this.surfaceMatrix, x, y);this.updateSurface();return this;},updateOffset: function() {let rect = this.viewport.getBoundingClientRect();_.extend(this.viewportOffset, rect);this.viewportOffset.left -= document.body.scrollLeft;this.viewportOffset.top -= document.body.scrollTop;this.viewportOffset.matrix.identity().translate(this.viewportOffset.left, this.viewportOffset.top);return this;},updateSurface: function() {let e = this.surfaceMatrix.elements;for(let i = 0; i < this.surfaces.length; i++){this.surfaces[i].apply(e[2], e[5], e[0]);}return this;},reset: function() {this.zoom = 0;this.scale = 1.0;this.surfaceMatrix.identity();return this;},fitToLimits: function(s) {return ZUI.Clamp(s, this.limits.scale.min, this.limits.scale.max);}});}) ((typeof global !== 'undefined' ? global : (this || window)).Two);

test1.js

;import * as Two from "JS/two"; import * as $ from "JS/jquery"export function demo1(){let elem = document.getElementById('draw-shapes');let params = {type: Two.Types['webgl'],fullscreen: true,autostart: true}let two = new Two(params).appendTo(elem);let circle = two.makeCircle(0, 0, 50);let rect = two.makeRectangle(2000, 2000, 100, 100);circle.fill = '#FF8000';circle.stroke = 'orangered';circle.linewidth = 5;rect.fill = 'rgb(0, 200, 255)';rect.opacity = 5;rect.noStroke();two.update();let zui = new Two.ZUI(two.scene);zui.addLimits(0.06, 8);let $stage = $(two.renderer.domElement);$stage.bind('mousewheel wheel' , function (event){let e = event.originalEvent;e.stopPropagation();e.preventDefault();let dy = (e.wheelDeltaY || -e.deltaY) / 1000;zui.zoomBy(dy, e.clientX, e.clientY);});let isPressed = false;let originalPositionX = 0;let originalPositionY = 0;$stage.bind('mouseup', function(event){isPressed = false;});$stage.bind('mousemove', function(event){if(isPressed){let boolX = event.clientX - originalPositionX;let boolY = event.clientY - originalPositionY;zui.graphicMove(boolX, boolY);originalPositionX = event.clientX;originalPositionY = event.clientY;}});$stage.bind('mousedown', function(event){isPressed = true;originalPositionX = event.clientX;originalPositionY = event.clientY;}); }

?

總結

以上是生活随笔為你收集整理的Web前端笔记-画布拖动及放缩(two.js)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免播放器在线视频 | 亚洲永久精品国产 | 亚洲综合首页 | 玖玖爱精品 | 女优中文字幕 | av动漫天堂 | 黄色三级免费观看 | 黄色动漫软件 | 国产精品vip | 免费的一级黄色片 | 精品久久久蜜桃 | 成人午夜影视在线观看 | 91精品国产综合久久久蜜臀图片 | 欧美日韩免费一区 | 激情视频一区二区三区 | 午夜伦理视频 | 国产欧美一区二区三区视频 | 亚洲免费成人网 | 奶水喷溅虐奶乳奴h文 | 久久久精品视频在线观看 | 国产精品高潮呻吟久久久 | v8888av| 色综合婷婷 | 男人操女人逼逼视频 | 被两个男人吃奶三p爽文 | 短裙公车被强好爽h吃奶视频 | 欧美日韩xxxx | 国产美女www爽爽爽视频 | 色妞欧美| 日韩av在线第一页 | 最近中文字幕 | 亚洲成年人专区 | 国产精品女人久久久 | 午夜影院在线观看免费 | 呦女精品 | 日日操夜夜操狠狠操 | 亚洲乱码日产精品bd在线观看 | 最新在线黄色网址 | 一卡二卡在线观看 | 国产日韩一区二区三区在线观看 | 欧美xxxx黑人 | 邻家有女4完整版电影观看 欧美偷拍另类 | 亚洲中文字幕一区二区 | 性色AV无码久久一区二区三 | 国产男女裸体做爰爽爽 | 一本av在线| 中文字幕无码不卡免费视频 | 牛牛在线 | 无遮挡又爽又刺激的视频 | 高清中文字幕在线a片 | 狠狠干in | 九一在线视频 | 91精选视频 | 无码精品人妻一区二区 | 日韩黄色免费观看 | 亚洲Av无码成人精品区伊人 | 婷婷六月天| 久久嫩草视频 | 欧美精品成人一区二区在线观看 | 茄子视频色 | 丝袜人妻一区二区三区 | 欧美肥老妇视频九色 | 亚洲av综合色区无码一二三区 | 好爽又高潮了毛片 | 刘亦菲久久免费一区二区 | 久热最新视频 | 亚洲午夜电影网 | 国产精品免费久久久久 | 国产99精品 | a视频免费 | 国产精品久久久久久久久岛 | 欧美浪妇xxxx高跟鞋交 | 精品国产户外野外 | 日韩美女毛片 | 超薄肉色丝袜一区二区 | 日韩中文字幕网址 | jizz美女| 亚洲激情一区二区三区 | 中文字幕亚洲乱码熟女1区2区 | 在线免费黄色 | 韩国主播青草55部完整 | 超碰超在线 | 欧美播放器 | 91肉色超薄丝袜脚交一区二区 | 日本美女黄色大片 | 女人喂男人奶水做爰视频 | 日韩精品福利 | 人妻熟女aⅴ一区二区三区汇编 | 一级片黑人 | 日本亲与子乱xxx | 在线中文av | 欧美黑人多人双交 | 一区二区三区视频观看 | 色操插 | 国产精在线 | 国产三级理论片 | 欧美成人做爰猛烈床戏 | 伊人www | 亚洲双插 |