133x126.  The PNG itself is 3K.  Running racket 5.0.2.<div><br></div><div>As an irrelevant side-note, I noticed that I had a broken trig function in there.  I fixed it, but that actually had nothing to do with the performance.  I also went ahead and implemented caching of the rotated images, and the performance still isn&#39;t that great, although it&#39;s far better, at least when I don&#39;t move the mouse.</div>
<div><br></div><div>y<br><br><div class="gmail_quote">On Tue, Feb 1, 2011 at 9:35 PM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I&#39;ll leave the pedagogy questions to others, but for the performance<br>
questions, can you tell me what version you were using and the size of<br>
the png images (wxh)?<br>
<br>
Robby<br>
<div><div></div><div class="h5"><br>
On Tue, Feb 1, 2011 at 8:27 PM, Yaron Minsky &lt;<a href="mailto:yminsky@gmail.com">yminsky@gmail.com</a>&gt; wrote:<br>
&gt; I am trying to teach my scratch-addicted son a bit about racket, and I&#39;m<br>
&gt; finding it to be rather tough going, mostly because a lot of things that are<br>
&gt; really easy in scratch seem surprisingly hard in racket.  Also, even when I<br>
&gt; can get things done, the performance of the graphics leaves something to be<br>
&gt; desired.  I&#39;m wondering if this is just the way the world is right now, or<br>
&gt; if somehow I&#39;m approaching this the wrong way.<br>
&gt; I was trying to put together a simple animation using the universe and image<br>
&gt; teachpacks where:<br>
&gt; - there is a &quot;sprite&quot; which switches between two images periodically<br>
&gt; - the sprite is always pointing at the mouse<br>
&gt; I wrote some code for doing this.  One problem is that getting this to work<br>
&gt; required some actual trigonometry, which my 9 year old isn&#39;t quite ready<br>
&gt; for.  But that I could fix by writing a simple helper function.  But the<br>
&gt; other problem is that the resulting code is horribly slow.  As soon as you<br>
&gt; rotate the image, the rendering performance falls through the floor, and you<br>
&gt; see a ton of flickering.<br>
&gt; I&#39;ve attached the code below.  I can imagine some ways of optimizing this<br>
&gt; (for example, doing the rotations only on mouse moves, and storing the<br>
&gt; resulting rotated images in the world-struct), but I want to keep the coding<br>
&gt; style pretty simple, and I think these kinds of optimizations get in the way<br>
&gt; of comprehensibility.<br>
&gt; Another thing I&#39;d be interested in suggestions with is how to deal with<br>
&gt; updating a struct in a clean way.  Right now, you need to explicitly wrote<br>
&gt; set-world-X functions for each field in your struct, which is pretty ugly.<br>
&gt;  Also, the fact that structs don&#39;t have field names makes them more error<br>
&gt; prone.  None of this is well suited towards building complex worlds with<br>
&gt; lots of components.  I&#39;m wondering if there is a better way of approaching<br>
&gt; this that doesn&#39;t require quadratic boilerplate, and that is suitable for<br>
&gt; teaching to a kid.<br>
&gt; Anyway, here&#39;s the code.  Thanks in advance!<br>
&gt; ;; the images here are actual PNG images, which don&#39;t show up nicely in<br>
&gt; ascii...<br>
&gt; (define pic1 .)<br>
&gt; (define pic2 .)<br>
&gt; (define (posn-diff a b)<br>
&gt;   (make-posn<br>
&gt;    (- (posn-x a) (posn-x b))<br>
&gt;    (- (posn-y a) (posn-y b))))<br>
&gt; (define (posn-mag p)<br>
&gt;   (sqrt (+ (sqr (posn-x p)) (sqr (posn-y p)))))<br>
&gt; (define (angle-between pos1 pos2)<br>
&gt;   (let*<br>
&gt;       ((delta (posn-diff pos2 pos1))<br>
&gt;        (hyp (posn-mag delta))<br>
&gt;        (angle-in-radians (if (= hyp 0) 0 (asin (/ (posn-y delta) hyp))))<br>
&gt;        )<br>
&gt;     (-(* angle-in-radians (/ 180 pi)))))<br>
&gt;<br>
&gt; (define-struct world (pos mouse-pos time))<br>
&gt; (define initial-world (make-world (make-posn 200 200) (make-posn 200 200)<br>
&gt; 0))<br>
&gt; (define (draw w)<br>
&gt;   (place-image<br>
&gt;    (rotate (angle-between (world-pos w) (world-mouse-pos w))<br>
&gt;            (if (is-even (round (world-time w))) pic1 pic2))<br>
&gt;    (posn-x (world-pos w))<br>
&gt;    (posn-y (world-pos w))<br>
&gt;    (empty-scene 400 400)))<br>
&gt; (define (tick w)<br>
&gt;   (make-world<br>
&gt;    (world-pos w)<br>
&gt;    (world-mouse-pos w)<br>
&gt;    (+ 0.1 (world-time w))))<br>
&gt; (define (mouse w x y event)<br>
&gt;   (make-world<br>
&gt;    (world-pos w)<br>
&gt;    (make-posn x y)<br>
&gt;    (world-time w)<br>
&gt;    ))<br>
&gt; (big-bang<br>
&gt;  initial-world<br>
&gt;  (on-draw draw)<br>
&gt;  (on-tick tick)<br>
&gt;  (on-mouse mouse)<br>
&gt;  )<br>
</div></div>&gt; _________________________________________________<br>
&gt;  For list-related administrative tasks:<br>
&gt;  <a href="http://lists.racket-lang.org/listinfo/users" target="_blank">http://lists.racket-lang.org/listinfo/users</a><br>
&gt;<br>
</blockquote></div><br></div>