(define (lerp a b t) (+ a (* t (- b a)))) (define (line-lerp-y->x a b y) (let-values (((ax ay) (apply values a)) ((bx by) (apply values b))) (let ((t (/ (- y ay) (- by ay)))) (exact (floor (lerp ax bx t)))))) (define (render-draw-trapezoid! renderer trap) (let*-values (((la ra lb rb) (apply values trap)) ((lay) (cadr la)) ((lby) (cadr lb)) ((next-y) (/ (- lby lay) (abs (- lby lay))))) (let loop ((y lay)) (let ((lx (line-lerp-y->x la lb y)) (rx (line-lerp-y->x ra rb y))) (sdl2:render-draw-line! renderer lx y rx y) (cond ((= y lby)) (else (loop (+ y next-y))))))))