開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第5章(関数)、5.3(複数戻り値)、練習問題5.6の解答を求めてみる。
コード
package main
import (
"fmt"
"log"
"math"
"net/http"
"strconv"
)
const (
width, height = 600, 320
cells = 100
xyrange = 30.0
xyscale = width / 2 / xyrange
zscale = height * 0.4
angle = math.Pi / 6
)
var sin30, cos30 = math.Sin(angle), math.Cos(angle)
func main() {
handler := func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/svg+xml")
fmt.Println(r.URL)
if err := r.ParseForm(); err != nil {
log.Print(err)
} else {
var (
formWidth, formHeight int
formColor string
)
form, bln := r.Form["width"]
if bln {
t, err := strconv.Atoi(form[0])
if err != nil {
formWidth = width
} else {
formWidth = t
}
} else {
formWidth = width
}
form, bln = r.Form["height"]
if bln {
t, err := strconv.Atoi(form[0])
if err != nil {
formHeight = height
} else {
formHeight = t
}
} else {
formHeight = height
}
form, bln = r.Form["color"]
if bln {
formColor = form[0]
} else {
formColor = "green"
}
fmt.Println(formWidth, formHeight, formColor)
fmt.Fprintf(w, "<svg xmlns='http://www.w3.org/2000/svg' "+
"style='stroke: grey; fill: %s; stroke-wdith: 0.7' "+
"width='%d' height='%d'>\n", formColor, formWidth, formHeight)
for i := 0; i < cells; i++ {
for j := 0; j < cells; j++ {
ax, ay, aOk := corner(i+1, j)
bx, by, bOk := corner(i, j)
cx, cy, cOk := corner(i, j+1)
dx, dy, dOk := corner(i+1, j+1)
if aOk && bOk && cOk && dOk {
fmt.Fprintf(w,
"<polygon points='%g,%g,%g,%g,%g,%g,%g,%g' />\n",
ax, ay, bx, by, cx, cy, dx, dy)
}
}
}
fmt.Fprintf(w, "</svg>\n")
}
}
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
func corner(i, j int) (sx float64, sy float64, finite bool) {
x := xyrange * (float64(i)/cells - 0.5)
y := xyrange * (float64(j)/cells - 0.5)
z, ok := f(x, y)
if !ok {
fmt.Printf("z=%g\n", z)
sx = 0
sy = 0
finite = false
return
}
sx = width/2 + (x-y)*cos30*xyscale
sy = height/2 + (x+y)*sin30*xyscale - z*zscale
if !isFinite(sx) || !isFinite(sy) {
fmt.Printf("sx=%g, sy=%g\n", sx, sy)
finite = false
sx = 0
sy = 0
finite = false
}
return
}
func f(x, y float64) (value float64, finite bool) {
r := math.Hypot(x, y)
value = math.Sin(r) / r
finite = isFinite(value)
if !finite {
fmt.Printf("value=%g\n", value)
}
return
}
func isFinite(f float64) (finite bool) {
finite = math.Abs(f) < math.Inf(1)
return
}
入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal)
$ go run sample6.go / 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN / 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN / 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN /?color=red&width=500&height=250 500 250 red value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN /favicon.ico 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN / 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN /?width=320&height=600 320 600 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN /favicon.ico 600 320 green value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN value=NaN z=NaN signal: terminated $
0 コメント:
コメントを投稿