График/диаграмма Racket в реальном времени

Я пытаюсь сделать диаграмму реального времени в ракетке. Я просмотрел библиотеки Plot и GUI, и мне кажется, что я что-то упускаю. При вызове plot он возвращает фрагмент изображения% или ряд других форматов изображения. Но я не могу найти способ добавить или удалить точки с диаграммы без повторного вызова plot. Теперь я полагаю, что мог бы использовать такой метод, как

https://planet.racket-lang.org/package-source/williams/animated-canvas.plt/2/5/planet-docs/animated-canvas/index.html

но тогда я должен заново реализовать все механизмы манипулирования, которые идут с снипом%. Теперь может быть так, что я все равно должен это сделать, но я спрашиваю, существуют ли какие-либо существующие механизмы, которые позволяют вам манипулировать графиком и данными фрагмента графика после его создания, или я должен просто перерисовывать его вручную каждый раз, когда я хочу изменить его внешний вид? Также есть ли какая-либо существующая работа, которая была проделана для создания диаграмм в реальном времени в Racket в целом?


person dg123    schedule 01.06.2016    source источник


Ответы (1)


Покопавшись в библиотеках Rackets OOP и gui, я в конце концов наткнулся (и понял) plot/dc, который, как утверждает документация, можно использовать для таких приложений: https://docs.racket-lang.org/plot/plotting.html?q=plot%2Fdc#%28def._%28%28lib._plot%2Fmain..rkt%29._plot%2Fdc%29%29

Кажется, при рендеринге он работает лучше, чем анимированный холст, но мне все равно придется заново реализовать масштабирование, клики и все, что идет с snip%s, если только у кого-то нет идей получше.

#lang racket

(require racket/gui plot racket/draw)

(define num 0)

(define f (new frame% [label "Test graph"]
               [width 200]
               [height 200]))
(define c (new canvas% [parent f]))


(send f show #t)

(define (loop)
  (set! num (add1 num))
  (plot/dc (function sin (- pi) num)
           (send c get-dc)
           0 0
           (- (send f get-width) 40) ;; figure out how to get the actual size of the text outside the graphs boarder?
           (- (send f get-height) 40)
           #:title "Graph"
           #:x-label "num"
           #:y-label "sin"
           )
  (sleep/yield .2)
  (loop))

(loop)
person dg123    schedule 06.07.2016