import numpy as np import sys from decimal import Decimal from time import time from ..units import HighPrecisionMatrix def calculate_distances(positions): N = len(positions) dists = HighPrecisionMatrix(N,N) for i in range(N): dists[i][i] = Decimal(0) for j in range(i+1, N): d = sum([x**2 for x in (positions[i]-positions[j])]).sqrt() dists[i][j] = Decimal(d) dists[j][i] = Decimal(d) return dists def calculate_distances_np(positions): positions = np.array(positions) diffs = positions[:, np.newaxis] - positions[np.newaxis, :] dists = np.linalg.norm(diffs, axis=-1) np.fill_diagonal(dists, 0) return dists def print_progress_bar(iteration, total, start_time, length=50): """Prints a progress bar to the console.""" percent = (iteration / total) * 100 filled_length = int(length * iteration // total) bar = '#' * filled_length + '-' * (length - filled_length) sys.stdout.write(f'\r[{bar}] {percent:.2f}% {int(iteration/(time()-start_time))} steps/s') sys.stdout.flush() def format_sig_figs(value, sig_figs): """Format a number to a specified number of significant figures for printing.""" if value == 0: return "0" return f"{value:.{sig_figs-1}e}" def plot_points_terminal(vectors, stdscr, scale=500000, grid_width=30, grid_height=30): """Plots multiple points in the terminal, scaled and centered at (0,0).""" stdscr.clear() if not vectors: stdscr.addstr(0, 0, "No vectors provided.") stdscr.refresh() return # Apply scaling scaled_vectors = {(round(vec[0] / scale), round(vec[1] / scale)) for vec in vectors} # Find min and max coordinates min_x = min(vec[0] for vec in scaled_vectors) max_x = max(vec[0] for vec in scaled_vectors) min_y = min(vec[1] for vec in scaled_vectors) max_y = max(vec[1] for vec in scaled_vectors) # Center offsets to keep (0,0) in middle center_x = (grid_width // 2) - min_x center_y = (grid_height // 2) - min_y # Adjust coordinates for plotting adjusted_vectors = {(vec[0] + center_x, vec[1] + center_y) for vec in scaled_vectors} # Ensure grid boundaries max_terminal_y, max_terminal_x = stdscr.getmaxyx() max_x = min(grid_width, max_terminal_x - 5) max_y = min(grid_height, max_terminal_y - 5) # Draw grid with points for i in range(grid_height, -1, -1): row = f"{i - center_y:2} | " for j in range(grid_width + 1): row += "● " if (j, i) in adjusted_vectors else ". " stdscr.addstr(max_y - i, 0, row[:max_terminal_x - 1]) # Ensure no overflow # Print X-axis labels x_labels = " " + " ".join(f"{j - center_x:2}" for j in range(max_x + 1)) stdscr.addstr(max_y + 1, 0, x_labels[:max_terminal_x - 1]) # Avoid out-of-bounds error stdscr.refresh()