#lang scheme/gui

;;LA VENTANA Y EL LIENZO
(define ventana
  (make-object frame% 
    "3 D" 
    #f 
    500 500;ANCHO ALTO
    1400 0;UBICACIÓN
    ))

(define lienzo
  (instantiate canvas% 
    (ventana) 
    (style '(border)) ))
  
(define dc (send lienzo get-dc))

(send ventana show #t)
(sleep/yield 1)

;;profundidad
(define lapiz
  (make-object pen% "black" 0.5 'long-dash))
;;
(define x-or 50)
(define y-or 450)
(define x-fin 450)
(define y-fin 50)
;;una rejilla con divisiones cada 10 puntos
(define rejilla
  (lambda (dc)
    (send dc set-pen (make-object pen% "black" 0.5 'long-dash))
    (let* ((orig-x x-or)
           (orig-y y-or)
           (largo 450)
           )
      (let go ((i 0)
               (j largo)
               )
        (if (= i j)
            'grid-10
            (begin
              (send dc draw-line orig-x (- orig-y i) (+ orig-x largo) (- orig-y i))
              (send dc draw-line (+ orig-x i) orig-y (+ orig-x i) (- orig-y largo))
              (go (+ 10 i) j))
            )
        )
      )
    ))
(rejilla dc)
;la diagonal
(define diagonal
  (lambda (dc)
    (send dc set-pen (make-object pen% "black" 0.5 'long-dash))
    (send dc draw-line x-or y-or x-fin y-fin)))
(diagonal dc)
;;ensayo de escalado y perspectiva
(define escalado
  (lambda (base altura offset)
    (values (- base offset) (- altura offset)) ))

(define perspectiva
  (lambda (x-orig y-orig offset)
    (values (+ x-orig offset) (- y-orig offset)) ))
;;para dibujar un rectángulo con escalado y perspectiva
(define pinta-rectangulo
  (lambda (dc color x-orig y-orig base altura . escala-persp)
    (send dc set-pen (make-object pen% color 0.5 'solid))
    (let* ((x-orig (+ x-or x-orig))
           (y-orig (- y-or y-orig))
           (e/p escala-persp)
           (escal (if (null? e/p) #f (first e/p)))
           (persp (if (null? e/p) #f (second e/p)))
           )
      (if escal
          (if persp
              (let-values (((b a) (escalado base altura escal))
                           ((x y) (perspectiva x-orig y-orig persp))
                           )
                (send dc draw-rectangle x y b a)
                (values (+ b x) y)
                )
              (let-values (((b a) (escalado base altura escal))
                           )
                (send dc draw-rectangle x-orig y-orig b a)
                ;(values y)
                )
              )
          (send dc draw-rectangle x-orig y-orig base altura)
          )
      )
    ))

;;obsérvese que hay que pintar desde el fondo hacia el frente
;;también que pinta de arriba hacia abajo
(pinta-rectangulo dc "blue" 50 50 50 30 10 20)
(pinta-rectangulo dc "blue" 50 50 50 30 5 10)
(pinta-rectangulo dc "blue" 50 50 50 30)
(send dc draw-line 150 400 160 380)

