const int speed = 512;
float t = 1.0F * (System.frameCounter % speed) / speed;

for (int i = 0; i < dreams.length; i++)
{
    int bestValue = 10000000;
    int best = 0;
    pair<int16> dm = Hexgrid.getHexCenter3d(dreams.data[i].x, dreams.data[i].y);
    pair<int16> gr; 
    for (int j = 0; j < groves.length; j++)
    {
        gr = Hexgrid.getHexCenter3d(groves.data[j].x, groves.data[j].y);
        int value = sqr(absv(dm.x - gr.x)) + sqr(absv(dm.y - gr.y));
        if (value < bestValue)
        {
            bestValue = value;
            best = j;
        }
    }

    float t = 1.0F * (((speed / 16D) * i + System.frameCounter) % speed / speed);

    gr = Hexgrid.getHexCenter3d(groves.data[best].x, groves.data[best].y);
    int x = dm.x + t * (gr.x - dm.x) + 64F * t * (1F - t) * trigo(36F * i + 192F * t).x;
    int y = dm.y + t * (gr.y - dm.y) + 0.2F * t * (1F - t) * (gr.y + dm.y) + 32F * t * (1F - t) * trigo(24F * i + 192F * t).y;
    int rad = 3 + 3 * absv(trigo(48F * i + 192F * t).x);
    bitmap.drawCircleLight(x, y, rad, white, 0.5F);
}

//注意:
//从起点(村庄)到终点(树林)的抛物线路径,具有一个小的trigo(正弦)贡献,使梦境动画看起来犹豫,像一只蛾的飞行。