/// <summary> /// 問題を設定する /// </summary> /// <returns></returns> private bool setNewProblem() { bool success = false; Console.WriteLine("SetNewProblem() " + ProbNo); try { clearAFix(AFix); clearARB(ARB); CurTime = 0; if( ProbNo == 0 ) { CRigidBody3D rb = new CRigidBody3D(); // Note: DelFEM4Netでは、irb.ini_pos_cgはコピーを取得するプロパティなので、変更したらセットする必要があります。 //rb.ini_pos_cg.SetVector(1.0,0,0); // 変更はrbへは反映されません rb.Set_ini_pos_cg_Vector(1.0, 0, 0); ARB.Add(rb); CFix_Spherical fix = new CFix_Spherical(0); fix.SetIniPosFix(0,0,0); AFix.Add( fix ); } else if( ProbNo == 1 ) { double tot_len = 3.0; uint nRB = 6; double div_len = tot_len / nRB; for (uint irb = 0; irb < nRB; irb++) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(div_len*(irb+1),0,0); ARB.Add(rb); if ( irb == 0 ) { CFix_Spherical fix = new CFix_Spherical(irb); fix.SetIniPosFix(0,0,0); AFix.Add( fix ); } else { CJoint_Spherical fix = new CJoint_Spherical(irb - 1, irb); fix.SetIniPosJoint(div_len * (irb + 0.5), 0, 0); AFix.Add( fix ); } } } else if( ProbNo == 2 ) { { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(1.0, 0, 0); ARB.Add(rb); } { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(1.0, 1, 0); ARB.Add(rb); } { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(2.0, 1, 0); ARB.Add(rb); } { CFix_Hinge fix = new CFix_Hinge(0); fix.SetIniPosFix(0,0,0); fix.SetAxis(0,1,0); AFix.Add( fix ); } { CJoint_Hinge fix = new CJoint_Hinge(0,1); fix.SetIniPosJoint(1,0.5,0); fix.SetAxis(1,0,0); AFix.Add( fix ); } { CJoint_Spherical fix = new CJoint_Spherical(1,2); fix.SetIniPosJoint(1.5,1,0); AFix.Add( fix ); } } else if( ProbNo == 3 ) { double tot_len = 3.0; uint nRB = 3; double div_len = tot_len / nRB; for (uint irb=0; irb <nRB; irb++) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(div_len * (irb + 1), 0, 0); ARB.Add(rb); if ( irb == 0 ) { CFix_Hinge fix = new CFix_Hinge(irb); fix.SetIniPosFix(0,0,0); fix.SetAxis(0.0,0.5,1); AFix.Add( fix ); } else { CJoint_Spherical fix = new CJoint_Spherical(irb-1, irb); fix.SetIniPosJoint(div_len * (irb + 0.5), 0, 0); AFix.Add( fix ); } } } else if( ProbNo == 4 ) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector(1.0, 0, 0); ARB.Add(rb); CFix_HingeRange fix = new CFix_HingeRange(0); fix.SetIniPosFix(0,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,60); AFix.Add( fix ); } else if( ProbNo == 5 ) { uint nRB = 3; // (1.0, 0, 0) // (2.0, 0, 0) // (3.0, 0, 0) for (uint irb = 0; irb < nRB; irb++) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector( (irb + 1) ,0,0); ARB.Add(rb); } { CFix_HingeRange fix = new CFix_HingeRange(0); fix.SetIniPosFix(0,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,60); AFix.Add( fix ); } { CJoint_Hinge fix = new CJoint_Hinge(0,1); fix.SetIniPosJoint(1.5,0,0); fix.SetAxis(0,1,0); AFix.Add( fix ); } { CJoint_Hinge fix = new CJoint_Hinge(1,2); fix.SetIniPosJoint(2.5,0,0); fix.SetAxis(0,1,0); AFix.Add( fix ); } } else if( ProbNo == 6 ) { uint nRB = 2; // (1.0, 0, 0) // (2.0, 0, 0) for (uint irb = 0; irb < nRB; irb++) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector( (irb + 1) ,0,0); ARB.Add(rb); } { CFix_HingeRange fix = new CFix_HingeRange(0); fix.SetRange(-30,35); //CFix_Hinge fix = new CFix_Hinge(0); fix.SetIniPosFix(0,0,0); fix.SetAxis(0,1,0); AFix.Add( fix ); } { CJoint_HingeRange fix = new CJoint_HingeRange(0,1); fix.SetIniPosJoint(1.5,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,30); AFix.Add( fix ); } } else if( ProbNo == 7 ) { uint nRB = 4; // (1.0, 0, 0) // (2.0, 0, 0) // (3.0, 0, 0) // (4.0, 0, 0) for (uint irb = 0; irb < nRB; irb++) { CRigidBody3D rb = new CRigidBody3D(); rb.Set_ini_pos_cg_Vector( (irb + 1) ,0,0); ARB.Add(rb); } { CFix_HingeRange fix = new CFix_HingeRange(0); fix.SetRange(-30,35); //CFix_Hinge fix = new CFix_Hinge(0); fix.SetIniPosFix(0,0,0); fix.SetAxis(0,1,0); AFix.Add( fix ); } { CJoint_HingeRange fix = new CJoint_HingeRange(0,1); fix.SetIniPosJoint(1.5,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,30); AFix.Add( fix ); } { CJoint_HingeRange fix = new CJoint_HingeRange(1,2); fix.SetIniPosJoint(2.5,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,30); AFix.Add( fix ); } { CJoint_HingeRange fix = new CJoint_HingeRange(2,3); fix.SetIniPosJoint(3.5,0,0); fix.SetAxis(0,1,0); fix.SetRange(-30,30); AFix.Add( fix ); } } else if( ProbNo == 8 ) { CRigidBody3D rb = new CRigidBody3D(); // rb.ini_pos_cg等は変更したらセットする必要があります。 rb.Set_ini_pos_cg_Vector(0.3,0.0,1.0); rb.Set_Omega_Vector(0.0, 0.0, 1.0); // rb.Omega.z = 1.0; // rb.mineatiaはDoubleArrayIndexerなので配列要素に代入できます。 rb.mineatia[2] = 10.0; rb.mass = 0.001; ARB.Add(rb); CFix_Spherical fix = new CFix_Spherical(0); fix.SetIniPosFix(0,0,0); AFix.Add( fix ); } success = true; } catch (Exception exception) { Console.WriteLine(exception.Message + " " + exception.StackTrace); } /* Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); DelFEM4NetCom.View.DrawerGlUtility.SetProjectionTransform(Camera); //Glut.glutPostRedisplay(); */ ProbNo++; if (ProbNo == ProbCnt) ProbNo = 0; return success; }
/// <summary> /// 剛体を描画する /// </summary> /// <param name="r"></param> private static void DrawRigidBody(CRigidBody3D r) { uint imode = 1; if ( imode == 0 ) { } else if ( imode == 1 ) { Gl.glPushMatrix(); Gl.glTranslated( r.ini_pos_cg.x + r.disp_cg.x, r.ini_pos_cg.y + r.disp_cg.y, r.ini_pos_cg.z + r.disp_cg.z ); { double[] rot0 = new double[16]; r.GetInvRotMatrix44(ref rot0); Gl.glMultMatrixd(rot0); } Gl.glColor3d(0,0,0); Glut.glutSolidCube(0.2); //Glut.glutSolidTeapot(1.0); //Glut.glutWireTeapot(0.2); //Glut.glutWireOctahederon(); //Glut.glutWireDodecahedron(); Gl.glLineWidth(1); Gl.glBegin(Gl.GL_LINES); Gl.glColor3d(1,0,0); Gl.glVertex3d(0,0,0); Gl.glVertex3d(0.4,0,0); Gl.glColor3d(0,1,0); Gl.glVertex3d(0,0,0); Gl.glVertex3d(0,0.4,0); Gl.glColor3d(0,0,1); Gl.glVertex3d(0,0,0); Gl.glVertex3d(0,0,0.4); Gl.glEnd(); Gl.glPopMatrix(); } }