C++ Builder: цветные шарики одним кликом
Ну, любит ребёнок цветные шарики, вот и родилось в свободную минутку. Нарисовать на канве красивый шарик можно примерно вот таким кодом:
const int R=100; //Радиус шарика в пикселах TForm *ptForm = (TForm *)Sender; for (int x=X-R; x<X+R+1; x++) for (int y=Y-R; y<Y+R+1; y++) { int D=Distance (x,y,X,Y); int I =(D<R ? 255-RoundTo(D*255./R,0) : 0); if (I) ptForm->Canvas->Pixels[x][y] = (TColor)RGB (I,I,I); //цвет очередного пиксела }
где Distance
- функция вычисления пиксельного расстояния между двумя точками:
#include <Math.hpp> int __fastcall Distance (int x1,int y1,int x2,int y2) { return RoundTo(Power(Power(x1-x2,2)+Power(y1-y2,2),0.5),0); }
То есть, мы просто делаем интенсивность цвета пиксела обратно пропорциональной расстоянию до центра окружности (X,Y)
.
Цвет формы предполагается чёрным, а шарик
здесь получится серый, если нужны другие цвета, следует по другому закону получать цвет очередного пиксела, например, RGB (I,0,0);
даст красные шары :)
Вот кусочек скриншота приложения:
Рисование цветного шарика
Приложение запускается в полноэкранном режиме.
Левая кнопка мыши - нарисовать шарик,
правая - стереть всё,
Alt+F4
- закрыть приложение.
Нарисовать шарик, "слишком близкий" к уже имеющемуся шарику (пересекающийся с ним) нельзя, вместо рисования раздастся "бип".
Клавиши 1, 2 и 3 (или клики по цифрам 1-2-3 на панельке вверху слева) - включить/выключить красную, синюю и зелёную цветовые компоненты, это позволяет шарику менять цвет. Чтобы не получалось чёрных шариков на чёрном, можно одновременно отключать не больше 2 цветов из трёх. При попытке включить третий цвет - тоже "бип".
Какие цвета включены, а какие отключены, видно как раз на панельке. Там же видно общее число уместившихся на Вашем экране шариков.
Скачать исполняемый файл в архиве .ZIP (234 Кб)
Скачать исходники проекта C++ Builder в архиве .ZIP (4 Кб)
Ну, можно ещё поиграть, кто больше шариков разместит на одном экране :) У меня на "мелком" разрешении экрана 1024x768 навскидку вышло всего 17.
29.10.2013, 23:05 [12148 просмотров]