From c9b60f2c65dd1585c8fff66670d14e8742422e38 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 12 May 2019 16:26:02 +0300 Subject: [PATCH] Add distance vs time graph --- eos/graph/fitDistanceTime.py | 26 +++++++++ eos/graph/fitSpeedTime.py | 2 +- gui/builtinGraphs/__init__.py | 1 + gui/builtinGraphs/fitDistanceTime.py | 81 ++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 eos/graph/fitDistanceTime.py create mode 100644 gui/builtinGraphs/fitDistanceTime.py diff --git a/eos/graph/fitDistanceTime.py b/eos/graph/fitDistanceTime.py new file mode 100644 index 000000000..253c37e08 --- /dev/null +++ b/eos/graph/fitDistanceTime.py @@ -0,0 +1,26 @@ +import math +from logbook import Logger + +from eos.graph import Graph + + +pyfalog = Logger(__name__) + + +class FitDistanceTimeGraph(Graph): + + defaults = {"time": 0} + + def __init__(self, fit, data=None): + Graph.__init__(self, fit, self.calcDistance, data if data is not None else self.defaults) + self.fit = fit + + def calcDistance(self, data): + time = data["time"] + maxSpeed = self.fit.ship.getModifiedItemAttr('maxVelocity') + mass = self.fit.ship.getModifiedItemAttr('mass') + agility = self.fit.ship.getModifiedItemAttr('agility') + # Definite integral of: + # https://wiki.eveuniversity.org/Acceleration#Mathematics_and_formulae + distance = maxSpeed * time + (maxSpeed * agility * mass * math.exp((-time * 1000000) / (agility * mass)) / 1000000) + return distance diff --git a/eos/graph/fitSpeedTime.py b/eos/graph/fitSpeedTime.py index 09f52dfed..5e3f41747 100644 --- a/eos/graph/fitSpeedTime.py +++ b/eos/graph/fitSpeedTime.py @@ -21,5 +21,5 @@ class FitSpeedTimeGraph(Graph): mass = self.fit.ship.getModifiedItemAttr('mass') agility = self.fit.ship.getModifiedItemAttr('agility') # https://wiki.eveuniversity.org/Acceleration#Mathematics_and_formulae - speed = maxSpeed * (1 - math.exp((-time * 10 ** 6) / (agility * mass))) + speed = maxSpeed * (1 - math.exp((-time * 1000000) / (agility * mass))) return speed diff --git a/gui/builtinGraphs/__init__.py b/gui/builtinGraphs/__init__.py index cff4bb83f..1d8cc7068 100644 --- a/gui/builtinGraphs/__init__.py +++ b/gui/builtinGraphs/__init__.py @@ -3,6 +3,7 @@ __all__ = [ 'fitDpsTime', 'fitDmgTime', 'fitSpeedTime', + 'fitDistanceTime', 'fitShieldRegenAmount', 'fitShieldAmountTime', 'fitCapRegenAmount', diff --git a/gui/builtinGraphs/fitDistanceTime.py b/gui/builtinGraphs/fitDistanceTime.py new file mode 100644 index 000000000..af0602d2f --- /dev/null +++ b/gui/builtinGraphs/fitDistanceTime.py @@ -0,0 +1,81 @@ +# ============================================================================= +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa 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 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + +import gui.mainFrame +from eos.graph import Data +from eos.graph.fitDistanceTime import FitDistanceTimeGraph as EosFitDistanceTimeGraph +from gui.bitmap_loader import BitmapLoader +from gui.graph import Graph +from service.attribute import Attribute + + +class FitDistanceTimeGraph(Graph): + + propertyLabelMap = {"time": "Time (seconds)"} + + defaults = EosFitDistanceTimeGraph.defaults.copy() + + def __init__(self): + Graph.__init__(self) + self.defaults["time"] = "0-80" + self.name = "Distance Travelled vs. Time" + self.eosGraph = None + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def getFields(self): + return self.defaults + + def getLabels(self): + return self.propertyLabelMap + + def getIcons(self): + iconFile = Attribute.getInstance().getAttributeInfo('duration').iconID + bitmap = BitmapLoader.getBitmap(iconFile, "icons") + return {"time": bitmap} + + def getPoints(self, fit, fields): + eosGraph = getattr(self, "eosGraph", None) + if eosGraph is None or eosGraph.fit != fit: + eosGraph = self.eosGraph = EosFitDistanceTimeGraph(fit) + + eosGraph.clearData() + variable = None + for fieldName, value in fields.items(): + d = Data(fieldName, value) + if not d.isConstant(): + if variable is None: + variable = fieldName + else: + # We can't handle more then one variable atm, OOPS FUCK OUT + return False, "Can only handle 1 variable" + + eosGraph.setData(d) + + if variable is None: + return False, "No variable" + + x = [] + y = [] + for point, val in eosGraph.getIterator(): + x.append(point[variable]) + y.append(val) + return x, y + + +FitDistanceTimeGraph.register()