Rotating circles
Nobody has claimed this yet.
- Dominant language
- Racket
- Stars
- 19
- Forks
- 24
- PR merge metrics
- No merged PRs in 30d
Description
The program below draws a rotating circle drawn with black outline and white interior on a gray background.
The circle has has center in the rotation center, so the expected result is a static image.
However the smoothing settings 'unsmoothed and 'aligned reveals a problem.
Using 'unsmoothed the outline pulses (the thickness varies).
Using 'aligned one sees the brush color "bleed" through the outline.
#lang racket/base
(require racket/gui)
(define width 640)
(define height 360)
(define angle 0.0) ; the rotation angle
; A frame containing a single canvas with a timer that continously calls draw.
(define top-frame #f)
(define top-canvas #f)
(define top-timer #f)
(define dc #f) ; drawing context of the canvas
(define red-pen
(new pen%
[color "red"]
[width 4]
[style 'solid]
[cap 'round]
[join 'round]
[stipple #f]))
(define black-pen
(new pen%
[color "black"]
[width 1]
[style 'solid]
[cap 'round]
[join 'round]
[stipple #f]))
(define white-pen
(new pen%
[color "white"]
[width 1]
[style 'solid]
[cap 'round]
[join 'round]
[stipple #f]))
(define white-brush (new brush% [color "black"]))
(define (draw)
(define old-transformation #f)
(when dc
(send dc set-background "darkgray")
(send dc clear)
; (send dc set-smoothing 'smoothed) ; looks ok
(send dc set-smoothing 'unsmoothed) ; outline pulses
; (send dc set-smoothing 'aligned) ; outline is slightly off
(send dc set-pen white-pen)
(send dc set-text-foreground "white")
(set! old-transformation (send dc get-transformation))
(send dc translate 440.5 180.5)
(send dc rotate angle)
(send dc set-brush white-brush)
(send dc draw-ellipse -50 -50 100 100)
(send dc set-transformation old-transformation)
(set! angle (+ angle 0.025))))
(define my-frame%
(class frame%
(define/augment (on-close)
(when top-timer
(send top-timer stop)))
(super-new)))
(define my-canvas%
(class canvas%
(define/override (on-paint) ; repaint (exposed or resized)
(define dc (send this get-dc))
(send this suspend-flush)
(handle-on-paint dc)
(send this resume-flush))
(super-new)))
(define (start-gui)
(define frame (new my-frame%
[label "sketch"]))
(set! top-frame frame)
(define canvas (new my-canvas%
[parent frame]
[min-width width]
[min-height height]))
(set! top-canvas canvas)
(set! dc (send top-canvas get-dc))
(define timer (new timer%
[notify-callback handle-on-timer]
[interval (inexact->exact (floor (/ 1000 30)))])) ; milliseconds
(set! top-timer timer)
(send frame show #t))
(define (handle-on-paint dc)
(when dc
(draw)))
(define (handle-on-timer)
(send top-canvas on-paint))
(start-gui)
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the supplied racket/gui program and compare the 'unsmoothed and 'aligned results with 'smoothed. Start by tracing set-smoothing, the transformed draw-ellipse call, and the timer-driven draw path; done means the centered circle remains visually static without outline pulsing or brush-color bleed.
Written by the indexing model from the issue text.
Assessment
- Domain
- computer-graphics, desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100