racket/collects/images/private/flomap-stats.rkt

51 lines
2.2 KiB
Racket

#lang typed/racket/base
(require racket/match
"flonum.rkt"
"flomap-struct.rkt")
(provide flomap-min-value flomap-max-value flomap-extreme-values
flomap-nonzero-rect)
(: flomap-min-value (flomap -> Float))
(define (flomap-min-value fm)
(for/fold ([v-min +inf.0]) ([v (in-flvector (flomap-values fm))])
(min v-min v)))
(: flomap-max-value (flomap -> Float))
(define (flomap-max-value fm)
(for/fold ([v-max -inf.0]) ([v (in-flvector (flomap-values fm))])
(max v-max v)))
(: flomap-extreme-values (flomap -> (values Float Float)))
(define (flomap-extreme-values fm)
(for/fold: ([v-min : Float +inf.0]
[v-max : Float -inf.0]
) ([v : Float (in-flvector (flomap-values fm))])
(values (min v-min v) (max v-max v))))
(: flomap-nonzero-rect (flomap -> (values Nonnegative-Fixnum Nonnegative-Fixnum
Nonnegative-Fixnum Nonnegative-Fixnum)))
(define (flomap-nonzero-rect fm)
(match-define (flomap vs c w h) fm)
(with-asserts ([c nonnegative-fixnum?] [w nonnegative-fixnum?] [h nonnegative-fixnum?])
(define: x-min : Nonnegative-Fixnum w)
(define: y-min : Nonnegative-Fixnum h)
(define: x-max : Nonnegative-Fixnum 0)
(define: y-max : Nonnegative-Fixnum 0)
(let: y-loop : Void ([y : Nonnegative-Fixnum 0] [i : Nonnegative-Fixnum 0])
(when (y . fx< . h)
(let: x-loop : Void ([x : Nonnegative-Fixnum 0] [i : Nonnegative-Fixnum i])
(cond [(x . fx< . w)
(let: k-loop : Void ([k : Nonnegative-Fixnum 0] [i : Nonnegative-Fixnum i])
(cond [(k . fx< . c) (define v (flvector-ref vs i))
(when (not (v . = . 0.0))
(set! x-min (fxmin x-min x))
(set! y-min (fxmin y-min y))
(set! x-max (fxmax x-max (fx+ 1 x)))
(set! y-max (fxmax y-max (fx+ 1 y))))
(k-loop (fx+ k 1) (fx+ i 1))]
[else (x-loop (fx+ x 1) i)]))]
[else (y-loop (fx+ y 1) i)]))))
(values x-min y-min x-max y-max)))