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);
}
\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);
}
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);
}
Reference
이 문제에 관하여(Processing에서 이중 진자 (Double Pendulum)의 궤적을 그립니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/naoyashiga/items/12dfe6003dd14d8cacd6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)