千家信息网

C++如何实现旋转蛇错觉效果

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,小编给大家分享一下C++如何实现旋转蛇错觉效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!"旋转蛇"错觉绘制错觉图片,使静止的圆盘看起来有在转动的错觉绘制扇形函数solidpie(
千家信息网最后更新 2024年12月12日C++如何实现旋转蛇错觉效果

小编给大家分享一下C++如何实现旋转蛇错觉效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

"旋转蛇"错觉

绘制错觉图片,使静止的圆盘看起来有在转动的错觉

绘制扇形

函数solidpie(left, top, right, bottom, stangle, endangle)可以绘制无边框的填充扇形。其中(left, top)、(right, bottom)为扇形对应圆的外切矩形的左上角、右下角坐标,stangle、endangle为扇形的起始角、终止角(单位为弧度)

#include #include #include int main(){        float PI = 3.14159;        initgraph(600, 600);        int centerX = 300;        int centerY = 300;        int radius = 200;        circle(centerX, centerY, radius);                   // 画出对应的圆边框        int left = centerX - radius;                        // 圆外切矩形左上角x坐标        int top = centerY - radius;                         // 圆外切矩形左上角y坐标        int right = centerX + radius;                       // 圆外切矩形右下角x坐标        int bottom = centerY + radius;                      // 圆外切矩形右下角y坐标        solidpie(left, top, right, bottom, PI / 6, PI / 3); // 画出填充扇形        _getch();        closegraph();        return 0;}

RGB颜色模型

EasyX可以设定绘图颜色:

setbkcolor(WHITE);                                  // 设置背景颜色为白色setlinecolor(RED);                                  // 设置线条颜色为红色setfillcolor(GREEN);                                // 设置填充颜色为绿色cleardevice();                                      // 以背景颜色清空画布

也可以采用数字形式:

setbkcolor(RGB(255, 255, 255));                                  // 设置背景颜色为白色setlinecolor(RGB(255, 0, 0));                                  // 设置线条颜色为红色setfillcolor(RGB(0, 255, 0));                                // 设置填充颜色为绿色

绘制一组扇形单元

人脑处理高对比度颜色(如黑和白)的时间,要比处理低对比度颜色(如红与青)短很多。我们会先感知到黑白图案,后感知到红青图案,这个时间差会让图片产生相对运动的效果,所以我们会有图片的错觉

为了进一步强化这种错觉,我们让每个黑、白扇形的角度为PI/60,红、青扇形的角度为PI/30。一组青、白、红、黑扇形角度和为PI/10,逆时针依次绘制20组单元

#include #include #include int main(){        float PI = 3.14159;        initgraph(600, 600);        setbkcolor(RGB(128, 128, 128));                                  // 设置背景颜色为白色        cleardevice();                                      // 以背景颜色清空画布        int centerX = 300;        int centerY = 300;        int radius = 200;        int left = centerX - radius;                        // 圆外切矩形左上角x坐标        int top = centerY - radius;                         // 圆外切矩形左上角y坐标        int right = centerX + radius;                       // 圆外切矩形右下角x坐标        int bottom = centerY + radius;                      // 圆外切矩形右下角y坐标        int i;        float offset;        for (i = 0; i < 20; i++)        {                offset = i * PI / 10;                setfillcolor(RGB(0, 240, 220)); // 青色                solidpie(left, top, right, bottom, offset, 2 * PI / 60 + offset);                setfillcolor(RGB(255, 255, 255)); // 白色                solidpie(left, top, right, bottom, 2 * PI / 60 + offset, 3 * PI / 60 + offset);                setfillcolor(RGB(200, 0, 0)); // 红色                solidpie(left, top, right, bottom, 3 * PI / 60 + offset, 5 * PI / 60 + offset);                setfillcolor(RGB(0, 0, 0)); // 黑色                solidpie(left, top, right, bottom, 5 * PI / 60 + offset, 6 * PI / 60 + offset);        }        _getch();        closegraph();        return 0;}

循环嵌套

利用双重for循环语句,可以绘制出多层圆盘。先绘制半径大的,在绘制半径小的覆盖。不同半径的扇形之间有PI/20的角度偏移量。另外,对圆心坐标进行循环遍历就可以实现多个圆盘效果

#include #include #include int main(){        float PI = 3.14159;        initgraph(1200, 800);        setbkcolor(RGB(128, 128, 128));                                                                     // 设置背景颜色为灰色        cleardevice();        int centerX, centerY;        int radius;        int i;        float offset;        float totalOffset = 0;                                                                              // 不同半径之间的角度偏移量                for (centerX = 200; centerX < 1200; centerX += 400)        {                for (centerY = 200; centerY < 800; centerY += 400)                {                        for (radius = 200; radius > 0; radius -= 50)                        {                                int left = centerX - radius;                                int top = centerY - radius;                                int right = centerX + radius;                                int bottom = centerY + radius;                                for (i = 0; i < 20; i++)                                {                                        offset = i * PI / 10 + totalOffset;                                        setfillcolor(RGB(0, 240, 220));                                                    // 青色                                        solidpie(left, top, right, bottom, offset, 2 * PI / 60 + offset);                                        setfillcolor(RGB(255, 255, 255));                                                  // 白色                                        solidpie(left, top, right, bottom, 2 * PI / 60 + offset, 3 * PI / 60 + offset);                                        setfillcolor(RGB(200, 0, 0));                                                      // 红色                                        solidpie(left, top, right, bottom, 3 * PI / 60 + offset, 5 * PI / 60 + offset);                                        setfillcolor(RGB(0, 0, 0));                                                        // 黑色                                        solidpie(left, top, right, bottom, 5 * PI / 60 + offset, 6 * PI / 60 + offset);                                }                                totalOffset += PI / 20;                                                                // 不同半径间角度偏移                        }                }        }        _getch();        closegraph();        return 0;}

HSV颜色模型

HSV是一种根据颜色的直观特性创建的颜色模型。H是Hue的首字母,表示色调,取值范围为0360,刻画不同色彩;S是Saturation的首字母,表示饱和度,取值范围为01,表示混合了白色的比例,值越高颜色越鲜艳;V是Value的首字母,表示明度,取值范围为0~1,等于0时为黑色,等于1时最明亮

#include #include #include int main(){        float PI = 3.14159;        initgraph(600, 600);        setbkcolor(RGB(255, 255, 255));        cleardevice();        int centerX = 300;        int centerY = 300;        int radius = 200;        int left = centerX - radius;        int top = centerY - radius;        int right = centerX + radius;        int bottom = centerY + radius;        int i;        int step = 10;        COLORREF color;        for (i = 0; i < 360; i += step)        {                color = HSVtoRGB(i, 1, 1);  // HSV设置的颜色                setfillcolor(color);                solidpie(left, top, right, bottom, i * PI / 180, (i + step) * PI / 180);        }        _getch();        return 0;}

按键切换效果

利用while循环和_getch()函数,可以实现每次按键后,重新生成随机颜色。另外,利用srand()函数对随机函数初始化,避免每次运行的随机颜色都一样

#include #include #include #include int main(){        float PI = 3.14159;        initgraph(800, 600);        setbkcolor(RGB(128, 128, 128));                                                                     // 设置背景颜色为灰色        cleardevice();        srand(time(0));                                                                                     // 随机种子函数        int centerX, centerY;        int radius;        int i;        float offset;        float totalOffset;                                                                              // 不同半径之间的角度偏移量        while (1)        {                for (centerX = 100; centerX < 800; centerX += 200)                {                        for (centerY = 100; centerY < 600; centerY += 200)                        {                                totalOffset = 0;                                                                           // 同一半径内各组扇形之间的角度偏移量                                float h = rand() % 180;                                                                    // 随机色调                                COLORREF color1 = HSVtoRGB(h, 0.9, 0.8);                                                   // 色调1生成的颜色1                                COLORREF color2 = HSVtoRGB(h + 180, 0.9, 0.8);                                             // 色调2生成的颜色2                                for (radius = 100; radius > 0; radius -= 20)                                {                                        int left = centerX - radius;                                        int top = centerY - radius;                                        int right = centerX + radius;                                        int bottom = centerY + radius;                                        for (i = 0; i < 20; i++)                                        {                                                offset = i * PI / 10 + totalOffset;                                                setfillcolor(color1);                                                    // 青色                                                solidpie(left, top, right, bottom, offset, 2 * PI / 60 + offset);                                                setfillcolor(RGB(255, 255, 255));                                                  // 白色                                                solidpie(left, top, right, bottom, 2 * PI / 60 + offset, 3 * PI / 60 + offset);                                                setfillcolor(color2);                                                      // 红色                                                solidpie(left, top, right, bottom, 3 * PI / 60 + offset, 5 * PI / 60 + offset);                                                setfillcolor(RGB(0, 0, 0));                                                        // 黑色                                                solidpie(left, top, right, bottom, 5 * PI / 60 + offset, 6 * PI / 60 + offset);                                        }                                        totalOffset += PI / 20;                                                                // 不同半径间角度偏移                                }                        }                }                _getch();        }        closegraph();        return 0;}

看完了这篇文章,相信你对"C++如何实现旋转蛇错觉效果"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

0