import pyxel
import random

class MonteCarloPiRectangularScreen:
    def __init__(self):

        self.width = 512
        self.height = 256
        pyxel.init(self.width, self.height, title="Monte Carlo Pi (512x256)")
        
        # Rayon du cercle 
        self.radius = self.height // 2
        
        # Centre
        self.center_x = self.width // 2
        self.center_y = self.height // 2

        # Variables
        self.points_inside_circle_count = 0
        self.total_points_count = 0
        self.points_to_draw = []
        
        pyxel.run(self.update, self.draw)

    def update(self):
        # Générer 10 points par frame
        for _ in range(100):
            if self.total_points_count < 200000:
                # Générer un point aléatoire dans un carré virtuel de 256x256
                x_square = random.uniform(0, self.height)
                y_square = random.uniform(0, self.height)

                # Vérifier si le point est à l'intérieur du cercle.
                dx = x_square - self.radius
                dy = y_square - self.radius
                
                is_inside = False
                if dx**2 + dy**2 <= self.radius**2:
                    self.points_inside_circle_count += 1
                    is_inside = True
                
                self.total_points_count += 1

                x_rect = self.center_x - self.radius + x_square
                y_rect = self.center_y - self.radius + y_square
                
                self.points_to_draw.append((x_rect, y_rect, is_inside))

        # Calculer l'approximation de Pi
        if self.total_points_count > 0:
            self.pi_approx = 4 * (self.points_inside_circle_count / self.total_points_count)
        else:
            self.pi_approx = 0

    def draw(self):

        pyxel.cls(0)

        # Points
        for x, y, is_inside in self.points_to_draw:
            if is_inside:
                # Points à l'intérieur
                pyxel.pset(x, y, 10) 
            else:
                # Points à l'extérieur
                pyxel.pset(x, y, 7)
                
        # Afficher les statistiques
        pyxel.text(5, 5,  f"Nb de points  : {self.total_points_count}", 7)
        pyxel.text(5, 15, f"Points dedans : {self.points_inside_circle_count}", 7)
        pyxel.text(5, 25, f"Pi approx     : {self.pi_approx:.6f}", 7)
        pyxel.text(5, 35, f"Pi valeur     : {3.1415926535:.6f}", 7)

# Lancer l'application
MonteCarloPiRectangularScreen()