Если вы просто хотите нарисовать несколько строк, используйте for
l oop. Вычислить координату y
вершины строки в зависимости от управляющей переменной (i
) переменной l oop. например, y = ps + springDist * i;
:
например, 3 строки:
let springDist = 40.0;
function drawWire() {
for (let i = 0; i < 3; ++i) {
let y = ps + springDist * i;
rect(left, y, right, y+springHeight);
}
}
Конечно, вы должны проверить, является ли мышь over
любой из строк, и указать (move_i
), что строка «трогается»:
let move_i = 0;
function updateSpring() {
// [...]
// Test if mouse if over the top bar
over = false;
for (let i = 0; i < 3; ++i) {
let y = ps + springDist * i;
if (mouseX > left && mouseX < right && mouseY > y && mouseY < y + springHeight) {
over = true;
move_i = i;
}
}
// Set and constrain the position of top bar
if (move) {
ps = mouseY - springHeight / 2 - move_i * springDist;
ps = constrain(ps, minHeight, maxHeight);
}
}
Если вы хотите переместить каждую строку по отдельности, вам нужно создать список объектов :
let strings = [];
function setup() {
// [...]
for (let i = 0; i < 3; ++i) {
let ps = R + springDist * i;
strings.push({ps : ps, vs : 0.0, as : 0, f : 0, R : ps})
}
}
Нарисуйте объекты:
function drawWire() {
for (let i = 0; i < strings.length; ++i) {
let y = strings[i].ps;
rect(left, y, right, y+springHeight);
}
}
Обновите объекты в al oop и переместите отдельный перетаскиваемый объект (move_i
):
function updateSpring() {
// Update the spring position
for (let i = 0; i < strings.length; ++i) {
let st = strings[i];
if ( i != move_i || !move ) {
st.f = -K * ( st.ps - st.R ); // f=-ky
st.as = st.f / M; // Set the acceleration, f=ma == a=f/m
st.vs = D * (st.vs + st.as); // Set the velocity
st.ps = st.ps + st.vs; // Updated position
}
if (abs(st.vs) < 0.1) {
st.vs = 0.0;
}
}
// Test if mouse if over the top bar
over = false;
for (let i = 0; i < strings.length; ++i) {
let y = strings[i].ps
if (mouseX > left && mouseX < right && mouseY > y && mouseY < y + springHeight) {
over = true;
move_i = i;
}
}
// Set and constrain the position of top bar
if (move) {
strings[move_i].ps = mouseY - springHeight / 2;
strings[move_i].ps = constrain(strings[move_i].ps, minHeight, maxHeight);
}
}
См. Пример:
// Spring drawing constants for top bar
let springHeight = 19,
springDist = 40,
left,
right,
maxHeight = 300,
minHeight = 0,
over = false,
move = false;
move_i = 0;
// Spring simulation constants
let M = 0.8, // Mass
K = 0.2, // Spring constant
D = 0.92, // Damping
R = 180; // Rest position
// Spring simulation variables
let strings = [];
function setup() {
createCanvas(710, 400);
rectMode(CORNERS);
// rectMode(CORNER);
c = color('rgb(255,233,234)');
fill(c);
noStroke();
left = width / 2 - 400;
right = width / 2 + 400;
for (let i = 0; i < 3; ++i) {
let ps = R + springDist * i;
strings.push({ps : ps, vs : 0.0, as : 0, f : 0, R : ps})
}
}
function draw() {
background(102);
updateSpring();
drawWire();
}
function drawWire() {
for (let i = 0; i < strings.length; ++i) {
let y = strings[i].ps;
rect(left, y, right, y+springHeight);
}
}
function updateSpring() {
// Update the spring position
for (let i = 0; i < strings.length; ++i) {
let st = strings[i];
if ( i != move_i || !move ) {
st.f = -K * ( st.ps - st.R ); // f=-ky
st.as = st.f / M; // Set the acceleration, f=ma == a=f/m
st.vs = D * (st.vs + st.as); // Set the velocity
st.ps = st.ps + st.vs; // Updated position
}
if (abs(st.vs) < 0.1) {
st.vs = 0.0;
}
}
// Test if mouse if over the top bar
over = false;
for (let i = 0; i < strings.length; ++i) {
let y = strings[i].ps
if (mouseX > left && mouseX < right && mouseY > y && mouseY < y + springHeight) {
over = true;
move_i = i;
}
}
// Set and constrain the position of top bar
if (move) {
strings[move_i].ps = mouseY - springHeight / 2;
strings[move_i].ps = constrain(strings[move_i].ps, minHeight, maxHeight);
}
}
function mousePressed() {
if (over) {
move = true;
}
}
function mouseReleased() {
move = false;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>