js实现三维数据方块效果代码

代码语言:html

所属分类:三维

代码描述:js实现三维数据方块效果代码

代码标签: js 三维 数据 方块

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>

  <meta charset="UTF-8">
  
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;700&display=swap" rel="stylesheet">


  
  
<style>
html,
body {
  width: 100%;
  height: 100%;
  margin: 0;
  background: #2e3440;
  transform: translateZ(0);
  font-family: Nunito, Arial, sans-serif;
}
#stage {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: -webkit-grab;
  cursor: grab;
}
#stage:active {
  cursor: -webkit-grabbing;
  cursor: grabbing;
}
#checkbox {
  display: none;
  visibility: hidden;
  opacity: 0;
}
#checkbox:checked + .toggle {
  background: #5e81ac;
}
#checkbox:checked + .toggle:before {
  content: "Show Active Bits";
}
#checkbox:not(:checked) + .toggle {
  background: #b48ead;
}
#checkbox:not(:checked) + .toggle:before {
  content: "Show Inactive Bits";
}
.toggle {
  position: fixed;
  top: 16px;
  left: 16px;
  padding: 8px 16px;
  border-radius: 99999px;
  color: #fff;
  font-weight: bold;
  cursor: pointer;
}
.container {
  position: relative;
  transform-style: preserve-3d;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  will-change: transform;
}
.box {
  position: absolute;
  transform-style: preserve-3d;
}
.box:nth-child(0) .face {
  opacity: 0.75;
}
.box .face {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  transform-origin: center center;
  border: 2px solid currentColor;
  background: #d8dee9;
  color: #434c5e;
  -webkit-backface-visibility: hidden;
          backface-visibility: hidden;
  outline: 1px transparent;
  font-weight: bold;
  font-size: 1.25rem;
/* Front & Back */
/* Left & Right */
/* Top & Bottom */
}
.box .face.empty {
  opacity: 0;
}
.box .face.horizontal-line {
  background: #8fbcbb;
}
.box .face.vertical-line {
  background: #88c0d0;
}
.box .face.cube {
  background: #bf616a;
}
.box .face:nth-child(1) {
  transform: translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(2) {
  transform: translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
.box .face:nth-child(3) {
  transform: rotateY(-90deg) translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(4) {
  transform: rotateY(-90deg) translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
.box .face:nth-child(5) {
  transform: rotateX(-90deg) translateZ(calc(var(--scale) * 0.5px));
}
.box .face:nth-child(6) {
  transform: rotateX(-90deg) translateZ(calc(var(--scale) * -0.5px)) rotateY(180deg);
}
</style>



</head>

<body  >
  <input type="checkbox" id="checkbox"/>
<label class="toggle" for="checkbox"></label>
<div id="stage"></div>

  
      <script  >
"use strict";
const size = 8;
// Generate input with:
// Array.from({ length: 8 * 8 * 8 }, () => Math.random() > 0.5 ? 0 : 1).join("")
const input = "00100000100000100001000100010001100000010110110000010001001111100110000000000011001100000011000000011100101010000111000010000000011000000010101101000000000100001010010001010000100001010000010001001000110001100000001100100011000000001000000010100000010101001000010001000100110110110100110010100000000000000001000000001001010101100000010101000101000110100000000011000110101011100010110100000001010000101111001000000100010000010001010100000001100010011001001000100110010101001011000000001001011000010010001000110000";
class Shape {
    constructor(data, size) {
        this.data = data;
        this.size = size;
    }
    toPoints() {
        const output = [];
        for (let i = 0, x = 0, y = 0, z = 0; i < this.data.length; i++, x++) {
            if (i !== 0 && i % this.size === 0) {
                x = 0;
                y += 1;
            }
            if (y !== 0 && y % this.size === 0) {
                y = 0;
                z += 1;
            }
            output.push({ x, y, z, value: this.data[i] });
        }
        return output;
    }
    toPoints3d() {
        const output = [];
        const points = this.toPoints();
        for (const point of points) {
            if (output.length < point.y + 1) {
                output.push([]);
      .........完整代码请登录后点击上方下载按钮下载查看

网友评论0