From 1fc270deb4c9de100b2aefabe6fb54d711cb6c49 Mon Sep 17 00:00:00 2001 From: Haldrup-tech Date: Thu, 26 Sep 2024 21:23:03 -0400 Subject: [PATCH] Added proper volume calc and size slider --- __pycache__/particle.cpython-312.pyc | Bin 1156 -> 1419 bytes __pycache__/sensor.cpython-312.pyc | Bin 0 -> 7706 bytes __pycache__/slider.cpython-312.pyc | Bin 0 -> 2779 bytes main.py | 30 ++++++---- particle.py | 4 ++ sensor.py | 84 ++++++++++++++++++++++++--- slider.py | 35 +++++++++++ 7 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 __pycache__/sensor.cpython-312.pyc create mode 100644 __pycache__/slider.cpython-312.pyc create mode 100644 slider.py diff --git a/__pycache__/particle.cpython-312.pyc b/__pycache__/particle.cpython-312.pyc index 25b743f5b2021b96ec0811b11ada049bfa90632a..077ed3f62a7f8b3c4d67fd23a534f5a49d567164 100644 GIT binary patch delta 528 zcmYL^&r1SP5Xaw-RaZ^3RYW3c1H{ zbx1kb4CI5|+k4uRi*zd*0-MkgVR=fwmhhhEA_m7$^PIXp)Gf#LDrZ&O&hC1`|2)Ml!39t6MJkG@?$ Zw;DBjM=ZbtB}ATTiP#J+j0iv({{Rf2Vx0g0 delta 303 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 1624859..3c20a5d 100644 --- a/main.py +++ b/main.py @@ -3,19 +3,23 @@ import numpy as np import matplotlib.pyplot as plt from particle import Particle from sensor import Sensor +from slider import Slider pygame.init() SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 +SENSOR_DISTANCE = 200 + +y_lim = 40000 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) -sensor = Sensor(width = 50, distance = 200, space = 200) +sensor = Sensor(width = 50, distance = SENSOR_DISTANCE, space = 300) -silica = Particle(speed = 1, size = 20, perm = 4) +silica = Particle(speed = 1, size = 60, perm = 4) time = .1 time_data = [] @@ -26,13 +30,13 @@ volume_data = [] plt.ion() fig, ax = plt.subplots() line, = ax.plot([], [], 'r-') -ax.set_xlim(0, 400) -ax.set_ylim(0, 40000) +ax.set_xlim(0, 800) +ax.set_ylim(-1000, y_lim) ax.set_xlabel('Time (s)') ax.set_ylabel('Volume') ax.set_title('Volume/time') - +slider1 = Slider(20, 20, 100, 20, 20, SENSOR_DISTANCE / 2, 80) run = True while run: @@ -49,12 +53,22 @@ while run: sensor.generate(SCREEN_WIDTH, SCREEN_HEIGHT, screen) pygame.draw.circle(screen, (255, 255, 255), (distance - silica.size, 300), silica.size) + pygame.draw.circle(screen, (0,255,0), (distance - silica.size, 300), 10) + + slider1.draw(screen) + + silica.updateSize(slider1.value) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False + slider1.handle_event(event) - volume = sensor.testSensor1(distance, silica) + volume = sensor.getParticleVolume(distance, silica) + + if (volume > y_lim): + y_lim = volume + (volume * 1.2) + ax.set_ylim(-1000, y_lim) time_data.append(time) volume_data.append(volume) @@ -69,10 +83,6 @@ while run: pygame.display.update() time = time + 1 - - print(volume) - - pygame.quit() diff --git a/particle.py b/particle.py index 7162884..6977c62 100644 --- a/particle.py +++ b/particle.py @@ -15,4 +15,8 @@ class Particle: partialVol = (1/3) * math.pi * height * height * ((3 * self.size) - height) return partialVol + def updateSize(self, size): + self.size = size + self.volume = (4/3) * math.pi * size * size * size + diff --git a/sensor.py b/sensor.py index 61ce981..d30499a 100644 --- a/sensor.py +++ b/sensor.py @@ -7,7 +7,7 @@ class Sensor: self.space = space def generate(self, screenWidth, screenHeight, screen): - self.sensor1_x = (screenWidth / 2) - (self.space / 2) + self.sensor1_x = (screenWidth / 2) - (self.space / 2) - self.width self.sensor1_y = 0 self.sensor1_x_size = self.width self.sensor1_y_size = (screenHeight / 2) - (self.distance / 2) @@ -20,15 +20,85 @@ class Sensor: pygame.draw.rect(screen, (0, 0, 255), sensor1a) pygame.draw.rect(screen, (0, 0, 255), sensor1b) + self.sensor2_x = (screenWidth / 2) + (self.space / 2) + self.sensor2_y = 0 + self.sensor2_x_size = self.width + self.sensor2_y_size = (screenHeight / 2) - (self.distance / 2) + + self.inner2 = self.sensor2_x + self.outer2 = self.inner2 + self.width + + sensor2a = pygame.Rect(self.sensor2_x, self.sensor2_y, self.sensor2_x_size, self.sensor2_y_size) + sensor2b = pygame.Rect(self.sensor2_x, self.sensor2_y + self.sensor2_y_size + self.distance, self.sensor2_x_size, self.sensor2_y_size) + pygame.draw.rect(screen, (0, 0, 255), sensor2a) + pygame.draw.rect(screen, (0, 0, 255), sensor2b) + def testSensor1(self, partCenter, particle): - if particle.size >= abs(self.inner1 - (partCenter - particle.size)): - volume = particle.partialVol(particle.size - (self.inner1 - (partCenter - particle.size))) + + particle_x = partCenter - particle.size + particle_right = particle_x + particle.size + particle_left = particle_x - particle.size + # Sensor lines on one half of sphere center + if particle_right > self.outer1 and particle_x < self.inner1: + volume = particle.partialVol(self.width + (particle_right - self.outer1)) - particle.partialVol(particle_right - self.outer1) + print("On right half") + print(volume) return volume - elif particle.size >= abs(self.outer1 - (partCenter - particle.size)): - volume = particle.volume - particle.partialVol(particle.size - (self.outer1 - (partCenter - particle.size))) + # if Sensor is on left half of sphere center + elif particle_left < self.inner1 and particle_x > self.outer1: + volume = particle.partialVol(self.width + (self.inner1 - particle_left)) - particle.partialVol(self.inner1 - particle_left) + print("On left half") + print(volume) return volume - elif ((partCenter - particle.size) >= self.inner1 and (partCenter - particle.size) <= self.outer1): + # On bolth halves + elif (particle_x >= self.inner1 and particle_x <= self.outer1) and particle_left < self.inner1 and particle_right > self.outer1: + volume_left = particle.partialVol(self.inner1 - particle_left) + volume_right = particle.partialVol(particle_right - self.outer1) + volume = particle.volume - (volume_left + volume_right) + print("On both halves") + print(volume_left) + print(volume_right) + return volume + elif (particle_right > self.inner1 and particle_right < self.outer1) and particle_x <= self.inner1: + volume = particle.partialVol(particle_right - self.inner1) + print("Approaching from left") + print(volume) + return volume + elif (particle_left > self.inner1 and particle_left < self.outer1) and particle_x >= self.outer1: + volume = particle.partialVol(self.outer1 - particle_left) + print("Leaving from left") + print(volume) + return volume + elif (particle_right > self.inner1 and particle_right <= self.outer1) and (particle_left >= self.inner1 and particle_left < self.outer1): + print("in between") + print(particle.volume) + return particle.volume + else: + return 0 + + def testSensor2(self, partCenter, particle): + if (particle.size >= abs(self.inner2 - (partCenter - particle.size))) and (particle.size >= abs(self.outer2 - (partCenter - particle.size))): + volume = ((particle.volume / 2) - (particle.partialVol(particle.size - ((partCenter - particle.size) - self.inner2)))) + ((particle.volume / 2) - particle.partialVol(particle.size - (self.outer2 - (partCenter - particle.size)))) + return volume + elif particle.size >= abs(self.inner2 - (partCenter - particle.size)): + volume = particle.partialVol(particle.size - (self.inner2 - (partCenter - particle.size))) + return volume + elif particle.size >= abs(self.outer2 - (partCenter - particle.size)): + volume = particle.volume - particle.partialVol(particle.size - (self.outer2 - (partCenter - particle.size))) + return volume + elif ((partCenter - particle.size) >= self.inner2 and (partCenter - particle.size) <= self.outer2): volume = particle.volume return volume else: - return 0 \ No newline at end of file + return 0 + + def getParticleVolume(self, partCenter, particle): + volume1 = self.testSensor1(partCenter, particle) + volume2 = self.testSensor2(partCenter, particle) + + if volume1: + return volume1 + elif volume2: + return volume2 + else: + return 0 diff --git a/slider.py b/slider.py new file mode 100644 index 0000000..304e27d --- /dev/null +++ b/slider.py @@ -0,0 +1,35 @@ +import pygame + +WHITE = (255, 255, 255) +GRAY = (200, 200, 200) +BLACK = (0, 0, 0) +RED = (255, 0, 0) + +class Slider: + + def __init__(self, x, y, w, h, min_val, max_val, initial_val): + self.rect = pygame.Rect(x, y, w, h) + self.min_val = min_val + self.max_val = max_val + self.value = initial_val + self.grabbed = False + + def draw(self, screen): + # Draw the background + pygame.draw.rect(screen, GRAY, self.rect) + # Draw the handle (circle) + handle_x = self.rect.x + (self.value - self.min_val) / (self.max_val - self.min_val) * self.rect.width + pygame.draw.circle(screen, RED, (int(handle_x), self.rect.centery), self.rect.height // 2) + + def handle_event(self, event): + if event.type == pygame.MOUSEBUTTONDOWN: + if self.rect.collidepoint(event.pos): + self.grabbed = True + elif event.type == pygame.MOUSEBUTTONUP: + self.grabbed = False + elif event.type == pygame.MOUSEMOTION: + if self.grabbed: + mouse_x = event.pos[0] + # Constrain the handle within the slider + new_value = (mouse_x - self.rect.x) / self.rect.width * (self.max_val - self.min_val) + self.min_val + self.value = max(self.min_val, min(self.max_val, new_value))