I used ne_110m_admin_0_countries.

Rendering updates for the layer at 0.1 seconds.

Geometry Generator for a Point for the marker location via ** line_interpolate_point**:

```
with_variable(
'biggest_geom',
geometry_n(order_parts($geometry, 'area($geometry)', ascending:=False), 1),
line_interpolate_point(
boundary(@biggest_geom),
perimeter(@biggest_geom)*(round(epoch(now())/100)%100/100)
)
)
```

Raster Image Marker with https://opengameart.org/content/character-spritesheet-duck, vertical anchor at bottom, sprite choice between walking and running (doesn’t actually work) plus the frame via

```
with_variable(
'biggest_geom',
geometry_n(order_parts($geometry, 'area($geometry)', ascending:=False), 1),
'/your/path/Duck/Sprites/Walking-Running/'
|| if(perimeter(@biggest_geom) < 10, 'Walking', 'Running')
|| ' 00'
|| to_string(round(epoch(now())/200)%2+1)
|| '.png'
)
```

Rotation did not work, I tried

:**line_interpolate_angle**

```
with_variable(
'biggest_geom',
geometry_n(order_parts($geometry, 'area($geometry)', ascending:=False), 1),
line_interpolate_angle(
boundary(@biggest_geom),
perimeter(@biggest_geom)*(round(epoch(now())/100)%100/100)
)
)
```

Steps via two more Geometry Generators, both for Lines using ** line_substring** and some nice style (inspired by the wonderful built-in

*cat trail*preset):

```
with_variable(
'biggest_geom',
geometry_n(order_parts($geometry, 'area($geometry)', ascending:=False), 1),
line_substring(
boundary(@biggest_geom),
0,
perimeter(@biggest_geom)*(round(epoch(now())/100)%100/100)
)
)
```

Could be improved if (for example) Raster Image Marker would support:

- Choice of resampling algorithm
- Flipping
- Rotation would work, no idea what’s wrong with my expression, it works with random values, so …
- Whatever is broken with the choice between ‘Walking’ and ‘Running’ in the file path expression