Performance der Berechnung gesteigert

git-svn-id: http://svn.lsim.tuxzone.org/trunk@14 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
catdog2
2008-11-13 15:17:17 +00:00
parent 75632cdbbc
commit 4add2d0631
5 changed files with 74 additions and 11 deletions

View File

@@ -40,7 +40,7 @@
SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
//variablen initialisieren
setTimePerStep(0.00001);
setSteps(21234);
setSteps(210000);
//setMeterPerPx(1/1000.0);
setMeterPerPx(1);
@@ -586,7 +586,24 @@ void SimulScene::setTimePerStep(double time) {
*/
void SimulScene::startCalculation() {
pathItem1->setPath(QPainterPath());
//Feld Item Listen erzeugen
calcEFieldList.clear();
calcBFieldList.clear();
for(int i = 0; i < items().size(); ++i) {
//HomoEFieldItems Abarbeiten
if (qgraphicsitem_cast<HomoEFieldItem*> (items().at(i)) != 0) {
calcEFieldList << qgraphicsitem_cast<HomoEFieldItem*> (items().at(i));
}
//HomoBFieldItems Abarbeiten
if (qgraphicsitem_cast<HomoBFieldItem*> (items().at(i)) != 0) {
calcBFieldList << qgraphicsitem_cast<HomoBFieldItem*>(items().at(i));
}
}
//berechnung starten
ellipse1->calculateProbePath(ellipse1->pos());
pathItem1->setPath(ellipse1->getFlightPath());
//animationspfad berechnen
@@ -626,7 +643,7 @@ void SimulScene::setSteps(int steps) {
double SimulScene::getPowerAt(QPointF point, double charge, double speedX, double speedY, char xy) {
double dPower = 0;
for(int i = 0; i < items(point).size(); ++i) {
/*for(int i = 0; i < items(point).size(); ++i) {
//HomoEFieldItems Abarbeiten
if (qgraphicsitem_cast<HomoEFieldItem*> (items(point).at(i)) != 0) {
HomoEFieldItem* myHomoEFieldItem = qgraphicsitem_cast<HomoEFieldItem*> (items(point).at(i));
@@ -656,6 +673,48 @@ double SimulScene::getPowerAt(QPointF point, double charge, double speedX, doubl
}
//qDebug()<< PowerRadAngle;
if (xy == 'x') {
dPower += absLorentzPower * cos(PowerRadAngle);
}
if (xy == 'y') {
dPower += absLorentzPower * sin(PowerRadAngle);
}
}
}*/
for (int i=0; i<calcEFieldList.size(); ++i) {
//HomoEFieldItems Abarbeiten
HomoEFieldItem* myHomoEFieldItem = calcEFieldList[i];
if (myHomoEFieldItem->contains(myHomoEFieldItem->mapFromScene(point))) {
double power = (myHomoEFieldItem->getFieldPower() * charge);
double degAngle = myHomoEFieldItem->getRotation();
double radAngle = degAngle/180.0*PI;
if(xy == 'x') {
if (degAngle != 180.0) dPower += power * -sin(radAngle);
}
if(xy == 'y') {
if (degAngle != 90.0 && degAngle != 270.0) dPower += power * cos(radAngle);
}
}
}
for (int i=0; i<calcBFieldList.size(); ++i) {
//HomoBFieldItems Abarbeiten
HomoBFieldItem* myHomoBFieldItem = calcBFieldList[i];
if (myHomoBFieldItem->contains(myHomoBFieldItem->mapFromScene(point))) {
double absSpeed = sqrt(speedX * speedX + speedY * speedY); // Geschwindigkeit im Betrag |v|=sqrt(vx^2+vy^2)
double absLorentzPower = (charge * absSpeed * myHomoBFieldItem->getFluxDensity() ); //Kraft im Betrag: |F| = q*v*B
double speedRadAngle = atan2(speedY,speedX); //Winkel des Geschwindigkeitsvekors zur x-Achse im Bogenmass
double PowerRadAngle; //Winkel des Lorentzkraftvektors zur x-Achse im Bogenmass
if (myHomoBFieldItem->getIsDirectionIntoPlane()) {
PowerRadAngle = speedRadAngle + PI/2.0;
} else {
PowerRadAngle = speedRadAngle - PI/2.0;
}
//qDebug()<< PowerRadAngle;
if (xy == 'x') {
dPower += absLorentzPower * cos(PowerRadAngle);
}