WedX - журнал о программировании и компьютерных науках

Как переработать формулу ускорения для двойного маятника при взаимодействии с мышью

Мне нужно, чтобы функция mousePressed() двигала весь маятник в пределах его длины (r1 и r2 = 200). Строки 32-44 нужно изменить в зависимости от функции mousePressed.

У меня есть код для одного маятника, который использует PGraphics с функцией, которая работает так, как я хочу. Он использует длину маятника как максимальное перемещение шара на конце. Мне нужно перевести это в двойной маятник, который учитывает две длины вместо одной. После запуска программы некоторое время трассируемая линия ограничивается кругом с радиусом, равным сумме переменной r (400)

void drag() {
// If we are draging the ball, we calculate the angle between the 
// pendulum origin and mouse position
// we assign that angle to the pendulum
if (dragging) {
  PVector diff = PVector.sub(origin, new PVector(mouseX, mouseY));      // Difference between 2 points
  angle = atan2(-1*diff.y, diff.x) - radians(90);                      // Angle relative to vertical axis
}

} }

float r1 = 200;
float r2 = 200;
float m1 = 40;
float m2 = 40;
float a1 = PI/2;
float a2 = PI/2;
float a1_v = 0;
float a2_v = 0;
float g = 1;

float px2 = -1;
float py2 = -1;
float cx, cy;

PGraphics canvas;

void setup() {
  size(1024, 768);
  cx = width/2;
  cy = 200;
  canvas = createGraphics(width, height);
  canvas.beginDraw();
  canvas.background(255);
  canvas.endDraw();
}

void draw() {
  background(255);
  imageMode(CORNER);
  image(canvas, 0, 0, width, height);

  float num1 = -g * (2 * m1 + m2) * sin(a1);
  float num2 = -m2 * g * sin(a1-2*a2);
  float num3 = -2*sin(a1-a2)*m2;
  float num4 = a2_v*a2_v*r2+a1_v*a1_v*r1*cos(a1-a2);
  float den = r1 * (2*m1+m2-m2*cos(2*a1-2*a2));
  float a1_a = (num1 + num2 + num3*num4) / den;

  num1 = 2 * sin(a1-a2);
  num2 = (a1_v*a1_v*r1*(m1+m2));
  num3 = g * (m1 + m2) * cos(a1);
  num4 = a2_v*a2_v*r2*m2*cos(a1-a2);
  den = r2 * (2*m1+m2-m2*cos(2*a1-2*a2));
  float a2_a = (num1*(num2+num3+num4)) / den;

  translate(cx, cy);
  stroke(0);
  strokeWeight(2);

  float x1 = r1 * sin(a1);
  float y1 = r1 * cos(a1);

  float x2 = 0;
  float y2 = 0;

  if(mousePressed){
    x2 = mouseX - cx;
    y2 = mouseY - cy;
  }else{
    x2 = x1 + r2 * sin(a2);
    y2 = y1 + r2 * cos(a2);  
  }

  line(0, 0, x1, y1);
  fill(0);
  ellipse(x1, y1, m1, m1);

  line(x1, y1, x2, y2);
  fill(0);
  ellipse(x2, y2, m2, m2);

  a1_v += a1_a;
  a2_v += a2_a;
  a1 += a1_v;
  a2 += a2_v;

  // a1_v *= 0.99;
  // a2_v *= 0.99;

  canvas.beginDraw();
  //canvas.background(0, 1);
  canvas.translate(cx, cy);
  canvas.stroke(0);
  if (frameCount > 1) {
    canvas.line(px2, py2, x2, y2);
   }
  canvas.endDraw();


  px2 = x2;
  py2 = y2;
}
21.01.2019

  • разве ты не имел в виду Java вместо Javascript? Они (абсолютно) не одинаковы 21.01.2019
  • Какой у Вас вопрос? 21.01.2019
  • @ Генри Мне нужно переработать физику, чтобы функция нажатия мыши реалистично перемещала второй маятник. На данный момент он помещает второй круг в положение мыши независимо от значения r2 (он должен оставаться на уровне 200, как металлический стержень или что-то в этом роде, но при нажатии мыши он изменяется как переменная и действует как кусок резины). Также симуляция продолжается, как если бы второй круг никогда не перемещался, но должен. Функция mousepressed должна учитывать длину r1 и r2 и делать второй круг положением мыши, используя прямые линии маятника. 22.01.2019
  • Как насчет того, чтобы использовать положение мыши в качестве источника гравитации и добавить соответствующий коэффициент силы ко всем объектам, пока нажата кнопка? 22.01.2019
  • @LutzL Будет ли это работать, изменив значение переменной гравитации, которое у меня уже есть, или полностью используя другую переменную? Также как это повлияет на круги, не затрагивая ничего другого в маятнике. Я хочу, чтобы затрагивались только движущиеся части, такие вещи, как начальная точка и линии между кругами, не должны двигаться. 24.01.2019

Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]