You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.1 KiB
140 lines
3.1 KiB
/***************************************************************************
|
|
* Copyright (C) 2005 by David Saxton *
|
|
* david@bluehaze.org *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
***************************************************************************/
|
|
|
|
#include "mechanicsdocument.h"
|
|
#include "mechanicsitem.h"
|
|
#include "mechanicssimulation.h"
|
|
|
|
#include <cmath>
|
|
#include <tqtimer.h>
|
|
|
|
MechanicsSimulation::MechanicsSimulation( MechanicsDocument *mechanicsDocument )
|
|
: TQObject(mechanicsDocument)
|
|
{
|
|
p_mechanicsDocument = mechanicsDocument;
|
|
m_advanceTmr = new TQTimer(this);
|
|
connect( m_advanceTmr, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotAdvance()) );
|
|
m_advanceTmr->start(1);
|
|
}
|
|
|
|
|
|
MechanicsSimulation::~MechanicsSimulation()
|
|
{
|
|
}
|
|
|
|
|
|
void MechanicsSimulation::slotAdvance()
|
|
{
|
|
if ( p_mechanicsDocument && p_mechanicsDocument->canvas() )
|
|
p_mechanicsDocument->canvas()->advance();
|
|
}
|
|
|
|
|
|
RigidBody::RigidBody( MechanicsDocument *mechanicsDocument )
|
|
{
|
|
p_mechanicsDocument = mechanicsDocument;
|
|
p_overallParent = 0l;
|
|
}
|
|
|
|
|
|
RigidBody::~RigidBody()
|
|
{
|
|
}
|
|
|
|
|
|
bool RigidBody::addMechanicsItem( MechanicsItem *item )
|
|
{
|
|
if ( !item || m_mechanicsItemList.contains(item) )
|
|
return false;
|
|
|
|
m_mechanicsItemList.append(item);
|
|
findOverallParent();
|
|
return true;
|
|
}
|
|
|
|
|
|
void RigidBody::moveBy( double dx, double dy )
|
|
{
|
|
if (overallParent())
|
|
overallParent()->moveBy( dx, dy );
|
|
}
|
|
|
|
|
|
void RigidBody::rotateBy( double dtheta )
|
|
{
|
|
if (overallParent())
|
|
overallParent()->rotateBy(dtheta);
|
|
}
|
|
|
|
|
|
bool RigidBody::findOverallParent()
|
|
{
|
|
p_overallParent = 0l;
|
|
if ( m_mechanicsItemList.isEmpty() )
|
|
return false;
|
|
|
|
m_mechanicsItemList.remove(0l);
|
|
|
|
const MechanicsItemList::iterator end = m_mechanicsItemList.end();
|
|
for ( MechanicsItemList::iterator it = m_mechanicsItemList.begin(); it != end; ++it )
|
|
{
|
|
MechanicsItem *parentItem = *it;
|
|
MechanicsItem *parentCandidate = dynamic_cast<MechanicsItem*>((*it)->parentItem());
|
|
|
|
while (parentCandidate)
|
|
{
|
|
parentItem = parentCandidate;
|
|
parentCandidate = dynamic_cast<MechanicsItem*>(parentItem->parentItem());
|
|
}
|
|
|
|
if ( !p_overallParent )
|
|
// Must be the first item to test
|
|
p_overallParent = parentItem;
|
|
|
|
if ( p_overallParent != parentItem )
|
|
{
|
|
p_overallParent = 0l;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
void RigidBody::updateRigidBodyInfo()
|
|
{
|
|
if (!p_overallParent)
|
|
return;
|
|
|
|
m_mass = p_overallParent->mechanicsInfoCombined()->mass;
|
|
m_momentOfInertia = p_overallParent->mechanicsInfoCombined()->momentOfInertia;
|
|
}
|
|
|
|
|
|
Vector2D::Vector2D()
|
|
{
|
|
x = 0.;
|
|
y = 0.;
|
|
}
|
|
|
|
double Vector2D::length() const
|
|
{
|
|
return std::sqrt( x*x + y*y );
|
|
}
|
|
|
|
RigidBodyState::RigidBodyState()
|
|
{
|
|
angularMomentum = 0.;
|
|
}
|
|
|
|
|
|
|
|
#include "mechanicssimulation.moc"
|