racket/collects/plot/common/marching-utils.rkt
Neil Toronto 75f76986c3 Plots with intervals too small or too large for flonums (2D and 3D)
Bounds fixpoint computation now uses only exact rationals
Speed improvements (3d-plot-area% now uses flonums internally as much as possible)
2011-11-14 22:01:07 -08:00

34 lines
1.1 KiB
Racket

#lang racket/base
(require (for-syntax racket/base) racket/unsafe/ops
"utils.rkt")
(provide (all-defined-out))
;; Returns the interpolated distance of z from za toward zb
;; Examples: if z = za, this returns 0.0
;; if z = zb, this returns 1.0
;; if z = (za + zb) / 2, this returns 0.5
;; Intuitively, regard a use (solve-t z za zb) as "the point between za and zb".
(define-syntax-rule (unsafe-solve-t z za zb)
(unsafe-fl/ (unsafe-fl- z za) (unsafe-fl- zb za)))
(define-syntax-rule (unsafe-unsolve-t za zb t)
(unsafe-fl+ (unsafe-fl* t zb) (unsafe-fl* (unsafe-fl- 1.0 t) za)))
(define-syntax-rule (unsolve-t za zb t)
(let ([t (inexact->exact t)])
(+ (* t zb) (* (- 1 t) za))))
(define-syntax-rule (unsafe-flavg4 z1 z2 z3 z4)
(unsafe-fl* 0.25 (unsafe-fl+ (unsafe-fl+ (unsafe-fl+ z1 z2) z3) z4)))
(define-syntax-rule (all pred? obj ...) (and (pred? obj) ...))
(define-syntax (find-failure-index stx)
(syntax-case stx ()
[(_ pred? id ...)
(with-syntax ([(i ...) (build-list (length (syntax->list #'(id ...))) values)])
(syntax/loc stx
(or (and (not (pred? id)) i) ...)))]))