Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Язык программирования: 
C/C++
Среда программирования: 
Visual Studio 2015

#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
 
 
const int winW = 350; // Ширина окна
const int winH = 350; // Высота окна
 
using namespace std;
 
int main() {
	sf::RenderWindow window(sf::VideoMode(winW, winH), "CMYK-CMYK-CMYK");
 
	sf::Color cl_c(0, 255, 255, 85); //Cyan
	sf::Color cl_m(255, 0, 255, 85); //Magenta
	sf::Color cl_y(255, 255, 0, 85); //Yellow
 
	int radius = 12; // Радиус шарика
 
	vector <sf::CircleShape> all_cir; // Вектор окружностей
 
	for (int i = 0; i < 7; ++i) {
		for (int j = 0; j < 7; ++j) {
			// Создаем по три окружности, каждого цвета.
			sf::CircleShape c1(radius);
			c1.setPosition(sf::Vector2f(50*j, 50*i));
			c1.setFillColor(cl_y);
			all_cir.push_back(c1);
 
			sf::CircleShape c2(radius);
			c2.setPosition(sf::Vector2f(50 * j, 50 * i));
			c2.setFillColor(cl_m);
			all_cir.push_back(c2);
 
			sf::CircleShape c3(radius);
			c3.setPosition(sf::Vector2f(50 * j, 50 * i));
			c3.setFillColor(cl_c);
			all_cir.push_back(c3);
		}
	}
 
 
 
	bool back = 0;
	int distance = 30; // Дистанция, на котору будут разбегаться окружности
	while (1) {
		sf::Event event;
		while (window.pollEvent(event)) {
			// События закрытия окну по клику на крестик и по нажатию Esc
			if (event.type == sf::Event::Closed || event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
				return 0;
		}
 
		window.clear(sf::Color::White); // Очищаем окно
 
		for (int i = 0; i < all_cir.size() - 2; i += 3) {
			if (i % 2 == 0) { // Четные и нечетные окружности двигаются в противоположных направлениях
				if (!back) { 
					sf::Vector2f p = all_cir[i].getPosition();
					all_cir[i].setPosition(p.x, p.y + 0.5); // Движение вверх
					p = all_cir[i + 1].getPosition();
					all_cir[i + 1].setPosition(p.x + 0.5, p.y - 0.5); // Движение вправо и вниз
					p = all_cir[i + 2].getPosition();
					all_cir[i + 2].setPosition(p.x - 0.5, p.y - 0.5); // Движение влево и вверх
				}
				else { // Движение в обратную сторону
					sf::Vector2f p = all_cir[i].getPosition();
					all_cir[i].setPosition(p.x, p.y - 0.5); // Движение вниз
					p = all_cir[i + 1].getPosition();
					all_cir[i + 1].setPosition(p.x - 0.5, p.y + 0.5); // Движение влево и вверх
					p = all_cir[i + 2].getPosition();
					all_cir[i + 2].setPosition(p.x + 0.5, p.y + 0.5); // Движение вправо и вниз
				}
 
			}
			else {
				if (!back) {
					sf::Vector2f p = all_cir[i].getPosition();
					all_cir[i].setPosition(p.x, p.y - 0.5); // Движение вниз
					p = all_cir[i + 1].getPosition();
					all_cir[i + 1].setPosition(p.x - 0.5, p.y + 0.5); // Движение влево и вверх
					p = all_cir[i + 2].getPosition();
					all_cir[i + 2].setPosition(p.x + 0.5, p.y + 0.5); // Движение вправо и вниз
				}
				else {
					sf::Vector2f p = all_cir[i].getPosition();
					all_cir[i].setPosition(p.x, p.y + 0.5);  // Движение вверх
					p = all_cir[i + 1].getPosition();
					all_cir[i + 1].setPosition(p.x + 0.5, p.y - 0.5); // Движение вправо и вниз
					p = all_cir[i + 2].getPosition();
					all_cir[i + 2].setPosition(p.x - 0.5, p.y - 0.5); // Движение влево и вверх
				}
			}
 
		}
		distance--;
		sf::sleep(sf::microseconds(10060)); // Далаем паузу, иначе анимация слишком быстрая
		for (int i = 0; i < all_cir.size(); i++) // Отрисовываем круги
			window.draw(all_cir[i], sf::BlendMultiply); // sf::BlendMultiply - наложение цветов
		window.display(); // Отображаем то, что нарисовали.
 
		if (distance == 0) { // Если отдалились на необходимое расстояние, меняем направление движения
			back = 1 - back;
			distance = 30;
		}
	}
}

Прикрепленный файлРазмер
CMYK dots.zip783.03 кб