Bill Marriott wrote:
Ok, as our regular viewers know, I'm trying to mimic with Rev a pretty
little clock distributed with Konfabulator. The way K. does this clock is to
create little PNGs for each of the elements (second hand, minute hand, rim,
background), package them up in XML, and animate (rotate) them in
JavaScript.
Attempt 4 (revised): revRotatePoly an irregular polygon
So, I drew myself a pretty minute hand and then wrote a script.
Code used:
on mouseUp
repeat with i = 1 to 360
revRotatePoly the long ID of graphic "minuteHand",1
wait for 50 milliseconds
end repeat
end mouseUp
(I know the "wait for" method was not what I was going to use in my eventual
stack, for performance reasons, but I just wanted to test out spinning it.)
Well, running this script was a shocker. It had the effect of crumpling my
pretty minute hand into a little ball. If you'd like to see what happens, go
to revOnline under my space, "MerryOtter" -- the stack is, "Fun with
revRotatePoly"
I rather like that effect - though it certainly shouldn't be called
"rotate" :-)
My clock hand *is* pretty fancy, it's got 56 points. But the same thing
happens with graphics of only 3 points. Open the stack and try the simplest
kind of clock hand you could imagine with
<snip>
#13) General flakiness. I would definitely say revCrumplePoly is a better
name for the revRotatePoly command. Is there any situation where
revRotatePoly could be useful? Not if it does this. Totally bugged. (I
suspect the reason why is that Rev doesn't have fractional coordinates?
Could such a limitation really result in such dramatic distortion? If this
is the case, then Rev should store fractionals, but render to integers.)
I think your suspicion is entirely correct. I think it would be
generally very helpful if Rev would allow non-integer co-ords in the
points list, and simply round to integers before drawing.
I change the code to
put the points of grc "minuteHand" into tPoints
repeat with i = 1 to 360
set the lockScreen to true
set the points of grc "minuteHand" to tPoints
revRotatePoly the long ID of graphic "minuteHand", i --
note the change from "1" to "i" here
set the lockScreen to false
set the thumbposition of scrollbar "spinProgress" to i
wait for 50 milliseconds
end repeat
and it now does what it's intended to do. Though I really dislike what
it's intended to do - rotate the object, then translate it so as to keep
the top left of the bounding rectangle of the rotated shape the same.
We had a thread on rotating polygons back in March (to save you cracking
out the trig books), here is the code modified to use the rotate handler
I suggested then. Note this is written to emphasize readability rather
than performance - could probably be made faster if needed.
on mouseUp
put the points of grc "minuteHand" into tPoints
repeat with i = 1 to 360
set the lockScreen to true
set the points of grc "minuteHand" to tPoints
myRotatePoly the name of grc "minuteHand", i, 0, 24
-- revRotatePoly the long ID of graphic "minuteHand", i
set the lockScreen to false
set the thumbposition of scrollbar "spinProgress" to i
wait for 50 milliseconds with messages
end repeat
set the points of grc "minuteHand" to tPoints
end mouseUp
on myRotatePoly pGraphic, pAngle, basex, basey
put the topLeft of pGraphic into tTopLeft
put myPoints(pGraphic, basex, basey) into tPoints -- returns
the list of points, relative to the base point
put the loc of pGraphic into tLoc
put sin(pAngle * (pi / 180)) into tSinAngle
put cos(pAngle * (pi / 180)) into tCosAngle
put (number of items of tPoints) div 2 into tNumItems
repeat with i = 1 to tNumItems
put (item (i + (i - 1)) of tPoints) into tCurrentH -- + item 1
of the center
put (item (i + i) of tPoints) into tCurrentV -- + item 2 of
the center
put trunc((tCosAngle * tCurrentH) - (tSinAngle * tCurrentV))
into tTempH
put trunc((tSinAngle * tCurrentH) + (tCosAngle * tCurrentV))
into tTempV
put tTempH + basex into tCurrentH -- and add back the base
x and y
put tTempV + basey into tCurrentV
put tCurrentH,tCurrentV & comma after tFinalPoints
end repeat
delete last char of tFinalPoints
set the points of pGraphic to tFinalPoints
end myRotatePoly
function myPoints pGraphic, basex, basey
put the number of lines in the points of pGraphic into tNumPoints
put empty into tResult
put the points of pGraphic into tPoints
put basex into tStartlH
put basey into tStartV
replace cr with comma in tPoints
if last char of tPoints is comma then delete last char of tPoints
repeat with i = 1 to tNumPoints
put (item (i + (i - 1)) of tPoints) - tStartlH into tCurrentH
put (item (i + i) of tPoints) - tStartV into tCurrentV
put tCurrentH,tCurrentV & comma after tResult
end repeat
delete last char of tResult
return tResult
end myPoints
--
Alex Tweedly http://www.tweedly.net
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.362 / Virus Database: 267.13.11/191 - Release Date: 02/12/2005
_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution