[squeak-dev] Rotating Morphs; how to rotate about a point other than the centre of bounds?

Bob Arning arning315 at comcast.net
Fri Apr 7 19:09:42 UTC 2017


photoshop is for sissies. use squeak ;-)


     | secondHand flex pos elapsed rads start fancy bottomHalf smaller |

     fancy _ Form extent: 500 at 100 depth: 32.
     fancy fillColor: Color white.
     fancy getCanvas
         fillOval: (5 at 5 extent: 90 at 90) color: Color black;
         fillOval: (0 at 15 extent: 70 at 70) color: Color white;
         fillRectangle: (400 at 20 extent: 60 at 60) color: Color black;
         fillOval: (300@(-348) extent: 400 at 400) color: Color white;
         fillRectangle: (90 at 48 extent: 400 at 4) color: Color black.
     bottomHalf _ fancy copy: (0 at 0 extent: fancy width @ (fancy height 
// 2)).
     bottomHalf flipVertically.
     bottomHalf displayOn: fancy at: 0@(fancy height//2).
     fancy replaceColor: Color white withColor: Color transparent.

     pos _ 500 at 200.
     smaller _ fancy magnify: fancy boundingBox by: 0.25 smoothing: 2.
     secondHand _ smaller asMorph.
     flex _ TransformationMorph new.
     flex addMorph: secondHand.
     secondHand position: smaller boundingBox center negated.
     flex position: pos.
     flex openInWorld explore.
     start _ Time millisecondClockValue.
     [elapsed _ Time millisecondClockValue - start. elapsed < 60000] 
whileTrue: [
         rads _ Float twoPi * (elapsed \\ 60000) / 60000.
         flex angle: rads negated.
         World displayWorldSafely.
         (Delay forMilliseconds: 100) wait
     ]


On 4/7/17 2:18 PM, tim Rowledge wrote:
> I think I’m starting to make sense of these damned transformation morphs, though it’s a bit confusing in some areas.
>
>> On 06-04-2017, at 7:43 PM, Bob Arning <arning315 at comcast.net> wrote:
>>      | secondHand flex pos elapsed start rads |
>>      
>>      pos _ 100 at 100.
>>      secondHand _ (StringMorph contents: 'seconds') color: Color magenta.
>>      flex _ TransformationMorph new.
>>      flex addMorph: secondHand.
>>      secondHand position: 0 at 0.
>>      flex position: pos.
>>      flex offset: secondHand position.
>>      flex openInWorld explore.
>>      start _ Time millisecondClockValue.
>>      [elapsed _ Time millisecondClockValue - start. elapsed < 60000] whileTrue: [
>>          rads _ Float twoPi * (elapsed \\ 60000) / 60000.
>>          flex angle: rads negated.
>>          World displayWorldSafely.
> This is much more like it. No strange intermediate morphs masquerading as our friend. It’s as if it all makes sense. Briefly, at least, whilst the drugs keep their hold.
>
> If we change to
>     | secondHand flex pos |
>      
>      pos := 500 at 200.
>      secondHand := (RectangleMorph new extent: 10 at 100) color: Color red.
>      flex := TransformationMorph new.
>      flex addMorph: secondHand.
>      secondHand position: -5@ -100. “<— set the bottom centre to be at the parent’s 0 at 0"
>      flex position: pos.
>      "flex offset: 0 at 0. <— don’t seem to need this"
>      flex openInWorld explore.
>      start := Time millisecondClockValue.
>      [elapsed := Time millisecondClockValue - start. elapsed < 60000] whileTrue: [
>          rads := Float twoPi * (elapsed \\ 60000) / 60000.
>          flex angle: rads negated.
>          World displayWorldSafely.
> 		(Delay forMilliseconds: 100) wait
>      ]
> … then we get a nice chubby needle rotating about the middle of its bottom edge, which is a typical want if we have a simple morph-drawn needle. There does seem to be some odd behaviour when one changes the offset and rotates things; the bounds can end up moving in not-yet obvious ways and then things get confusing.
>
> Fiddling with the `secondHand position: ` seems to work ok as a way to choose any point as  the pivot, which is what we’d need for an image of an ornate needle we want to use. Like this one - http://www.cjhclocks.com/images/uploads/large/barometer_silver-face_404.jpg
>
> Of course, one of the next tricks is to find someone with the ‘shoop skills to take an image like that and separate out the needle and dial face as separate images.
>
> tim
> --
> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim
> Strange OpCodes: RDL: Rotate Disk Left
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170407/0c66f3b3/attachment.html>


More information about the Squeak-dev mailing list