about summary refs log tree commit diff
path: root/star.go
diff options
context:
space:
mode:
Diffstat (limited to 'star.go')
-rw-r--r--star.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/star.go b/star.go
new file mode 100644
index 0000000..d2bb124
--- /dev/null
+++ b/star.go
@@ -0,0 +1,86 @@
+package structs
+
+// Define a struct storing essential star information such as it's coordinate, velocity and mass
+type Star2D struct {
+	C Vec2    // coordinates of the star
+	V Vec2    // velocity    of the star
+	M float64 // mass        of the star
+}
+
+// InsideOf is a method that tests if the star it is applied on is in or outside of the given
+// BoundingBox. It returns true if the star is inside of the BoundingBox and false if it isn't.
+func (s Star2D) InsideOf(boundary BoundingBox) bool {
+
+	// Test if the star is inside or outside of the bounding box.
+	// Abort testing if one of the conditions is not met
+	if s.C.X < boundary.center.X+boundary.width/2 {
+		if s.C.X > boundary.center.X-boundary.width/2 {
+			if s.C.Y < boundary.center.Y+boundary.width/2 {
+				if s.C.Y > boundary.center.Y-boundary.width/2 {
+					return true
+				} else {
+					return false
+				}
+			} else {
+				return false
+			}
+		} else {
+			return false
+		}
+	} else {
+		return false
+	}
+}
+
+// Quadrant returns a string indicating in which quadrant of the given quadtree the point the method
+// is applied on is.
+// This methods presumes that the point is inside of the boundingBox
+func (s Star2D) Quadrant(starsQuadtree *Quadtree) string {
+	centerX := starsQuadtree.boundary.center.X
+	centerY := starsQuadtree.boundary.center.Y
+
+	// test if the point is left the the center or not
+	if s.C.X < centerX {
+
+		// Test if the point is above or below of the center
+		if s.C.Y > centerY {
+			return "northwest"
+		} else {
+			return "southwest"
+		}
+
+		// The point is right of the center
+	} else {
+
+		// Test if the point is above or below of the center
+		if s.C.Y > centerY {
+			return "northeast"
+		} else {
+			return "southeast"
+		}
+	}
+}
+
+// Return a copy of the star by returning a star struct with the same values.
+func (s *Star2D) Copy() Star2D {
+	return Star2D{s.C.Copy(), s.V.Copy(), s.M}
+}
+
+// Accelerate the star with the acceleration a for the time t.
+// This changes the velocity of the star.
+func (s *Star2D) AccelerateVelocity(a Vec2, t float64) {
+	s.V = s.V.Add(a.Multiply(t))
+}
+
+// Move the star with it's velocity for the time t.
+// This changes the Position of the star.
+func (s *Star2D) Move(t float64) {
+	s.C = s.C.Add(s.V.Multiply(t))
+}
+
+// Accelerate and move the star with it's velocity and the acceleration a for the time t
+// This changes the position and the velocity of the star.
+func (s *Star2D) Accelerate(a Vec2, t float64) {
+	s.AccelerateVelocity(a, t)
+	s.Move(t)
+}