Processing:Примеры/Пружина
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Описание[1]
Нажмите на серый прямоугольник («шапку» пружины), потяните его вниз/вверх и отпустите. В результате графические объекты на экране начнут вести себя как пружина.
Пример
// константы для отрисовки «шапки» пружины:
int springHeight = 32; // высота
int left; // левый край
int right; // правый край
int max = 200; // максимальное значение по оси Y
int min = 100; // минимальное значение по оси Y
boolean over = false; // курсор над «шапкой»?
boolean move = false; // курсор над «шапкой» и нажата кнопка мыши?
// константы для симуляции пружины:
float M = 0.8; // масса
float K = 0.2; // константа пружины
float D = 0.92; // коэффициент затухания
float R = 150; // положение покоя
// переменные для симуляции пружины:
float ps = R; // позиция
float vs = 0.0; // скорость
float as = 0; // ускорение
float f = 0; // сила
void setup() {
size(640, 360);
rectMode(CORNERS);
noStroke();
left = width/2 - 100;
right = width/2 + 100;
}
void draw() {
background(102);
updateSpring();
drawSpring();
}
void drawSpring() {
// рисуем базовый элемент:
fill(0.2);
float baseWidth = 0.5 * ps + -8;
rect(width/2 - baseWidth, ps + springHeight, width/2 + baseWidth, height);
// задаем цвет и рисуем «шапку»:
if(over || move) {
fill(255);
} else {
fill(204);
}
rect(left, ps, right, ps + springHeight);
}
void updateSpring() {
// обновляем позицию пружины:
if(!move) {
f = -K * (ps - R); // f=-ky
as = f / M; // задаем ускорение, f=ma == a=f/m
vs = D * (vs + as); // задаем скорость
ps = ps + vs; // обновляем позицию
}
if(abs(vs) < 0.1) {
vs = 0.0;
}
// проверяем, находится ли курсор над «шапкой» пружины:
if(mouseX > left && mouseX < right && mouseY > ps && mouseY < ps + springHeight) {
over = true;
} else {
over = false;
}
// задаем позицию «шапки»
// и ограничиваем диапазон значений для ее позиции:
if(move) {
ps = mouseY - springHeight/2;
ps = constrain(ps, min, max);
}
}
void mousePressed() {
if(over) {
move = true;
}
}
void mouseReleased() {
move = false;
}
См.также
Внешние ссылки
Примеры на Processing | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |