## Where communities thrive

• Join over 1.5M+ people
• Join over 100K+ communities
• Free without limits
##### Activity
• Oct 20 2019 22:59
@dockimbel banned @SmackMacDougal
• Dec 03 2017 05:53
@PeterWAWood banned @matrixbot
• Sep 28 2016 12:19
@PeterWAWood banned @TimeSeriesLord
• Aug 13 2016 03:23
@PeterWAWood banned @Vexercizer
Max
:sob:
Toomas Vooglaid
@toomasv
@dsunanda You are welcome!
Palaing
@Palaing
@lepinekong_twitter great! it does much more than I needed ;)
lepinekong
@Palaing sure because I didn't do it for you but for me ;)
dsunanda
@dsunanda
Is there any way as yet to rotate an image? Perferably by an arbitrary number of degrees
@9214
@dsunanda matrix transformations. I'll let @toomasv to weight in, as he has some experience with that (and examples).
Toomas Vooglaid
@toomasv

@dsunanda There are three ways to rotate a figure:
rotate (takes also floats for angle):

t: 0 view [box 200x200 rate 10 draw [
rotate 0 100x100 box 50x50 150x150
] on-time [face/draw/2: (t: t + 1) % 360]]

transform (takes also floats for angle):

t: 0 view [box 200x200 rate 10 draw [
transform 100x100 0 1 1 0x0 box 50x50 150x150
] on-time [face/draw/3: (t: t + 1) % 360]]

and matrix:

t: 0 view [box 200x200 rate 10 draw [
matrix [0 0 0 0 0 0] box -50x-50 50x50
] on-time [t: t + 1 face/draw/2: reduce [
(cosine t) (negate sine t) (sine t) (cosine t) 100 100
]]]
lepinekong
@toomasv great snippets thanks
Toomas Vooglaid
@toomasv
@lepinekong_twitter Thanks. Last one was not good -- too much copying. Here is better:
t: 0 view [
box 200x200 rate 10 draw [matrix [0 0 0 0 100 100] box -50x-50 50x50]
on-time [t: t + 1
face/draw/2/1: cosine t
face/draw/2/2: negate sine t
face/draw/2/3: sine t
face/draw/2/4: cosine t
]]
Toomas Vooglaid
@toomasv

Here is matrix rotation combined with scaling...:

t: 0 view [box 200x200 rate 10 draw [matrix [0 0 0 0 100 100] box -50x-50 50x50]
on-time [t: t + 1
face/draw/2/1: cosine t face/draw/2/2: 1.5 * negate sine t
face/draw/2/3: 1.5 * sine t face/draw/2/4: cosine t
]]

...skewing...:

t: 0 view [box 200x200 rate 10 draw [matrix [0 0 0 0 100 100] box -50x-50 50x50]
on-time [t: t + 1
face/draw/2/1: .5 * cosine t face/draw/2/2: negate sine t
face/draw/2/3: sine t face/draw/2/4: 1.5 * cosine t
]]

... and translation:

t: 0 view [box 200x200 rate 10 draw [matrix [0 0 0 0 100 80] box -50x-50 50x50]
on-time [t: t + 1
face/draw/2/1: cosine t face/draw/2/2: negate sine t face/draw/2/3: sine t
face/draw/2/4: cosine t face/draw/2/6: face/draw/2/6 + 10 - (t % 21)
]]
dsunanda
@dsunanda
Thanks for the rotation code - I'll have some fun playing with that soon.
Toomas Vooglaid
@toomasv
This is funnier "jumping square":
t: 0 view/tight [box 200x200 rate 10 draw [rotate 180 100x100 matrix [0 0 0 0 100 80] box -50x-50 50x50]
on-time [t: t + 1
face/draw/5/1: cosine t face/draw/5/2: negate sine t face/draw/5/3: sine t
face/draw/5/4: cosine t face/draw/5/6: face/draw/5/6 + 10 - (t % 21)
]]
lepinekong
@toomasv clap!
GiuseppeChillemi
@GiuseppeChillemi

Hi,
if I have a function which accepts a block of block like:

blk: [[a] [b]]

and I want to include this data in a bigger block like:

blk2: [one [[a] [b]] two [[c][d]]]

And provide to the function a block of my choiche without picking (copying) it

If I move the index of the series to the block next to ONE

myblock: find/tail blk2 'one

>> probe myblock
= [[[a] [b]] two [[c][d]]]

I whish to

>> probe myblock
= [[a] [b]]

Without anything which involves a (memory) copy

@9214
@GiuseppeChillemi I don't follow, you want to select a block from another block?
GiuseppeChillemi
@GiuseppeChillemi
@9214 select involves a copy, I don't want to copy on selection, I which to access it like it is a: [[a] [b]]
*I wish
@9214

select involves a copy

No, it doesn't.

GiuseppeChillemi
@GiuseppeChillemi
no ?
I supposed it in rebol
@9214
>> block: [a [b c]]
== [a [b c]]
>> append select block 'a 'd
== [b c d]
>> block
== [a [b c d]]
GiuseppeChillemi
@GiuseppeChillemi
so, which is the difference between find/tail and select ?
@9214
I don't recall any series actions doing an explicit copying.
@GiuseppeChillemi select returns a value that follow the key (if any), find/tail searches for the first occurence of a value and returns a series past that value.
GiuseppeChillemi
@GiuseppeChillemi
From REBOL documentation: "Finds a value in the series and returns the value or series after it"
The word "returns" let me think about copying it.
@9214
>> select block 'a
== [b c d]
>> first find/tail block 'a
== [b c d]
@GiuseppeChillemi uhm, no. Again, there's no copying, you can check it yourself.
GiuseppeChillemi
@GiuseppeChillemi
Yes, I see it but I thought it did this.
@9214 So, pick does not copy too...
"pick"
@9214
@GiuseppeChillemi nope, none of the series actions do copying.
GiuseppeChillemi
@GiuseppeChillemi
:-(
And does COPY "COPY" ? :-)
@9214
Yes, obviously.
GiuseppeChillemi
@GiuseppeChillemi
Yes, I have written it just for fun

Another question: is where a way to have a subseries of a bigger one in a static way ?
Example:

a: [a b c d e f g h]

The subseries should be:

b: [d e]

But [d e] are just part of "A"

So if you change the B: to "[z e]"

>>> a
= [a b c z e f g h]
@9214
@GiuseppeChillemi you can store such subseries as a pair of series index and number of elements, and use change/part for mutation.
>> a: [a b c d e f g h]
== [a b c d e f g h]
>> b: reduce [at a 4 2]
== [[d e f g h] 2]
>> head change/part b/1 [z e] b/2
== [a b c z e f g h]
Or:
>> a: [a b c d e f g h]
== [a b c d e f g h]
>> subseries: 4x2
== 4x2
>> head change/part at a subseries/x [z e] subseries/y
== [a b c z e f g h]
GiuseppeChillemi
@GiuseppeChillemi
@9214 If I "Insert" data , will indexes of subseries shift their position to remain in place ?
@9214
@GiuseppeChillemi no, though, you can probably implement such feature with reactors.
Is this the draw dialect's syntax:
1) <optional set-word!>> <command> <arguments>
2) or a block containing 1)
And 1 or 2 may be 0 or more repeated.
Am I right?
Toomas Vooglaid
@toomasv

@nedzadarek If you consider pnly figures, then almost. In addition, optional set-word may also precede the block

view [box draw [b: box 10x10 50x50 c: circle 30x30 30]]
view [box draw [[b: box 10x10 50x50][c: circle 30x30 30]]]
view [box draw [[[[[[[b: box 10x10 50x50]]] circle 30x30 30]]]]]
view [box draw [b: [box 10x10 50x50]]]
view [box draw [b: [b2: box 10x10 50x50]]]
view [box draw [b: b2: b3: box 10x10 50x50]]
view [box draw [b:]]

So, it is more like

<draw-command>: (<command> <arguments> | '['<command> <arguments>']')
<draw-expression>: <set-word>* <draw-command>
<draw>: <draw-expression>*
@toomasv thank you for the response.
A block may contain only set word (your last example: view [box draw [b:]]) so I guess 2nd line should be: <draw-expression>: <set-word>* <draw-command>*.
Are there non-figure elements that does not "use" above rules? I could not find any.
Toomas Vooglaid
@toomasv
@nedzadarek Probably not, although it is worth noting that transformation commands' last argument can be block of drawing commands and in case of push and shapethe only argument should be block!. And in both cases you can't put set-word before the block.
GiuseppeChillemi
@GiuseppeChillemi
This message was deleted
if I have a function that accepts 2 arguments, is there a way to be them provided by the return value of a second one ?
@9214
@GiuseppeChillemi
>> foo: func [x y][x + y]
== func [x y][x + y]
>> bar: does [[1 2]]
== func [][[1 2]]
>> do head insert bar :foo
== 3
In general that would require apply, but you can use tricks similar to the above one.
dsunanda
@dsunanda
If you are happy to use an intermediate word to hold the two results, you can do it like below - using Vladimir's FOO and BAR functions
foo first x: bar x/2
== 3