[GO] Exemple pour dessiner une horloge simple en utilisant ebiten

Un programme qui ne dessine qu'une simple horloge

Un exemple qui dessine une horloge à l'aide d'un moteur de jeu appelé ebiten

時計のイメージ

L'horloge est simple.

Code source

main.go



package main

import (
	. "clock"
	"github.com/hajimehoshi/ebiten"
	"github.com/hajimehoshi/ebiten/inpututil"
	"log"
	"time"
)

type Game struct {
	time time.Time
	stop bool
}

func (g *Game) Update(screen *ebiten.Image) error {
	if inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
		g.stop = !g.stop
	}
	if !g.stop {
		g.time = time.Now()
	}
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	m := ClockImage(g.time)
	em, _ := ebiten.NewImageFromImage(m, ebiten.FilterDefault)
	screen.DrawImage(em, &ebiten.DrawImageOptions{})
}

func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
	return 320, 320
}

func main() {
	game := &Game{}

	ebiten.SetWindowSize(320, 320)
	ebiten.SetWindowTitle("Hello, World!")
	if err := ebiten.RunGame(game); err != nil {
		log.Fatal(err)
	}
}

Avec la signification d'un échantillon, vous pouvez arrêter l'horloge en appuyant sur la touche d'échappement.

Je ne réfléchis pas à comment l'utiliser.

Implémentation de ClockImage

Un programme qui génère l'image d'horloge essentielle

clock.go


package clock

import (
	"image"
	"github.com/fogleman/gg"
	"github.com/golang/freetype/truetype"
	"golang.org/x/image/font/gofont/gomedium"
	"time"
)

func ClockImage(t time.Time) image.Image {
	const (
		R       = 160
		Long    = 108 //Second
		Midium  = 85  // Minute
		Short   = 50  // Hour
		Width   = R*2 + 1
		Height  = R*2 + 1
		CenterX = Width / 2
		CenterY = Height / 2
		M       = 15 //Autres lignes de mémoire
		M5      = 26 //Ligne mémoire de 5 minutes
	)
	dc := gg.NewContext(Width, Height)

	dc.SetHexColor("#ffffff")
	dc.Clear()

    //Dessin de mémoire
	dc.Push()
	dc.SetHexColor("#000000")
	for i := 0; i < 60; i++ {
		dc.Push()
		var m float64 = M
		if i%5 == 0 {
			dc.SetLineWidth(2)
			m = M5
		}
		dc.MoveTo(CenterX, CenterY-R+m)
		dc.LineTo(CenterX, 0)
		dc.Stroke()
		dc.Pop()
		dc.RotateAbout(gg.Radians(float64(6)), CenterX, CenterY)
	}
	dc.Pop()

	dc.SetHexColor("#000")
        
    // AM /Dessin PM
	var AMPM = "AM"
	if t.Hour() >= 12 {
		AMPM = "PM"
	}
	f, _ := truetype.Parse(gomedium.TTF)
	face := truetype.NewFace(f, &truetype.Options{Size: 34})
	dc.SetFontFace(face)
	dc.DrawString(AMPM, CenterX+37, CenterY+7)

    //L'angle de l'aiguille courte à 0 heure=Puisque nous voulons le régler à 0 degré, faites-le pivoter de 90 degrés dans le sens inverse des aiguilles d'une montre à l'avance.
	dc.RotateAbout(gg.Radians(-90), CenterX, CenterY)

	dc.DrawCircle(CenterX, CenterY, R)
	dc.Stroke()

    //Dessin de la main courte
	dc.Push()
	dc.SetLineWidth(8)
	dc.MoveTo(CenterX, CenterY)
	HD := t.Hour()%12*30 + int(float64(t.Minute())*0.5) //t.Hour() range [0,23] 360/12 == 30
	if HD != 0 {
		dc.RotateAbout(gg.Radians(float64(HD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Short, CenterY)
	dc.Stroke()
	dc.Pop()

    //Dessin de la longue main
	dc.Push()
	dc.SetLineWidth(4)
	dc.MoveTo(CenterX, CenterY)
	MD := t.Minute() * 6 // t.Minute() range [0,59] 360/60 == 6
	if MD != 0 {
		dc.RotateAbout(gg.Radians(float64(MD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Midium, CenterY)
	dc.Stroke()
	dc.Pop()

    //Dessin de la seconde main
	dc.Push()
	dc.SetLineWidth(2)
	dc.MoveTo(CenterX, CenterY)
	SD := t.Second() * 6 // t.Second() range [0,59] 360/60 == 6
	if SD != 0 {
		dc.RotateAbout(gg.Radians(float64(SD)), CenterX, CenterY)
	}
	dc.LineTo(CenterX+Long, CenterY)
	dc.Stroke()
	dc.Pop()

	return dc.Image()
}

Passe le temps et renvoie une image d'horloge indiquant cette heure

en conclusion

Il n'y a presque pas d'explication, mais j'aimerais la mettre à jour si je peux penser à une explication plus compréhensible.

Personnellement, je pense que Go est un langage facile à écrire, mais la conversion de type a tendance à être redondante.

Y aura-t-il moins de bogues en éliminant la conversion de type implicite, ou y aura-t-il plus de code écrit ...

Recommended Posts

Exemple pour dessiner une horloge simple en utilisant ebiten
Comment dessiner un graphique avec Matplotlib
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
Un simple exemple de pivot_table.
Mesure du temps à l'aide d'une horloge
J'ai créé un éditeur de texte simple en utilisant PyQt
Essayez de dessiner une courbe de Bézier
Créer un tableau simple à l'aide de prettytable
Comment installer un package à l'aide d'un référentiel
Un simple script IDAPython pour nommer une fonction
Comment obtenir un exemple de rapport à partir d'une valeur de hachage à l'aide de l'API de Virus Total
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Comment coder un drone en utilisant la reconnaissance d'image
Comment dessiner un graphique à 2 axes avec pyplot
Comment dessiner un graphique 3D avant l'optimisation
Créer un ensemble de données en échantillonnant au hasard les données MNIST
Essayez de dessiner une courbe de vie avec python
AWS Step Functions pour apprendre avec un exemple
[Python] Comment dessiner un histogramme avec Matplotlib
Comment mettre en ligne sur un Drive partagé à l'aide de pydrive
Comment désinstaller un module installé à l'aide de setup.py
[PyTorch] Exemple ⑧ ~ Comment créer un modèle complexe ~
J'ai créé un jeu ○ ✕ avec TensorFlow
Comment écrire une interface graphique à l'aide de la commande maya
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Comment configurer un environnement Python à l'aide de pyenv
(Python) Essayez de développer une application Web en utilisant Django
J'ai essayé d'héberger un exemple de modèle de Pytorch en utilisant TorchServe
Comment organiser un séminaire pratique à l'aide de Jupyter à l'aide de Docker
Je veux échantillonner au hasard un fichier avec Python
Comment créer un package Python à l'aide de VS Code
[Procédure simple] Pour vous connecter à ssh sans mot de passe
Un échantillon pour essayer rapidement les machines de factorisation avec fastFM
Comment créer un simple script serveur / client TCP
J'ai décidé de faire une analyse de régression simple manuellement-1-
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Dérivés appris en utilisant Python - (2) Draw Yield Curve (JPYLibor Curve) -
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Comment dessiner facilement la structure d'un réseau de neurones sur Google Colaboratory à l'aide de "convnet-tiroir"