;;; Copyright (C) 2025 Gene Pasquet ;;; ;;; This program is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see . (import enum [Enum] math [sqrt]) (defclass Direction [Enum] (setv UP "UP") (setv DOWN "DOWN") (setv LEFT "LEFT") (setv RIGHT "RIGHT") (defn [staticmethod] from-move [move] #((.x-from-move Direction move) (.y-from-move Direction move))) (defn [staticmethod] x-from-move [move] (if (>= (get move 0) 0) Direction.RIGHT Direction.LEFT)) (defn [staticmethod] y-from-move [move] (if (>= (get move 0) 0) Direction.DOWN Direction.UP)) (defn [staticmethod] x-between-points [point1 point2] (let [delta-x (abs (- (get point1 0) (get point2 0)))] (if (>= delta-x 0) Direction.RIGHT Direction.LEFT)))) (defn neg [value] (* -1 value)) (defn invert [move] #((neg (get move 0)) (neg (get move 1)))) (defn merge-moves [moves] (let [end-move #(0 0)] (for [move moves] (setv end-move #((+ (get end-move 0) (get move 0)) (+ (get end-move 1) (get move 1))))) end-move)) (defn sub-points [point1 point2] #((- (get point2 0) (get point1 0)) (- (get point2 1) (get point2 1)))) (defn add-tuples [tup1 tup2] #((+ (get tup1 0) (get tup2 0)) (+ (get tup1 1) (get tup2 1)))) (defn normalise-tuple [tup min-tup max-tup] #((min (get max-tup 0) (max (get min-tup 0) (get tup 0))) (min (get max-tup 1) (max (get min-tup 1) (get tup 1))))) (defn null-tuple [tup] (and (= (get tup 0) 0) (= (get tup 1) 0))) (defn distance [point1 point2] (sqrt (+ (** (- (get point1 0) (get point2 0)) 2) (** (- (get point1 1) (get point2 1)) 2))))