Marcus -> Programmando cose inutili

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
Ecco cosa succede se si ammassano 250 di quei cubi e si setta qualche parametro a random... xD

tte6lRG.gif


CSS:
Matrix2DClient::Matrix2DClient(HINSTANCE instance, std::wstring caption, float clientWidth, float clientHeight)
    :D2DApp(instance, caption, clientWidth, clientHeight), mOriginX{ 0 }, mOriginY{ 0 }
{
    std::array<std::array<float, 3>, 9> tempCubePoint = {
        -70.82,   -112.90,   -40.75,//0
        -0.34 ,   -170.82,      0.2,//1
        0.11,   -112.90,    81.71,//2
        -70.59,    -54.97,    40.75,//3
        0.34,      2.38,     -0.2,//4
        0.11,    -55.54,   -81.71,//5
        70.59,   -113.46,   -40.75,//6
        70.82,    -55.54,    40.75, //7
        1,1,1
    };

    cubePoint = tempCubePoint;
    //cubes is an array of 250 cubes
    for (auto& c : cubes) { c = tempCubePoint; }
}

void Matrix2DClient::Draw()
{
    static D2D1_COLOR_F clearColor = D2D1::ColorF(0.34f, 0.39f, 0.4f, 1.0f);
    mRenderTarget->Clear(clearColor);
    makeGrid(100, 45.f);

    static float constRotation;
    constRotation += constRotation + 1.7 < 360 ? 1.7 : -constRotation;

    float RX[3][3] = { 1     ,      0     ,     0     ,

                         0       ,cos(rad(constRotation)) ,sin(rad(constRotation)),

                         0     ,-sin(rad(constRotation)),cos(rad(constRotation))
    };

    float RY[3][3] = { cos(rad(constRotation)),     0     ,-sin(rad(constRotation)),

                               0      ,             1     ,           0            ,

                       sin(rad(constRotation)),     0,      cos(rad(constRotation))
    };

    float RZ[3][3] = { cos(rad(0)),  sin(rad(0)),  0,

                      -sin(rad(0)),  cos(rad(0)),  0,

                             0        ,         0       ,  1
    };

    for (size_t c = 0; c < cubes.size(); c++)
    {
        std::array<std::array<float, 3>, 3> finalMatrix = mBasisVectors;
        std::array<std::array<float, 3>, 3> intermediateMatrix1 = mBasisVectors;
        std::array<std::array<float, 3>, 3> intermediateMatrix2 = mBasisVectors;


        //rotate on axis X  (basisVectors x RotationX) = intermediateMatrix1
        for (size_t i = 0; i < 3; i++)
        {
            for (size_t j = 0; j < 3; j++)
            {
                float sum = 0;
                for (size_t k = 0; k < 3; k++)
                {
                    sum += mBasisVectors[i][k] * RX[k][j];
                }
                intermediateMatrix1[i][j] = sum;
            }
        }

        //add scale
        static float size = 0.02f;
        static int sign = 1;
        if (c == 0)
        {
            float increase = 0.0012f;
            if (size + increase*sign > 0.02f || size + increase*sign < 0.01f) { sign *= -1; }
            size += increase*sign;
        }

        intermediateMatrix1[0][0] = intermediateMatrix1[0][0] * size*(((c + 1))/2);
        intermediateMatrix1[1][1] = intermediateMatrix1[1][1] * size*(((c + 1))/2);
        intermediateMatrix1[2][2] = intermediateMatrix1[2][2] * size*(((c + 1))/2);



        //rotate on axis Y (intermediateMatrix1 x RotationY) = intermediateMatrix2
        for (size_t i = 0; i < 3; i++)
        {
            for (size_t j = 0; j < 3; j++)
            {
                float sum = 0;
                for (size_t k = 0; k < 3; k++)
                {
                    sum += intermediateMatrix1[i][k] * RY[k][j];
                }
                intermediateMatrix2[i][j] = sum;
            }
        }


        //rotate on axis Z (intermediateMatrix2 x RotationZ) = finalMatrix
        for (size_t i = 0; i < 3; i++)
        {
            for (size_t j = 0; j < 3; j++)
            {
                float sum = 0;
                for (size_t k = 0; k < 3; k++)
                {
                    sum += intermediateMatrix2[i][k] * RZ[k][j];
                }
                finalMatrix[i][j] = sum;
            }
        }
        //for every point, apply the rotation finalMatrix

        for (size_t i = 0; i < cubePoint.size(); i++)
        {
            cubes[c][i][0] = cubePoint[i][0] * finalMatrix[0][0] + cubePoint[i][1] * finalMatrix[0][1] + cubePoint[i][2] * finalMatrix[0][2];//X
            cubes[c][i][1] = cubePoint[i][0] * finalMatrix[1][0] + cubePoint[i][1] * finalMatrix[1][1] + cubePoint[i][2] * finalMatrix[1][2];//Y
            cubes[c][i][2] = cubePoint[i][0] * finalMatrix[2][0] + cubePoint[i][1] * finalMatrix[2][1] + cubePoint[i][2] * finalMatrix[2][2];//Z
            cubes[c][8][0] = abs(size*(c / 2)); //color
            cubes[c][8][1] = abs(size*(c / 2)); //color
            cubes[c][8][2] = abs(size*(c / 2)); //color
        }
    }


    //draw cube
    for (size_t c = 0; c < cubes.size(); c++)
    {
        mBrush->SetColor(D2D1::ColorF(sin(rad(cubes[c][1][1]*2)), cos(rad(cubes[c][0][0])) , cos(rad(cubes[c][0][0])), 1.f));
        float strokeSize = 2.f;
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), mBrush, strokeSize);
        mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), mBrush, strokeSize);
    }
}
 
M

Mursey

Ospite
Scherzi a parte in quelle demo ci sono ottimi esempi di elaborazione di solidi in 3D.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili