;;; A Point represents a location in $\Bbb R^2$. (define (make-Point x y) (f64vector x y)) (define (Point-x p) (f64vector-ref p 0)) (define (Point-y p) (f64vector-ref p 1)) (define (Point-x-set! p val) (f64vector-set! p 0 val)) (define (Point-y-set! p val) (f64vector-set! p 1 val)) (define (Point? p) (and (f64vector? p) (fx= (f64vector-length p) 2))) (define (Point-add p1 p2) (make-Point (fl+ (Point-x p1) (Point-x p2)) (fl+ (Point-y p1) (Point-y p2)))) (define (Point-subtract p1 p2) (make-Point (fl- (Point-x p1) (Point-x p2)) (fl- (Point-y p1) (Point-y p2)))) (define (Point-scale x p) (make-Point (fl* x (Point-x p)) (fl* x (Point-y p)))) (define (Point-*axpy a p1 p2) (make-Point (+ (* a (Point-x p1)) (Point-x p2)) (+ (* a (Point-y p1)) (Point-y p2)))) (define (Point-dot-product p1 p2) (fl+ (fl* (Point-x p1) (Point-x p2)) (fl* (Point-y p1) (Point-y p2)))) (define (Point-cross-product p1 p2) (fl- (fl* (Point-x p1) (Point-y p2)) (fl* (Point-x p2) (Point-y p1)))) (define (Point-counter-clockwise? p1 p2 p3) (flpositive? (Point-cross-product (Point-subtract p1 p2) (Point-subtract p2 p3)))) (define (Point-L2-norm p) (let ((x (Point-x p)) (y (Point-y p))) (flsqrt (fl+ (fl* x x) (fl* y y))))) (define (Point-zero) (make-Point 0.0 0.0))