From c2a919a15ecf9062ac63368eba6483d37dacc54b Mon Sep 17 00:00:00 2001 From: catdog2 Date: Sat, 11 Oct 2008 23:16:51 +0000 Subject: [PATCH] homoefeld berechnung und animation sollten grundlegend funktionieren git-svn-id: http://svn.lsim.tuxzone.org/trunk@3 4bec179b-ab65-46ed-a5f8-55b8b5c735d0 --- lsim.kdevelop.pcs | Bin 82991 -> 82951 bytes lsim.kdevses | 6 +++--- src/constants.h | 3 ++- src/graphicsellipseitem.cpp | 33 +++++++++++++++++++++++---------- src/graphicsellipseitem.h | 13 +++++++++---- src/lsim.cpp | 26 +++++++++++++++++++++----- src/simulscene.cpp | 32 +++++++++++++------------------- src/simulscene.h | 5 ++++- 8 files changed, 75 insertions(+), 43 deletions(-) diff --git a/lsim.kdevelop.pcs b/lsim.kdevelop.pcs index ae390dc001ce6c0f3331a87a1686c00dff5dbca9..695cc1b6bf1674a92322fd29e579459a62619441 100644 GIT binary patch delta 480 zcmYk0Pe_w-7{{My?%m!|WX9XrDwoL!>@bz7hrno^#u_#356c3_j2R)hUUD76!w9E8mzZcPC>Ti4Ef~~x5Tes0IuykE)v4$5@Zt02dA`dTC7n_7^9GJ$ zKIg{Sya|NQ!9n^NtNO<_3sB}>pHxiXb)ms=Z6MgxB;_eO96f-|T zXg7#}$z=HU8Py-MK>1e_(f6Nv)y}@Z*De!ll~r@Co&933CwZ6$M9g2>kHEqq;lEa4 zwC60M`}#Y@I7-8Wk&!eeFKN)CJ#srS5w(iuaNJ;yQwzz_LkgdOW3(0Jn@h%ey*>%g z+fLo(VjseBE1JV0j7PlK8yeGpH?oS}p*6mXV&oo*V>XezRb^~P%;+z*uqraQ^#_cJt^grD;t-+Fd z!AUeZoT8k1eiVVM1zUqQbig5AFRpYliP%SHP_H!bKFluK^koxkdfv^xb?Yg%ANd2x Cm%h{h delta 499 zcmY+8Ur1AN9L2xiJ2$T}O&=z6(J&ElF*O|qxiHsDH;Ec6!U}4C$TV$D=O21$)0taj zM4jlihp>pC5HkE_rh}L-MnPCaAo#GPAi@X*@u8@7_t@L{oO3vwctSs!&_BB=@d$iL z2i#XI$Vf(hi1pFKveIaC5yh4;uO63`*_r!9S39+yM}z0ZM9DDTKRv0z(h$*vU8@~H z`r1}mnTtn=rfwtsS({AfjIn8=)CN{E%^Hj>5WN}H(*3eBJ-AGi*@P?Tz~na@*7W)O z628?oxD5tr)u0`5sG(9W#o}+htStX3A==oXy3E{~n>|KslBe?5>JV}kiNCvhO^CYk zMBkwWBcBn@6YI=1qUO{)y)HnV_~T8e-}ATv_k0aGVMR-*N)-6}B#Z~PAmz7Wv$q0W z9bWvHmr-|ipDs+@con{d0>2l5b_KN;3<&O(ReJ;5QQPlE~mm2J9i W>esw#^@f3sYQn*-Ge2!yX88vXRLDXA diff --git a/lsim.kdevses b/lsim.kdevses index 34f034f..344ba17 100644 --- a/lsim.kdevses +++ b/lsim.kdevses @@ -6,13 +6,13 @@ - + - + - + diff --git a/src/constants.h b/src/constants.h index 964c726..8acc3e7 100644 --- a/src/constants.h +++ b/src/constants.h @@ -18,4 +18,5 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include -const double PI = acos( -1.0 ); \ No newline at end of file +const double PI = acos( -1.0 ); +const double SPEED_OF_LIGHT = 2.99792458e+8; \ No newline at end of file diff --git a/src/graphicsellipseitem.cpp b/src/graphicsellipseitem.cpp index cfd1be3..083ce32 100644 --- a/src/graphicsellipseitem.cpp +++ b/src/graphicsellipseitem.cpp @@ -24,6 +24,8 @@ #include #include "simulscene.h" #include "probechargewidget.h" +#include +#include "constants.h" GraphicsEllipseItem::GraphicsEllipseItem() { setFlag(ItemIsMovable); @@ -77,18 +79,22 @@ void GraphicsEllipseItem::calculateProbePath(QPointF startPoint, double startSpe for(int i = 1; i< steps;++i) { + double myMasse = getMasse( sqrt( speedListX->at(i-1)*speedListX->at(i-1) + speedListY->at(i-1)*speedListY->at(i-1) ) ); + qDebug()<< myMasse; double powerX = myScene->getPowerAt(currProbePath->at(i-1), charge, 'x'); double powerY = myScene->getPowerAt(currProbePath->at(i-1), charge, 'y'); - double deltaDistXconst = speedListX->at(i-1) * (timePerStep/1000.0); + double deltaDistXconst = speedListX->at(i-1) * (timePerStep/1000.0); //v0*t double deltaDistYconst = speedListY->at(i-1) * (timePerStep/1000.0); - double deltaDistXaccel = 0.5 * (powerX/getMasse()) * (timePerStep/1000.0) * (timePerStep/1000.0); - double deltaDistYaccel = 0.5 * (powerY/getMasse()) * (timePerStep/1000.0) * (timePerStep/1000.0); + + double deltaDistXaccel = 0.5 * (powerX/myMasse * (timePerStep/1000.0) * (timePerStep/1000.0)); // 1/2 * F/m * t*t + double deltaDistYaccel = 0.5 * (powerY/myMasse * (timePerStep/1000.0) * (timePerStep/1000.0)); + double deltaDistX = (deltaDistXconst + deltaDistXaccel); double deltaDistY = (deltaDistYconst + deltaDistYaccel); - currProbePath->append(QPointF(currProbePath->at(i-1).x() + deltaDistX/meterPerPx,currProbePath->at(i-1).y() + deltaDistY/meterPerPx)); - speedListX->append(speedListX->at(i-1) + (powerX/getMasse()) * (timePerStep/1000.0)); - speedListY->append(speedListY->at(i-1) + (powerY/getMasse()) * (timePerStep/1000.0)); + currProbePath->append(QPointF(currProbePath->at(i-1).x() + deltaDistX/meterPerPx ,currProbePath->at(i-1).y() + deltaDistY/meterPerPx)); + speedListX->append(speedListX->at(i-1) + (powerX/myMasse * (timePerStep/1000.0)) ); + speedListY->append(speedListY->at(i-1) + (powerY/myMasse * (timePerStep/1000.0)) ); } @@ -96,7 +102,6 @@ void GraphicsEllipseItem::calculateProbePath(QPointF startPoint, double startSpe qDebug()<< "Probe Path: " <<*currProbePath; qDebug()<< "speed x: "<<*speedListX; qDebug()<< "speed y: "<<*speedListY; - qDebug()<at(12); qDebug()<at(12); qDebug()<<"power x: "<< (double)myScene->getPowerAt(QPointF(0,0), charge, 'x'); qDebug()<<"power y: " << (double)myScene->getPowerAt(QPointF(0,0), charge, 'y'); @@ -104,12 +109,16 @@ void GraphicsEllipseItem::calculateProbePath(QPointF startPoint, double startSpe } -long double GraphicsEllipseItem::getMasse() const { - return masse; +double GraphicsEllipseItem::getMasse(double speed) { + if(speed == 0) return masse; + else { + return masse / (sqrt(1- ( (speed/SPEED_OF_LIGHT)*(speed/SPEED_OF_LIGHT)))); + + } } -void GraphicsEllipseItem::setMasse ( const long double& theValue ) { +void GraphicsEllipseItem::setMasse ( const double& theValue ) { if (masse == theValue) return; masse = theValue; } @@ -129,3 +138,7 @@ QWidget * GraphicsEllipseItem::getDockWidget() const { return myProbeChargeWidget; } + +QList * GraphicsEllipseItem::getCurrProbePath() { + return currProbePath; +} \ No newline at end of file diff --git a/src/graphicsellipseitem.h b/src/graphicsellipseitem.h index 1772023..a7bb558 100644 --- a/src/graphicsellipseitem.h +++ b/src/graphicsellipseitem.h @@ -32,6 +32,8 @@ class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem { QWidget* getDockWidget() const; ~GraphicsEllipseItem(); + QList * getCurrProbePath(); + @@ -58,12 +60,15 @@ class GraphicsEllipseItem : public QObject , public QGraphicsEllipseItem { /*! \param steps Anzahl der auszufürenden Schriite */ - void calculateProbePath (QPointF startPoint = QPointF(0,0), double startSpeedX = 0, double startSpeedY = 0); + void calculateProbePath (QPointF startPoint = QPointF(0,0) , double startSpeedX = 0, double startSpeedY = 0); - void setMasse ( const long double& theValue ); + void setMasse ( const double& theValue ); - - long double getMasse() const; + //! Gibt die Masse zurück + /*! + \param speed alles != 0 relativistisch + */ + double getMasse(double speed); void setCharge ( const long double& theValue ); diff --git a/src/lsim.cpp b/src/lsim.cpp index c58bcd1..4862e7f 100644 --- a/src/lsim.cpp +++ b/src/lsim.cpp @@ -147,10 +147,25 @@ void lsim::createScene() { void lsim::createDocks() { QPushButton *button1 = new QPushButton("Loeschen"); QPushButton *button2 = new QPushButton("calculate"); - ExpDoubleSpinBox *box = new ExpDoubleSpinBox; - box->setRange(-pow(10,33), pow(10,33)); - box->setDecimals(4); - //box->setSuffix(" V"); + + + ExpDoubleSpinBox *time_step_box = new ExpDoubleSpinBox; + time_step_box->setRange(-pow(10,33), pow(10,33)); + time_step_box->setDecimals(20); + time_step_box->setKeyboardTracking(false); + + time_step_box->setValue(simulscene->getTimePerStep()); + connect(time_step_box, SIGNAL(valueChanged(double)),simulscene, SLOT(setTimePerStep(double))); + connect(simulscene, SIGNAL(timePerStepChanged(double)),time_step_box, SLOT(setValue( double ))); + + + ExpDoubleSpinBox *meter_per_px_box = new ExpDoubleSpinBox; + meter_per_px_box->setRange(-pow(10,33), pow(10,33)); + meter_per_px_box->setDecimals(20); + meter_per_px_box->setKeyboardTracking(false); + meter_per_px_box->setValue(simulscene->getMeterPerPx()); + connect(meter_per_px_box, SIGNAL(valueChanged(double)),simulscene, SLOT(setMeterPerPx(double))); + connect(simulscene, SIGNAL(meterPerPxChanged(double)),meter_per_px_box, SLOT(setValue( double ))); QSlider *slider1 = new QSlider(); slider1->setMinimum(0); @@ -163,7 +178,8 @@ void lsim::createDocks() { layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(slider1); - layout->addWidget(box); + layout->addWidget(time_step_box); + layout->addWidget(meter_per_px_box); QWidget *widget2 = new QWidget; widget2->setLayout(layout); diff --git a/src/simulscene.cpp b/src/simulscene.cpp index 3a6d692..04a5bd1 100644 --- a/src/simulscene.cpp +++ b/src/simulscene.cpp @@ -74,32 +74,25 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { addItem(ellipse1); - timer = new QTimeLine( (200e-3/8.0e+6) *1000 * 2e+8); + timer = new QTimeLine( 30000); //qDebug()<< (200e-3/8.0e+6) *1000 * 2e+8; timer->setFrameRange(0,100); timer->setUpdateInterval(25); timer->setCurveShape(QTimeLine::LinearCurve); //timer->toggleDirection(); - QGraphicsItemAnimation *ani = new QGraphicsItemAnimation(); + ani = new QGraphicsItemAnimation(); ani->setItem(ellipse1); ani->setTimeLine(timer); - - qreal E = 40/(2e-2); - qreal q = -1.6022e-19; - qreal m = 9.1094e-31; - qreal vx = 8.0e+6; - qreal ax=0; - qreal ay=q*E/m; - - for (int i=0; i<=200; ++i) { - qreal x=i; - ani->setPosAt(i/200.0, QPointF(x , 0.5 * ay * pow(( (x/1000) /vx),2) *1000 )); - //ani->setPosAt((t+360)/720.0, QPointF((t), 80*abs(t/180.0*3.14) )); - //qDebug()<setPosAt(i/200.0, QPointF(x , 0.5 * ay * pow(( (x/1000) /vx),2) *1000 )); + ani->setPosAt(i/(double)getSteps(), ellipse1->getCurrProbePath()->at(i) ); + //qDebug()<< getSteps(); + } timer->start(); } @@ -497,7 +490,7 @@ void SimulScene::setTimePerStep(double time) { \fn SimulScene::startCalculation() */ void SimulScene::startCalculation() { - ellipse1->calculateProbePath(); + ellipse1->calculateProbePath(ellipse1->pos()); } @@ -519,8 +512,8 @@ void SimulScene::setSteps(int steps) { } -long double SimulScene::getPowerAt(QPointF point, long double charge, char xy) { - long double dPower = 0; +double SimulScene::getPowerAt(QPointF point, double charge, char xy) { + double dPower = 0; for(int i = 0; i < items(point).size(); ++i) { //HomoEFieldItems Abarbeiten if (qgraphicsitem_cast (items(point).at(i)) != 0) { @@ -550,6 +543,7 @@ double SimulScene::getMeterPerPx() const { void SimulScene::setMeterPerPx ( double theValue ) { if (theValue == meterPerPx) return; meterPerPx = theValue; + emit meterPerPxChanged(theValue); } diff --git a/src/simulscene.h b/src/simulscene.h index 506ee20..5c71502 100644 --- a/src/simulscene.h +++ b/src/simulscene.h @@ -27,6 +27,7 @@ class HomoEFieldItem; class QGraphicsRectItem; class QGraphicsItemGroup; class GraphicsEllipseItem; +class QGraphicsItemAnimation; /** @author Peter Dahlberg @@ -49,7 +50,7 @@ class SimulScene : public QGraphicsScene { \param charge Die Ladung, auf die die Kraft ausgeübt wird \param xy x oder y-Richtung */ - long double getPowerAt(QPointF point, long double charge, char xy); + double getPowerAt(QPointF point, double charge, char xy); QWidget* getProbeDockWidget() const; public slots: @@ -74,6 +75,7 @@ class SimulScene : public QGraphicsScene { void sceneModeChanged(int mode); void stepsChanged(int steps); void timePerStepChanged(double timePerStep); + void meterPerPxChanged(double meterPerPx); private: QTimeLine *timer; @@ -90,6 +92,7 @@ class SimulScene : public QGraphicsScene { QGraphicsItem *pressedResizeItem; GraphicsEllipseItem *ellipse1; + QGraphicsItemAnimation *ani; //rechtecke zur groesenaenderung