当前位置: 首页 > article >正文

Three.js图像拼图技术

图像拼图-CSDN直播图像拼图https://live.csdn.net/v/460095https://live.csdn.net/v/460095

一.HTML部分

#board

二.CSS部分

#board {
  width:100vw;
  height:100vh;
  position:relative;
  filter:contrast(3);
  transition:filter 5s;
}

#board.finish {
  filter:contrast(1);
}

.puzzle {
  background: url(https://images.unsplash.com/photo-1516585427167-9f4af9627e6c?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=800dd307bb9474d017eeaf3c14c5d157&auto=format&fit=crop&w=4000&q=80);
  position:absolute;
  transition:all 0s; /*mod by js soon*/
}

img {
  display:none;
}

body {
  min-height:100vh;
  display:flex;
  flex-flow:column nowrap;
  justify-content:center;
  align-items:center;
}

三.JS部分

const sz = 5;
const dur = 0.3;

// 
// main 
//

const rndPos = shuffle(Array.from(Array(sz*sz), (x,i)=>i));

for (let i = 0; i < sz * sz; i++) {
  const el = makeEl(i);
  el.dataset.correctPos = i;
  el.dataset.currentPos = rndPos[i];
  moveToCurrentPos(el);
  board.appendChild(el);
}

const N = sz * sz;
const remain = Array.from(Array(N), (x,i)=>i.toString());
const rndRemainEl = ()=> board.children[remain[Math.random() * remain.length | 0]];
const advance = () => {
  const at = remain.indexOf(el.dataset.correctPos);
  remain.splice(at, 1);
  return (remain.length) ? rndRemainEl() : null;
}


let i = 0;
let el = board.children[0];
setTimeout(function f() {
  while (el.dataset.currentPos == el.dataset.correctPos)
    if (!(el = advance())) return cbFinish();
  correct(el); 
  if (!(el = advance())) return cbFinish();
  setTimeout(f, dur*1e3);
}, 10);


function cbFinish() {
  board.classList.add("finish");
}


// 
// fns
// 


// shuffle
function shuffle(arr) {
  let n = arr.length;
  while(n) {
    let i = Math.random() * n | 0;
    n--; 
    let tmp = arr[n];
    arr[n] = arr[i];
    arr[i] = tmp;
  }
  return arr;
}

function makeEl(idx) {
  const el = document.createElement("div");
  el.classList.add("puzzle");
  el.style.backgroundPosition = `-${(idx%sz)*100}% -${(idx/sz|0)*100}%`;
  el.style.width = `${100/sz}%`;
  el.style.height = `${100/sz}%`;
  el.style.transitionDuration = `${dur}s`;
  el.style.backgroundSize = `${sz*100}% ${sz*100}%`;
  return el;
}

function moveToCurrentPos(el) {
  const idx = el.dataset.currentPos;
  el.style.left = `${idx%sz/sz*100}%`;
  el.style.top = `${(idx/sz|0)/sz*100}%`;
}

function correct(el) {
  const dstEl = board.querySelector(`[data-current-pos="${el.dataset.correctPos}"]`);
  dstEl.dataset.currentPos = el.dataset.currentPos; // update dstEl currentPos
  moveToCurrentPos(dstEl); // dstEl goto new pos
  el.dataset.currentPos = el.dataset.correctPos; // update el currentPos 
  moveToCurrentPos(el);
  return dstEl;
}


http://www.kler.cn/a/508345.html

相关文章:

  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • VS Code--常用的插件
  • 基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
  • 从AI原理到模型演进及代码实践 的学习二
  • SUN的J2EE与微软的DNA
  • 频域增强通道注意力机制EFCAM模型详解及代码复现
  • 奉加微PHY6230兼容性:部分手机不兼容
  • ElasticSearch下
  • 关于php语言api接口开发的流程
  • [0242-06].第06节:SpringBoot对SpringMVC的自动配置
  • 【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
  • ZNS SSD垃圾回收优化方案解读-1
  • 优化神马关键词排名原理(优化神马搜索引擎关键词排名规则)
  • 求两个矩阵的乘积
  • Docker拉取hello-world失败超时解决方法(配置多个镜源)
  • SurgiTrack:外科手术视频中的细粒度多类别多工具跟踪|文献速递-视觉大模型医疗图像应用|文献速递-视觉大模型医疗图像应用
  • C++学习记录
  • 生成树机制实验
  • Spring boot面试题----Spring Boot项目中如何实现兼容老的Spring项目
  • 2018年西部数学奥林匹克几何试题
  • 支付宝“政府补贴”bug事件背后的权限管理启示
  • Python学习(十)IO编程(文件读写、StringIO和BytesIO、操作文件和目录、序列化)
  • MySql-9.1.0安装详细教程(保姆级)
  • Nginx 之Rewrite 使用详解
  • 集成方案 | Docusign + Oracle,实现合同签署与管理的高效协同!
  • OpenHarmony API 设计规范