What goes around... revolutions in Revolution

Derek Huby derek.huby at ntlworld.com
Mon Dec 9 17:27:01 EST 2002


Dear all,

I think it's nice to have something new to play with while waiting for 2.0
;-) 

If anybody's interested, I've been taking some polygons for a spin...

The ability to rotate an image is built in to Rev, of course; but rotating a
polygon-style graphic seems to offer a lot more flexibility. Imagine - you
could build an arrow 'pointer' that swings around a scale, rotate a
'forearm' around an 'elbow', model the listing of a ship's hull... oh, lots
of good stuff, really.

So, how to do it? My attempt (script below) rotates a graphic by a given
angle, using another small graphic to mark the centre of rotation. I'd be
interested to know whether I'm reinventing the wheel here; however, even if
I am, I enjoyed doing it!

Here's the card script:

***************

on rotateshape shapename, angle
  -- this will rotate gc shapename through 'angle' degrees anticlockwise
 
  -- check the graphic exists
  if there is not a graphic shapename
  then
    exit rotateshape
  end if
 
  --"CoR" (centre of rotation) is a small cicular 'grabbable' gc marking the
centre
  put item 1 of the loc of graphic "CoR" into XCentre
  put item 2 of the loc of graphic "CoR" into YCentre
 
  --"origPts" is a custom property containing the original point list.
  --You can't just rotate from the 'current' point list; rounding errors
will 'degrade' the shape.
 
  if the origPts of graphic shapename = empty
  then
    set the origPts of graphic shapename to the points of graphic shapename
  end if
 
  --"rotAngle" is a custom property that tells you how far the shape is
--currently rotated
 
  if the rotAngle of graphic shapename = empty
  then
    set the rotAngle of graphic shapename to 0
  end if
  
  put empty into newPointList
  put the origPts of graphic shapename into pointList
 
  -- Build new list of coords relative to CoR as origin
  repeat for each line k in pointlist
    put (item 1 of k)- Xcentre & "," & (item 2 of k)- Ycentre & return after
newPointList
  end repeat
 
  
  set the rotangle of graphic shapename to (the rotangle of graphic
shapename + angle) mod 360
 
 
  put sin(the rotangle of graphic shapename * pi/180) into S
  put cos(the rotangle of graphic shapename * pi/180) into C
 
  put empty into rotptlist
 
  --Now do the actual rotation
  repeat for each line k in newPointlist
    put round(c*(item 1 of k)+ s*(item 2 of k) + xCentre) after rotptlist
    put "," after rotptlist
    put round(c*(item 2 of k) - s*(item 1 of k)+ Ycentre)after rotptlist
    put return after rotPtList
  end repeat
 
  set the points of graphic shapename to rotPtlist
 
end rotateshape

***************

I've also got a button to call this handler; its script is:

***************

on mouseup
  repeat 180
    rotateshape "arrow1", 2
    wait 1 millisecond
  end repeat
end mouseup

***************

This rotates a graphic called "arrow1" through 360 degrees.
Finally, I have a small circular graphic called CoR. It's script is
(predictably):

***************
on mousedown
  grab me
end mousedown
***************

This could all do with a bit more work - changing the centre of rotation
doesn't work properly, for example. But it does show the possibilities...


Derek


-- 
Derek Huby
KS3 Mathematics Consultant
East Sussex County Council




More information about the Use-livecode mailing list