golang 去言语でレーダーチャートを书く(途中)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 去言语でレーダーチャートを书く(途中)相关的知识,希望对你有一定的参考价值。

package main

import (
	"fmt"
	"image"
	"image/color"
	"image/png"
	"log"
	"math"
	"os"
	"testing"

	"golang.org/x/image/font"
	"golang.org/x/image/font/basicfont"
	"golang.org/x/image/math/fixed"
)

const (
	x      = 0
	y      = 0
	width  = 255
	height = 255
)

var (
	whiteCol = color.RGBA{255, 255, 255, 255}
	blackCol = color.RGBA{80, 80, 80, 255}
	redCol   = color.RGBA{255, 0, 0, 100}
	r        = float64(width) * 0.8 * 0.5
	center   = image.Point{width / 2, width / 2}
)

func createWhiteImage() *image.RGBA {
	// 画像の生成
	img := image.NewRGBA(image.Rect(x, y, width, height))
	// 背景色の描画
	rect := img.Rect
	for h := rect.Min.Y; h < rect.Max.Y; h++ {
		for w := rect.Min.X; w < rect.Max.X; w++ {
			img.Set(w, h, whiteCol)
		}
	}
	return img
}

func addLabel(img *image.RGBA, x, y int, label string) {
	point := fixed.Point26_6{fixed.Int26_6(x * 64), fixed.Int26_6(y * 64)}
	d := &font.Drawer{
		Dst:  img,
		Src:  image.NewUniform(blackCol),
		Face: basicfont.Face7x13,
		Dot:  point,
	}
	d.DrawString(label)
}

type data struct {
	label string
	value float64
}

func TestDrawChart(t *testing.T) {
	datas := []data{
		data{label: "ATK", value: 100.0},
		data{label: "DEF", value: 60.0},
		data{label: "MAT", value: 5.0},
	}
	rcnt := float64(len(datas))

	img := createWhiteImage()

	// 背景色の塗りつぶし
	cx := float64(center.X)
	cy := float64(center.Y)

	// メモリ線の描画
	rad := 2 * math.Pi / rcnt
	drad := 2*math.Pi - rad - 2*math.Pi/4
	for j, v := range datas {
		y1, x1 := math.Sincos(rad*float64(j) + drad)
		for i := 0.0; i < r; i += 0.1 {
			x2 := int(float64(center.X) + x1*i)
			y2 := int(float64(center.Y) + y1*i)
			img.Set(x2, y2, blackCol)
		}
		// ラベル描画
		x2 := int(float64(center.X) + x1*r)
		y2 := int(float64(center.Y) + y1*r)
		addLabel(img, int(x2), int(y2), fmt.Sprintf("%s", v.label))
	}

	// 円の枠線描画
	div := 5
	m := int(r) / div
	for rr := 0; rr < int(math.Ceil(r)); rr++ {
		if rr%m == 0 {
			rrf := float64(rr)
			for rad := 0.0; rad < float64(width)*rrf; rad += 0.1 {
				var x int = int(cx + math.Cos(rad)*rrf)
				var y int = int(cy + math.Sin(rad)*rrf)
				img.Set(x, y, blackCol)
			}
		}
	}

	// 画像ファイルの生成
	w, err := os.Create(fmt.Sprintf("img/chart%d.png", int(rcnt)))
	if err != nil {
		log.Fatal(err)
	}
	defer w.Close()

	// 画像データの書き込み
	if err := png.Encode(w, img); err != nil {
		log.Fatal(err)
	}
}

func TestDrawText(t *testing.T) {
	img := createWhiteImage()
	addLabel(img, 20, 30, "Hello Go")

	f, err := os.Create("img/text.png")
	if err != nil {
		panic(err)
	}
	defer f.Close()
	if err := png.Encode(f, img); err != nil {
		panic(err)
	}
}

func TestFillBackground(t *testing.T) {
	img := createWhiteImage()

	// 背景色の塗りつぶし
	for rr := 0.0; rr < r; rr += 0.1 {
		for rad := 0.0; rad < width*rr; rad++ {
			x := int(float64(center.X) + math.Cos(rad)*rr)
			y := int(float64(center.Y) + math.Sin(rad)*rr)
			img.Set(x, y, redCol)
		}
	}

	f, err := os.Create("img/fill_background.png")
	if err != nil {
		panic(err)
	}
	defer f.Close()
	if err := png.Encode(f, img); err != nil {
		panic(err)
	}
}

css 外侧余白の右ボーダー

            <dl class="dl_border_style flex_box flex_wrap flex_start">
                <dt>会社名</dt>
                <dd>長崎名水株式会社</dd>
                <dt>住所</dt>
                <dd>〒859-0144 長崎県諫早市高来町溝口214</dd>
                <dt>連絡先</dt>
                <dd>TEL 0957-32-2539 / FAX 0957-32-2994</dd>
            </dl>
.dl_border_style {
    width: 530px;
}

.dl_border_style dt {
    width: 120px;
    position: relative;
    box-sizing: border-box;
    border-bottom: 1px solid #cdcdcd;
    padding: 15px;
}

.dl_border_style dt:before {
    content: '';
    position: absolute;
    right: 0;
    display: inline-block;
    width: 1px;
    height: 35px;
    background-color: #cdcdcd;
}

.dl_border_style dd {
    width: 410px;
    box-sizing: border-box;
    border-bottom: 1px solid #cdcdcd;
    padding: 15px 20px 15px 30px;
}

.dl_border_style dt:nth-of-type(01),
.dl_border_style dd:nth-of-type(01) {
    border-top: 1px solid #cdcdcd;
}

以上是关于golang 去言语でレーダーチャートを书く(途中)的主要内容,如果未能解决你的问题,请参考以下文章

golang Go言语で简単にHTTPリクエストを送ってJSONをパースするサンプル参考:http://qiita.com/ikuwow/items/c8f494bbd16adf6db142

text シーダー実行

javascript 3点リーダー

css 外侧余白の右ボーダー

scss 全画面にボーダーをひく

c_cpp ランバートシェーダ(シェーダだけで完结)