From b99433e992713e86aa0996121ba4798a618cedf7 Mon Sep 17 00:00:00 2001
From: OusmBlueNinja <89956790+OusmBlueNinja@users.noreply.github.com>
Date: Mon, 14 Apr 2025 08:48:38 -0500
Subject: [PATCH] Ray Marching

---
 car-detection/main.py      | 58 ++++++++++++++++++++++
 circle-trace-thing/main.py | 98 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 156 insertions(+)
 create mode 100644 car-detection/main.py
 create mode 100644 circle-trace-thing/main.py

diff --git a/car-detection/main.py b/car-detection/main.py
new file mode 100644
index 0000000..401ba4a
--- /dev/null
+++ b/car-detection/main.py
@@ -0,0 +1,58 @@
+import cv2
+import os
+from ultralytics import YOLO
+from datetime import datetime
+
+# Load a YOLOv8 pretrained model (use 'yolov8n.pt' or 'yolov8s.pt' for speed)
+model = YOLO('yolov8n.pt')
+
+# Create directory to save car images
+save_dir = 'captured_cars'
+os.makedirs(save_dir, exist_ok=True)
+
+# Open webcam (0 = default camera)
+cap = cv2.VideoCapture(0)
+
+if not cap.isOpened():
+    print("Failed to open webcam.")
+    exit()
+
+print("Press Q to quit.")
+
+while True:
+    ret, frame = cap.read()
+    if not ret:
+        break
+
+    # Run YOLO inference
+    results = model(frame)
+
+    for result in results:
+        for box in result.boxes:
+            cls_id = int(box.cls[0])
+            conf = float(box.conf[0])
+
+            # Class 2 = car in COCO dataset
+            if cls_id == 2 and conf > 0.5:
+                x1, y1, x2, y2 = map(int, box.xyxy[0])
+                car_crop = frame[y1:y2, x1:x2]
+
+                # Save image
+                timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f')
+                filename = os.path.join(save_dir, f'car_{timestamp}.jpg')
+                cv2.imwrite(filename, car_crop)
+                print(f"Saved: {filename}")
+
+                # Draw bounding box
+                cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
+                cv2.putText(frame, f"Car {conf:.2f}", (x1, y1 - 10),
+                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
+
+    # Show the frame
+    cv2.imshow("Car Detection", frame)
+
+    if cv2.waitKey(1) & 0xFF == ord('q'):
+        break
+
+cap.release()
+cv2.destroyAllWindows()
diff --git a/circle-trace-thing/main.py b/circle-trace-thing/main.py
new file mode 100644
index 0000000..2b809c5
--- /dev/null
+++ b/circle-trace-thing/main.py
@@ -0,0 +1,98 @@
+import pygame
+import math
+import sys
+
+pygame.init()
+WIDTH, HEIGHT = 800, 600
+screen = pygame.display.set_mode((WIDTH, HEIGHT))
+pygame.display.set_caption("Ray Marching - Single Ray with Steps")
+clock = pygame.time.Clock()
+
+# Colors
+BLACK = (0, 0, 0)
+WHITE = (255, 255, 255)
+GRAY = (180, 180, 180)
+RED = (255, 0, 0)
+GREEN = (0, 255, 0)
+BLUE = (0, 0, 255)
+
+# SDF primitives
+def sdf_circle(p, center, radius):
+    return math.hypot(p[0] - center[0], p[1] - center[1]) - radius
+
+def sdf_box(p, center, size):
+    dx = abs(p[0] - center[0]) - size[0] / 2
+    dy = abs(p[1] - center[1]) - size[1] / 2
+    dx = max(dx, 0)
+    dy = max(dy, 0)
+    return math.hypot(dx, dy)
+
+objects = [
+    {"sdf": lambda p: sdf_circle(p, (400, 300), 60), "color": GREEN},
+    {"sdf": lambda p: sdf_box(p, (200, 150), (100, 100)), "color": BLUE},
+    {"sdf": lambda p: sdf_box(p, (600, 400), (80, 150)), "color": RED},
+]
+
+def scene_sdf(p):
+    return min(obj["sdf"](p) for obj in objects)
+
+def ray_march(origin, direction, max_steps=100, max_dist=1000, epsilon=1.0):
+    p = list(origin)
+    total_dist = 0
+    steps = []
+    for _ in range(max_steps):
+        dist = scene_sdf(p)
+        steps.append((tuple(p), dist))
+        if dist < epsilon or total_dist > max_dist:
+            break
+        p[0] += direction[0] * dist
+        p[1] += direction[1] * dist
+        total_dist += dist
+    return steps
+
+# Main loop
+running = True
+while running:
+    screen.fill(BLACK)
+    mouse_pos = pygame.mouse.get_pos()
+    origin = (600, 200)
+    dx = mouse_pos[0] - origin[0]
+    dy = mouse_pos[1] - origin[1]
+    length = math.hypot(dx, dy)
+    if length == 0:
+        direction = (0, 0)
+    else:
+        direction = (dx / length, dy / length)
+
+    # Draw scene objects
+    for obj in objects:
+        if obj["color"] == GREEN:
+            pygame.draw.circle(screen, obj["color"], (400, 300), 60, 2)
+        elif obj["color"] == BLUE:
+            pygame.draw.rect(screen, obj["color"], pygame.Rect(150, 100, 100, 100), 2)
+        elif obj["color"] == RED:
+            pygame.draw.rect(screen, obj["color"], pygame.Rect(560, 325, 80, 150), 2)
+
+    # Perform ray march
+    steps = ray_march(origin, direction)
+
+    # Draw ray steps
+    for point, dist in steps:
+        pygame.draw.circle(screen, GRAY, (int(point[0]), int(point[1])), int(dist), 1)
+
+    # Draw final point
+    if steps:
+        pygame.draw.circle(screen, WHITE, (int(steps[-1][0][0]), int(steps[-1][0][1])), 3)
+
+    pygame.draw.line(screen, WHITE, origin, mouse_pos, 1)
+    pygame.draw.circle(screen, WHITE, origin, 4)
+
+    for event in pygame.event.get():
+        if event.type == pygame.QUIT:
+            running = False
+
+    pygame.display.flip()
+    clock.tick(60)
+
+pygame.quit()
+sys.exit()