diff options
| -rw-r--r-- | camera.go | 14 | ||||
| -rw-r--r-- | main.go | 37 | ||||
| -rw-r--r-- | utils.go | 6 |
3 files changed, 41 insertions, 16 deletions
@@ -1,11 +1,25 @@ package main +import "math" + // Camera handle view position and screen type Camera struct { lowerLeftCorner Vec3D origin, horizontal, vertical Vec3D } +// NewCamera creates a new camera +func NewCamera(vfov float64, aspect float64) Camera { + origin := Vec3D{0.0, 0.0, 0.0} + theta := DegreesToRadians(vfov) + halfHeight := math.Tan(theta / 2.0) + halfWidth := aspect * halfHeight + lowerLeftCorner := Vec3D{-halfWidth, -halfHeight, -1.0} + horizontal := Vec3D{2.0 * halfWidth, 0.0, 0.0} + vertical := Vec3D{0.0, 2.0 * halfHeight, 0.0} + return Camera{lowerLeftCorner, origin, horizontal, vertical} +} + // GetRay computes Ray given screen params func (camera Camera) GetRay(u float64, v float64) Ray { return Ray{ @@ -2,6 +2,7 @@ package main import ( + "math" "math/rand" "github.com/schollz/progressbar" @@ -26,24 +27,28 @@ const ( func main() { // Scene - lowerLeftCorner := Vec3D{-2.0, -1.0, -1.0} - origin := Vec3D{0.0, 0.0, 0.0} - horizontal := Vec3D{4.0, 0.0, 0.0} - vertical := Vec3D{0.0, 2.0, 0.0} - camera := Camera{lowerLeftCorner, origin, horizontal, vertical} + camera := NewCamera(90.0, float64(Width)/float64(Height)) - matRed := Lambertian{Color{0.7, 0.3, 0.3}} - matGreen := Lambertian{Color{0.8, 0.8, 0.0}} - metalGrey := Metal{Color{0.8, 0.8, 0.8}, 0.3} + r := math.Cos(math.Pi / 4) + blue := Lambertian{Color{0.0, 0.0, 1.0}} + red := Lambertian{Color{1.0, 0.0, 0.0}} + World := HitableList{ + Sphere{Vec3D{-r, 0.0, -1.0}, r, blue}, + Sphere{Vec3D{r, 0.0, -1.0}, r, red}, + } + + // matRed := Lambertian{Color{0.7, 0.3, 0.3}} + // matGreen := Lambertian{Color{0.8, 0.8, 0.0}} + // metalGrey := Metal{Color{0.8, 0.8, 0.8}, 0.3} // metalBrown := Metal{Color{0.8, 0.6, 0.2}, 1.0} - glass := Dielectric{1.5} + // glass := Dielectric{1.5} - WORLD := HitableList{ - Sphere{Vec3D{0.0, 0.0, -1.0}, 0.5, glass}, - Sphere{Vec3D{-1.0, 0.0, -1.0}, 0.5, metalGrey}, - Sphere{Vec3D{1.0, 0.0, -1.0}, 0.5, matRed}, - Sphere{Vec3D{0.0, -100.5, -1.0}, 100.0, matGreen}, - } + // World := HitableList{ + // Sphere{Vec3D{0.0, 0.0, -1.0}, 0.5, glass}, + // Sphere{Vec3D{-1.0, 0.0, -1.0}, 0.5, metalGrey}, + // Sphere{Vec3D{1.0, 0.0, -1.0}, 0.5, matRed}, + // Sphere{Vec3D{0.0, -100.5, -1.0}, 100.0, matGreen}, + // } // Program // start := AddVec3D(Origin, Vec3D{-1.0, 0.0, 0.0}) @@ -61,7 +66,7 @@ func main() { u := (float64(y) + rand.Float64()) / float64(Width) v := (float64(x) + rand.Float64()) / float64(Height) ray := camera.GetRay(u, v) - colorList[it] = RayColor(ray, WORLD, 0) + colorList[it] = RayColor(ray, World, 0) } color := ColorMeanSquare(colorList) frame[Height-1-x][y] = color.ToPixel() @@ -1,5 +1,7 @@ package main +import "math" + // FMin return mins of floats func FMin(a float64, b float64) float64 { if a >= b { @@ -7,3 +9,7 @@ func FMin(a float64, b float64) float64 { } return b } + +func DegreesToRadians(degrees float64) float64 { + return degrees * 2.0 * math.Pi / 360.0 +} |
