Vue verwendet Canvas, um Kreise zufälliger Größe und ohne Überlappung zu erzeugen

Vue verwendet Canvas, um Kreise zufälliger Größe und ohne Überlappung zu erzeugen

Canvas-bezogene Dokumente

  • Canvas-API
  • CANVAS Quick Check Tabelle

Effektbildanzeige

Der erste ist der Effekt einer Kombination aus zufälligen Farben und zufälligen Größen.

Das zweite ist das zufällige Hintergrundbild mit zufälligem Größenstreuungseffekt (die Bilder, die ich hier verwendet habe, sind alle gleich, daher werden keine unterschiedlichen Bilder angezeigt).

Fall-Abschlusscode

  • Dieses Beispiel wird mit Vue umgesetzt. Die anderen Methoden sind Vue-ähnlich. Sie können den Effekt erzielen, indem Sie die entsprechende Syntax ändern.
  • Der Fall verwendet die Wertübertragung von Vue-Eltern-Kind-Komponenten

Code der übergeordneten Komponente

<Vorlage>
  <div id="Startseite">
      <div Klasse="Tags" ref="Tags">
        <circle-box :parentClientWidth="parentClientWidth" :parentClientHeight="parentClientHeight" :dataList="dataList"></circle-box>
      </div>
  </div>
</Vorlage>
<Skript>
CircleBox aus '@/components/content/circle/Circle.vue' importieren
Standard exportieren {
  Komponenten: { CircleBox },
  Daten() {
    zurückkehren {
      parentClientWidth: 0,
      übergeordneterClientHeight: 0,
      // Canvas-Simulationsdaten dataList: [
       {
          folgen: 1,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 2,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 3,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 4,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 5,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 6,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 7,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 8,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 9,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        },
        {
          folgen: 10,
          Bild: 'http://39.99.139.115/demo/RB5.png'
        }
      ],
    };
  },
  
  erstellt() {},
  
  montiert() {
    dies.getWidth();
  },
  
  Methoden: {
    // Breite und Höhe der übergeordneten Box ermitteln getWidth() {
      diese.parentClientWidth = diese.$refs.tags.clientWidth;
      this.parentClientHeight = this.$refs.tags.clientHeight;
      Konsole.log(diese.$refs.tags.clientWidth);
    }
  },
};
</Skript>

Unterkomponentencode

<Vorlage>
  <div>
    <canvas id="myCanvas" :width="Breite des übergeordneten Clients + 'px'" :height="Höhe des übergeordneten Clients + 'px'"></canvas>
  </div>
</Vorlage>
<Skript>
Standard exportieren {
  // Dateneigenschaften empfangen: ['parentClientWidth', 'parentClientHeight', 'dataList'],

  Daten() {
    zurückkehren {
      Datenliste kopieren: diese.Datenliste
    }
  },
  
  erstellt() {
    dies.$nextTick(() => {
      // Initialisiere this.circleInfo()
    })
  },
  
  montiert() {},
  
  Methoden: {
    KreisInfo() {
      lass das = dies
      Klasse Kreis {
        Konstruktor(x, y, r, Farbe) {
          dies.x = x
          dies.y = y
          dies.r = r
          dies.c = Farbe? Farbe: dies.getRandomColor()
        }

        // Zufällige Farbe getRandomColor() {
          sei r = Math.floor(Math.random() * 100) + 155
          sei g = Math.floor(Math.random() * 100) + 155
          sei b = Math.floor(Math.random() * 100) + 155
          gibt `rgb(${r},${g},${b})` zurück
        }
      }

      Klasse Zufallskreis {
        Konstruktor(Objekt) {
          dies.c = document.getElementById(obj.id)
          konsole.log(dieses.c)

          dies.ctx = dies.c.getContext('2d')
          dies.dWidth = dies.c.width
          diese.dHöhe = diese.c.Höhe
          dies.fix = obj.fix || wahr

          this.minMargin = obj.minMargin || 20
          this.minRadius = obj.minRadius || 30
          dies.radiuArr = obj.radiuArr || [30, 30, 30, 30, 30, 30, 30, 30, 30, 30]

          dies.gesamt = obj.gesamt || 10

          dieses.circleArray = []
          diese.Kreisnummer = 1
        }

        zeichneEinenKreis(c, index) {
          // konsole.log(c, index)
          lass ctx = dies.ctx

          ctx.beginPath()

          ctx.strokeStyle = cc
          ctx.fillStyle = cc
          // Zeichne einen Kreis ctx.arc(cx, cy, cr, 0, 2 * Math.PI)

          ctx.stroke()
          ctx.fill()

          // ctx.textAlign = "Mitte"
          // ctx.textBaseline = "Mitte"

          // ctx.fillStyle = "schwarz"
          // ctx.font = '1rem Microsoft YaHei'
          // ctx.fillText(that.dataListCopy[index].follow, cx, cy - 10) // Text innerhalb des Kreises let img = new Image()
          img.src = das.dataListCopy[index].image
          ctx.drawImage(Bild, cx - cr, cy - cr, cr * 2, cr * 2)

          diese.circleNumber++
        }

        prüfen(x, y, r) {
          zurück !(x + r > diese.dBreite || x - r < 0 || y + r > diese.dHöhe || y - r < 0)
        }

        // Den Radius eines neuen Kreises ermitteln, hauptsächlich um die Distanz zwischen dem Radius und dem nächsten Kreis zu ermitteln getR(x, y) {
          wenn (this.circleArray.length === 0) returniere Math.floor(Math.random() * 20 + 20)

          lass lenArr = dieses.circleArray.map((c) => {
            sei xSpan = cx - x
            sei ySpan = cy - y

            gibt Math.floor(Math.sqrt(Math.pow(xSpan, 2) + Math.pow(ySpan, 2))) zurück - cr
          })

          lass minCircleLen = Math.min(...lenArr)
          lass minC = dieses.circleArray[lenArr.indexOf(minCircleLen)]
          let tempR = this.fix ? this.radiuArr[this.circleArray.length] : minCircleLen - this.minMargin
          let bool = this.fix ? tempR <= minCircleLen - minC.r : tempR >= this.minRadius

          bool zurückgeben? tempR: false
        }

        //Erstellen Sie einen Kreis mit einem zufällig generierten Mittelpunkt.
        // Wenn der Radius nach 200 aufeinanderfolgenden Generierungen nicht passt, beende den Prozess createOneCircle() {
          sei x, y, r
          let createCircleTimes = 0

          während (wahr) {
            Erstellen Sie CircleTimes++
            x = Math.floor(Math.random() * this.dWidth)
            y = Math.floor(Math.random() * this.dHeight)

            sei TR = this.getR(x, y)
            wenn (!TR) {
              weitermachen
            } anders {
              r = TR
            }
            wenn (this.check(x, y, r) || createCircleTimes > 200) {
              brechen
            }
          }

          dies.check(x, y, r) und dies.circleArray.push(neuer Kreis(x, y, r))
        }

        // Wenn das Generieren neuer Kreise 100-mal fehlschlägt, beenden Sie das Schema.
        //Wenn keine der 100 generierten Lösungen passt, beenden Sie den Vorgang.
        init() {
          sei n = 0

          während (dieses.circleArray.length < dieses.total) {
            dieses.circleArray = []

            sei i = 0
            während (dieses.circleArray.length < dieses.total) {
              dies.createOneCircle()
              ich++
              wenn (i >= 100) {
                brechen
              }
            }

            n++

            wenn (n > 100) {
              brechen
            }
          }

          //Zeichnen Sie Kreise vom großen zum kleinen, entsprechend dem Radius.
          dieses.circleArray
            .sort((a, b) => br - ar)
            .forEach((c, index) => {
              dies.drawOneCircle(c, index)
            })
        }
      }
      // konsole.log(dieser.kreis);

      const p = neuer Zufallskreis({
        ID: "myCanvas",
        total: that.dataListCopy.length //Konfigurationsmenge})

      p.init()
      konsole.log(p)
      Konsole.log(p.circleArray)
    }
  }
}
</Skript>

Zusammenfassen

Dies ist das Ende dieses Artikels darüber, wie Vue Canvas verwendet, um zufällig große, nicht überlappende Kreise zu erzeugen. Weitere Informationen darüber, wie Vue Canvas verwendet, um zufällige Kreise zu erzeugen, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Vue verwendet Canvas, um den Bildkomprimierungs-Upload zu realisieren
  • So zeichnen Sie die Zeitleiste mit Vue+Canvas
  • VUE+Canvas realisiert den gesamten Prozess eines einfachen Gobang-Spiels
  • VUE+Canvas implementiert das Spiel God of Wealth und erhält Barren
  • So verwenden Sie VUE und Canvas, um ein Thunder Fighter-Tippspiel zu implementieren
  • VUE+Canvas implementiert den Beispielcode des Desktop-Flipper-Brick-Breaking-Spiels
  • Vue verwendet die Maus, um ein Rechteck auf Canvas zu zeichnen
  • Vue nutzt Canvas zur Implementierung mobiler handschriftlicher Signaturen
  • Vue+Canvas realisiert Puzzlespiel
  • Vue verwendet Canvas-Handschrifteingabe, um Chinesisch zu erkennen

<<:  Erkennen Sie den CSS-Ladeeffekt nach dem Klicken auf die Schaltfläche

>>:  So erstellen Sie eine Tabelle in MySQL und fügen Feldkommentare hinzu

Artikel empfehlen

VUE implementiert eine Timeline-Wiedergabekomponente

In diesem Artikelbeispiel wird der spezifische Co...

Wie InnoDB die Serialisierungsisolationsebene implementiert

Serialisierungsimplementierung InnoDB implementie...

Installieren Sie Memcached und die PHP Memcached-Erweiterung unter CentOS

In Bezug auf das leistungsstarke verteilte Speich...

Beispiele für korrekte Beurteilungsmethoden für Datentypen in JS

Inhaltsverzeichnis Vorwort Kann typeof den Typ ko...

Beispiel für die Verwendung von CASE WHEN beim Sortieren in MySQL

Vorwort In einem früheren Projekt wurde die Sorti...

Detaillierte Erklärung, wo Docker Protokolldateien speichert

Inhaltsverzeichnis Wo werden die Protokolle gespe...

Installieren und konfigurieren Sie MySQL 5.7 unter CentOS 7

Dieser Artikel testet die Umgebung: CentOS 7 64-B...

So erlauben Sie den Remotezugriff auf offene Ports in Linux

1. Ändern Sie die Firewall-Konfigurationsdatei # ...

Font Treasure House 50 exquisite kostenlose englische Schriftartenressourcen Teil 2

Designer verfügen über eine eigene Schriftartenbi...

Zusammenfassung häufig verwendeter MySQL-Befehle im Linux-Betriebssystem

Hier sind einige gängige MySQL-Befehle für Sie: -...

Docker-Speicherüberwachung und Stresstestmethoden

Der ausgeführte Docker-Container zeigt, dass der ...