UGears.pas
上传用户:zkjn0718
上传日期:2021-01-01
资源大小:776k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UGears;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TGears = class(TTester)
  8.    public
  9.       m_joint1, m_joint2: Tb2RevoluteJoint;
  10.       m_joint3: Tb2PrismaticJoint;
  11.       m_joint4, m_joint5: Tb2GearJoint;
  12.       constructor Create; override;
  13.       procedure Step(var settings: TSettings; timeStep: Float); override;
  14.    end;
  15. implementation
  16. { TGears }
  17. constructor TGears.Create;
  18. var
  19.    ground, body1, body2, body3: Tb2Body;
  20.    bd, bd1, bd2, bd3: Tb2BodyDef;
  21.    sd: Tb2PolygonDef;
  22.    circle1, circle2: Tb2CircleDef;
  23.    box: Tb2PolygonDef;
  24.    jd1, jd2: Tb2RevoluteJointDef;
  25.    jd3: Tb2PrismaticJointDef;
  26.    jd4, jd5: Tb2GearJointDef;
  27. begin
  28.    inherited;
  29.    bd := Tb2BodyDef.Create;
  30.    {$IFDEF OP_OVERLOAD}
  31.    bd.position.SetValue(0.0, -10.0);
  32.    {$ELSE}
  33.    SetValue(bd.position, 0.0, -10.0);
  34.    {$ENDIF}
  35.    ground := m_world.CreateBody(bd);
  36.    sd := Tb2PolygonDef.Create;
  37.    sd.SetAsBox(50.0, 10.0);
  38.    ground.CreateShape(sd);
  39.    circle1 := Tb2CircleDef.Create;
  40.    circle1.radius := 1.0;
  41.    circle1.density := 5.0;
  42.    circle2 := Tb2CircleDef.Create;
  43.    circle2.radius := 2.0;
  44.    circle2.density := 5.0;
  45.    box := Tb2PolygonDef.Create;
  46.    box.SetAsBox(0.5, 5.0);
  47.    box.density := 5.0;
  48.    bd1 := Tb2BodyDef.Create;
  49.    {$IFDEF OP_OVERLOAD}
  50.    bd1.position.SetValue(-3.0, 12.0);
  51.    {$ELSE}
  52.    SetValue(bd1.position, -3.0, 12.0);
  53.    {$ENDIF}
  54.    body1 := m_world.CreateBody(bd1);
  55.    body1.CreateShape(circle1, False);
  56.    body1.SetMassFromShapes;
  57.    jd1 := Tb2RevoluteJointDef.Create;
  58.    jd1.body1 := ground;
  59.    jd1.body2 := body1;
  60.    jd1.localAnchor1 := ground.GetLocalPoint(bd1.position);
  61.    jd1.localAnchor2 := body1.GetLocalPoint(bd1.position);
  62.    jd1.referenceAngle := body1.GetAngle - ground.GetAngle;
  63.    m_joint1 := Tb2RevoluteJoint(m_world.CreateJoint(jd1));
  64.    bd2 := Tb2BodyDef.Create;
  65.    {$IFDEF OP_OVERLOAD}
  66.    bd2.position.SetValue(0.0, 12.0);
  67.    {$ELSE}
  68.    SetValue(bd2.position, 0.0, 12.0);
  69.    {$ENDIF}
  70.    body2 := m_world.CreateBody(bd2);
  71.    body2.CreateShape(circle2, False);
  72.    body2.SetMassFromShapes;
  73.    jd2 := Tb2RevoluteJointDef.Create;
  74.    jd2.Initialize(ground, body2, bd2.position);
  75.    m_joint2 := Tb2RevoluteJoint(m_world.CreateJoint(jd2));
  76.    bd3 := Tb2BodyDef.Create;
  77.    {$IFDEF OP_OVERLOAD}
  78.    bd3.position.SetValue(2.5, 12.0);
  79.    {$ELSE}
  80.    SetValue(bd3.position, 2.5, 12.0);
  81.    {$ENDIF}
  82.    body3 := m_world.CreateBody(bd3);
  83.    body3.CreateShape(box);
  84.    body3.SetMassFromShapes;
  85.    jd3 := Tb2PrismaticJointDef.Create;
  86.    jd3.Initialize(ground, body3, bd3.position, MakeVector(0.0, 1.0));
  87.    jd3.lowerTranslation := -5.0;
  88.    jd3.upperTranslation := 5.0;
  89.    jd3.enableLimit := True;
  90.    m_joint3 := Tb2PrismaticJoint(m_world.CreateJoint(jd3));
  91.    jd4 := Tb2GearJointDef.Create;
  92.    jd4.body1 := body1;
  93.    jd4.body2 := body2;
  94.    jd4.joint1 := m_joint1;
  95.    jd4.joint2 := m_joint2;
  96.    jd4.ratio := circle2.radius / circle1.radius;
  97.    m_joint4 := Tb2GearJoint(m_world.CreateJoint(jd4));
  98.    jd5 := Tb2GearJointDef.Create;
  99.    jd5.body1 := body2;
  100.    jd5.body2 := body3;
  101.    jd5.joint1 := m_joint2;
  102.    jd5.joint2 := m_joint3;
  103.    jd5.ratio := -1.0 / circle2.radius;
  104.    m_joint5 := Tb2GearJoint(m_world.CreateJoint(jd5));
  105.    circle1.Free;
  106.    circle2.Free;
  107. end;
  108. procedure TGears.Step(var settings: TSettings; timeStep: Float);
  109. var
  110.    value: Float;
  111. begin
  112.    inherited;
  113.    value := m_joint1.GetJointAngle + m_joint4.GetRatio * m_joint2.GetJointAngle;
  114.    DrawText(Format('theta1 + %4.2f * theta2 := %4.2f', [m_joint4.GetRatio, value]));
  115.    value := m_joint2.GetJointAngle + m_joint5.GetRatio * m_joint3.GetJointTranslation;
  116.    DrawText(Format('theta2 + %4.2f * delta := %4.2f', [m_joint5.GetRatio, value]));
  117. end;
  118. initialization
  119.    RegisterTestEntry('Gears', TGears);
  120. end.