You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.3 KiB
Racket
48 lines
1.3 KiB
Racket
;; Copyright 2019 Edward L. Platt <elplatt@alum.mit.edu
|
|
;;
|
|
;; TODO: add comments
|
|
|
|
#lang racket
|
|
|
|
(require racket/draw)
|
|
(require racket/gui)
|
|
(require "sylvester.rkt")
|
|
(require "network.rkt")
|
|
|
|
(define (draw-sylvester m w h margin)
|
|
(define target (make-bitmap w h))
|
|
(define dc (new bitmap-dc% [bitmap target]))
|
|
(let ([edges (sylvester-edges m)]
|
|
[nodes (sylvester-nodes m)])
|
|
(for ([e edges])
|
|
(draw-edge m e dc (- (/ w 2) margin) margin))
|
|
(for ([v nodes])
|
|
(draw-node m v dc (- (/ w 2) margin) margin)))
|
|
(make-object image-snip% target))
|
|
|
|
(define (draw-edge m edge dc r margin)
|
|
(let* ([v (sylvester-radix-value (first edge))]
|
|
[w (sylvester-radix-value (second edge))])
|
|
(send dc set-pen "gray" 2 'solid)
|
|
(send dc draw-line
|
|
(node-x v m r margin) (node-y v m r margin)
|
|
(node-x w m r margin) (node-y w m r margin))))
|
|
|
|
(define (draw-node m v dc r margin)
|
|
(let ([v (sylvester-radix-value v)])
|
|
(send dc set-pen "black" 2 'solid)
|
|
(send dc draw-arc
|
|
(- (node-x v m r margin) 4) (- (node-y v m r margin) 4)
|
|
8 8 0 (* 2 pi))))
|
|
|
|
(define (node-x v m r margin)
|
|
(let ([vtheta (* 2 pi (/ v (- (sylvester m) 1)))])
|
|
(+ r margin (* r (cos vtheta)))))
|
|
|
|
(define (node-y v m r margin)
|
|
(let ([vtheta (* 2 pi (/ v (- (sylvester m) 1)))])
|
|
(+ r margin (* r (sin vtheta)))))
|
|
|
|
(draw-sylvester 3 320 320 10)
|
|
|