about summary refs log tree commit diff
path: root/main.go
blob: 7affe0da929a198c2eb7c6430542b3662acd9d7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main

import (
	"encoding/json"
	"fmt"
	"github.com/gorilla/mux"
	"io/ioutil"
	"log"
	"math/rand"
	"net/http"
	"os"
	"strconv"
	"time"
)

type point struct {
	x, y, z float64
}

// make a request to the nfw api and return the result
func netNFW(x float64, y float64, z float64) float64 {

	var nfwurl = os.Getenv("nfwurl")

	// build the request string
	var randMinRequestURL string = fmt.Sprintf("http://%s/NFW?x=%f&y=%f&z=%f", nfwurl, x, y, z)

	// make the request
	resp, err := http.Get(randMinRequestURL)
	if err != nil {
		panic(err)
	}

	// close the request body when finished
	defer resp.Body.Close()

	// read the body
	body, bodyerr := ioutil.ReadAll(resp.Body)
	if bodyerr != nil {
		panic(bodyerr)
	}

	var dat map[string]interface{}

	jsonerr := json.Unmarshal(body, &dat)
	if jsonerr != nil {
		panic(jsonerr)
	}

	result := dat["NFW"].(float64)

	return result
}

func gen(galaxyRange float64) point {

	// Define variables
	var length float64 = galaxyRange

	// define the range of the galaxy
	var rangeMin float64 = -length
	var rangeMax float64 = length

	var randMin float64 = netNFW(0, 0, 0)
	fmt.Printf("randmin: %30.20f", randMin)
	var randMax float64 = netNFW(length, length, length)
	fmt.Printf("randmax: %30.20f", randMax)

	var starFound bool = false

	for starFound == false {

		randomSource := rand.New(rand.NewSource(time.Now().UnixNano()))

		// generate random coordinates
		var x float64 = ((rangeMax - rangeMin) * randomSource.Float64()) + rangeMin
		var y float64 = ((rangeMax - rangeMin) * randomSource.Float64()) + rangeMin
		var z float64 = ((rangeMax - rangeMin) * randomSource.Float64()) + rangeMin

		var randomValue = randomSource.Float64()
		var randVal = ((randMax - randMin) * randomValue) + randMin

		if randVal < netNFW(x, y, z) {
			var newStar point = point{x, y, z}

			starFound = true
			return newStar
		}
	}
	return point{0, 0, 0}
}

func generate(w http.ResponseWriter, r *http.Request) {
	params := r.URL.Query()

	amount, _ := strconv.ParseInt(params.Get("num"), 10, 64)
	galaxyRange, _ := strconv.ParseFloat(params.Get("range"), 64)

	// generate the given amount of stars
	for i := 0; i < int(amount); i++ {
		result := gen(galaxyRange)
		log.Printf("galaxy range: %f", galaxyRange)
		log.Printf("%v\n", result)
		_, err := fmt.Fprintf(w, "%f, %f, %f\n", result.x, result.y, result.z)
		if err != nil {
			panic(err)
		}
	}
}

func main() {
	router := mux.NewRouter()
	router.HandleFunc("/gen", generate).Methods("GET")
	log.Fatal(http.ListenAndServe(":8123", router))
}