import pygame class Sensor: def __init__(self, width, distance, space): self.width = width self.distance = distance self.space = space def generate(self, screenWidth, screenHeight, screen): 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) self.inner1 = self.sensor1_x self.outer1 = self.inner1 + self.width sensor1a = pygame.Rect(self.sensor1_x, self.sensor1_y, self.sensor1_x_size, self.sensor1_y_size) sensor1b = pygame.Rect(self.sensor1_x, self.sensor1_y + self.sensor1_y_size + self.distance, self.sensor1_x_size, self.sensor1_y_size) 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): 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 # 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 # 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 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