Processing에서 이중 진자 (Double Pendulum)의 궤적을 그립니다.

11469 단어 processing


이중 진자는 혼돈 운동을하는 것으로 알려져 있습니다. 그 궤적을 Processing으로 쓰면 아름답다.

단 진자를 만드는 법



The Nature of Code 「3.9 Trigonometry and Forces: The Pendulum」을 읽자.
ht tp // // 나츠레오 f 여기. 코 m / 보오 k / 챠 p r-3-s s chichion /

이중 진자의 가속도


\theta_1'' = \frac{-g(2m_1 + m_2){\sin \theta_1} - m_2g{\sin (\theta_1 - 2\theta_2) -2{\sin (\theta_1 - \theta_2)}}m_2(\theta_2'^2L_2+\theta_1'^2L_1{\cos(\theta_1 - \theta_2))}}{L_1(2m_1+m_2-m_2{\cos(2\theta_1 - 2\theta_2))}}
\theta_2'' = \frac{2{\sin (\theta_1 - \theta_2)(\theta_1'^2L_1(m_1+m_2)+g(m_1+m_2){\cos \theta_1}}+\theta_2'^2L_2m_2{\cos(\theta_1 - \theta_2))}}{L_2(2m_1+m_2-m_2{\cos(2\theta_1 - 2\theta_2))}}

이중 진자의 가속도는 위와 같은 에그 수식으로 표현됩니다.

부모 진자



안쪽 진자를 부모로 한다.

각속도



각도의 1회 미분이 각속도가 되는 것에 주의한다.
float alpha = -gravity * (2 * mass1 + mass2) * sin(angle)-mass2 * gravity * sin(angle - 2 * childAngle) - 2 * sin(angle - childAngle) * mass2 *(childAngleVelocity * childAngleVelocity * l2 + angleVelocity * angleVelocity * l1 * cos(angle - childAngle));

float beta = l1 * (2 * mass1 + mass2 - mass2 * cos(2 * angle - 2 * childAngle));

angleAcceleration = alpha / beta;

각도 구하기


angleVelocity += angleAcceleration;
angle += angleVelocity;

아이 진자



외부 진자를 자식이라고합니다.

각속도


float gunnma = 2 * sin(angle - childAngle) * (angleVelocity * angleVelocity * l1 *(mass1 + mass2) + gravity * (mass1 + mass2) * cos(angle) + childAngleVelocity * childAngleVelocity * l2 * mass2 * cos(angle - childAngle));

float phai = l2 * (2 * mass1 + mass2 - mass2 * cos(2 * angle - 2 * childAngle));


childAngleAcceleration = gunnma / phai;

각도 구하기


childAngleVelocity += childAngleAcceleration;
childAngle += childAngleVelocity;

그리기


void display() {
 // 親の振り子
  location.set(l1 * sin(angle), l1 * cos(angle), 0);

  location.add(origin);

  translate(0, height / 3);
  float c = map(location.x,0, width, 0, 255);
  stroke(96, 230,c);
  fill(255);


  line(origin.x, origin.y, location.x, location.y);
  ellipse(location.x, location.y, mass1 * 3, mass1 * 3);

  // 子の振り子
  childLocation = location.get();
  childLocation.add(l2 * sin(childAngle), l2 * cos(childAngle));

  line(location.x, location.y, childLocation.x, childLocation.y);
  ellipse(childLocation.x, childLocation.y, mass2 * 3, mass2 * 3);
  // ellipse(childLocation.x, childLocation.y, 1, 1);
}
  • 참고
  • h tp // w w. myphy와 cs b. 이 m/dbl_펜즈ぅm. HTML

  • 좋은 웹페이지 즐겨찾기