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

So erstellen Sie manuell ein neues Image mit Docker

In diesem Artikel wird die Methode zum manuellen ...

Detaillierter Prozess zur Konfiguration von NIS in Centos7

Inhaltsverzeichnis Prinzip Vorbereitung der Netzw...

Erfahren Sie mehr über die am häufigsten verwendeten JavaScript-Ereignisse

Inhaltsverzeichnis JavaScript-Ereignisse: Häufig ...

Layout im Vue.js-Stil Allgemeine Fähigkeiten zur Flutter-Geschäftsentwicklung

Korrespondenz zwischen Flutter und CSS im Shadow-...

Funktionsüberladung in TypeScript

Inhaltsverzeichnis 1. Funktionssignatur 2. Funkti...

JS implementiert Layoutkonvertierung in Animation

Beim Schreiben von Animationen mit JS wird häufig...

Detaillierte Erklärung des JavaScript-Timer-Prinzips

Inhaltsverzeichnis 1. setTimeout()-Timer 2. Stopp...

JavaScript zum Erzielen eines Klickbild-Flip-Effekts

Ich habe kürzlich an einem Projekt zur Gesichtser...

Klassischer Beispielcode für JavaScript-Funktionsaufrufe

Inhaltsverzeichnis Klassisches Beispiel für einen...