Use math.radians and math.degrees
Many places in the library were doing radian to degree conversion via the manual calculation. Doing timeit benchmarks on my system, I am able to get a 4x speedup by using math.degrees or math.radians instead
This commit is contained in:
parent
1138c67d45
commit
b0769f4be9
@ -8,7 +8,6 @@ Distributed under MIT/X11 license. See license.txt for more information.
|
|||||||
from .Qt import QtCore
|
from .Qt import QtCore
|
||||||
from math import atan2, hypot, degrees
|
from math import atan2, hypot, degrees
|
||||||
|
|
||||||
|
|
||||||
class Point(QtCore.QPointF):
|
class Point(QtCore.QPointF):
|
||||||
"""Extension of QPointF which adds a few missing methods."""
|
"""Extension of QPointF which adds a few missing methods."""
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from math import atan2, pi
|
from math import atan2, degrees
|
||||||
from .Qt import QtCore, QtGui
|
from .Qt import QtCore, QtGui
|
||||||
from .Point import Point
|
from .Point import Point
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -77,7 +77,7 @@ class SRTTransform(QtGui.QTransform):
|
|||||||
self._state = {
|
self._state = {
|
||||||
'pos': Point(p1),
|
'pos': Point(p1),
|
||||||
'scale': Point(dp2.length(), dp3.length() * sy),
|
'scale': Point(dp2.length(), dp3.length() * sy),
|
||||||
'angle': (atan2(dp2[1], dp2[0]) * 180. / pi) + da
|
'angle': degrees(atan2(dp2[1], dp2[0])) + da
|
||||||
}
|
}
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from math import atan2, pi
|
from math import atan2, degrees
|
||||||
from .Qt import QtCore, QtGui
|
from .Qt import QtCore, QtGui
|
||||||
from .Vector import Vector
|
from .Vector import Vector
|
||||||
from .Transform3D import Transform3D
|
from .Transform3D import Transform3D
|
||||||
@ -165,7 +165,7 @@ class SRTTransform3D(Transform3D):
|
|||||||
sin = (r-r.T)[rInd] / (2. * sign * axis[axisInd])
|
sin = (r-r.T)[rInd] / (2. * sign * axis[axisInd])
|
||||||
|
|
||||||
## finally, we get the complete angle from arctan(sin/cos)
|
## finally, we get the complete angle from arctan(sin/cos)
|
||||||
self._state['angle'] = atan2(sin, cos) * 180 / pi
|
self._state['angle'] = degrees(atan2(sin, cos))
|
||||||
if self._state['angle'] == 0:
|
if self._state['angle'] == 0:
|
||||||
self._state['axis'] = (0,0,1)
|
self._state['axis'] = (0,0,1)
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ Vector.py - Extension of QVector3D which adds a few missing methods.
|
|||||||
Copyright 2010 Luke Campagnola
|
Copyright 2010 Luke Campagnola
|
||||||
Distributed under MIT/X11 license. See license.txt for more information.
|
Distributed under MIT/X11 license. See license.txt for more information.
|
||||||
"""
|
"""
|
||||||
from math import acos
|
from math import acos, degrees
|
||||||
from .Qt import QtGui, QtCore, QT_LIB
|
from .Qt import QtGui, QtCore, QT_LIB
|
||||||
from . import functions as fn
|
from . import functions as fn
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -89,11 +89,11 @@ class Vector(QtGui.QVector3D):
|
|||||||
if n1 == 0. or n2 == 0.:
|
if n1 == 0. or n2 == 0.:
|
||||||
return None
|
return None
|
||||||
## Probably this should be done with arctan2 instead..
|
## Probably this should be done with arctan2 instead..
|
||||||
ang = acos(fn.clip_scalar(QtGui.QVector3D.dotProduct(self, a) / (n1 * n2), -1.0, 1.0)) ### in radians
|
rads = acos(fn.clip_scalar(QtGui.QVector3D.dotProduct(self, a) / (n1 * n2), -1.0, 1.0)) ### in radians
|
||||||
# c = self.crossProduct(a)
|
# c = self.crossProduct(a)
|
||||||
# if c > 0:
|
# if c > 0:
|
||||||
# ang *= -1.
|
# ang *= -1.
|
||||||
return ang * 180. / np.pi
|
return degrees(rads)
|
||||||
|
|
||||||
def __abs__(self):
|
def __abs__(self):
|
||||||
return Vector(abs(self.x()), abs(self.y()), abs(self.z()))
|
return Vector(abs(self.x()), abs(self.y()), abs(self.z()))
|
||||||
|
@ -432,16 +432,16 @@ def makeArrowPath(headLen=20, headWidth=None, tipAngle=20, tailLen=20, tailWidth
|
|||||||
If *tailLen* is None, no tail will be drawn.
|
If *tailLen* is None, no tail will be drawn.
|
||||||
"""
|
"""
|
||||||
if headWidth is None:
|
if headWidth is None:
|
||||||
headWidth = headLen * math.tan(tipAngle * 0.5 * math.pi / 180.)
|
headWidth = headLen * math.tan(math.radians(tipAngle * 0.5))
|
||||||
path = QtGui.QPainterPath()
|
path = QtGui.QPainterPath()
|
||||||
path.moveTo(0,0)
|
path.moveTo(0,0)
|
||||||
path.lineTo(headLen, -headWidth)
|
path.lineTo(headLen, -headWidth)
|
||||||
if tailLen is None:
|
if tailLen is None:
|
||||||
innerY = headLen - headWidth * math.tan(baseAngle * math.pi / 180.)
|
innerY = headLen - headWidth * math.tan(math.radians(baseAngle))
|
||||||
path.lineTo(innerY, 0)
|
path.lineTo(innerY, 0)
|
||||||
else:
|
else:
|
||||||
tailWidth *= 0.5
|
tailWidth *= 0.5
|
||||||
innerY = headLen - (headWidth-tailWidth) * math.tan(baseAngle* math.pi / 180.)
|
innerY = headLen - (headWidth-tailWidth) * math.tan(math.radians(baseAngle))
|
||||||
path.lineTo(innerY, -tailWidth)
|
path.lineTo(innerY, -tailWidth)
|
||||||
path.lineTo(headLen + tailLen, -tailWidth)
|
path.lineTo(headLen + tailLen, -tailWidth)
|
||||||
path.lineTo(headLen + tailLen, tailWidth)
|
path.lineTo(headLen + tailLen, tailWidth)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from math import atan2, pi
|
from math import atan2, degrees
|
||||||
from ..Qt import QtGui, QtCore
|
from ..Qt import QtGui, QtCore
|
||||||
from . import ArrowItem
|
from . import ArrowItem
|
||||||
from ..functions import clip_scalar
|
from ..functions import clip_scalar
|
||||||
@ -79,10 +79,10 @@ class CurvePoint(GraphicsObject):
|
|||||||
|
|
||||||
p1 = self.parentItem().mapToScene(QtCore.QPointF(x[i1], y[i1]))
|
p1 = self.parentItem().mapToScene(QtCore.QPointF(x[i1], y[i1]))
|
||||||
p2 = self.parentItem().mapToScene(QtCore.QPointF(x[i2], y[i2]))
|
p2 = self.parentItem().mapToScene(QtCore.QPointF(x[i2], y[i2]))
|
||||||
ang = atan2(p2.y()-p1.y(), p2.x()-p1.x()) ## returns radians
|
rads = atan2(p2.y()-p1.y(), p2.x()-p1.x()) ## returns radians
|
||||||
self.resetTransform()
|
self.resetTransform()
|
||||||
if self._rotate:
|
if self._rotate:
|
||||||
self.setRotation(180 + ang * (180. / pi))
|
self.setRotation(180 + degrees(rads))
|
||||||
QtGui.QGraphicsItem.setPos(self, *newPos)
|
QtGui.QGraphicsItem.setPos(self, *newPos)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from math import atan2, pi
|
from math import atan2, degrees
|
||||||
from ..Qt import QtGui, QtCore
|
from ..Qt import QtGui, QtCore
|
||||||
from ..Point import Point
|
from ..Point import Point
|
||||||
from .GraphicsObject import GraphicsObject
|
from .GraphicsObject import GraphicsObject
|
||||||
@ -360,7 +360,7 @@ class InfiniteLine(GraphicsObject):
|
|||||||
up = tr.map(Point(left, 1))
|
up = tr.map(Point(left, 1))
|
||||||
dif = end - start
|
dif = end - start
|
||||||
length = Point(dif).length()
|
length = Point(dif).length()
|
||||||
angle = atan2(dif.y(), dif.x()) * 180 / pi
|
angle = degrees(atan2(dif.y(), dif.x()))
|
||||||
|
|
||||||
p.translate(start)
|
p.translate(start)
|
||||||
p.rotate(angle)
|
p.rotate(angle)
|
||||||
|
@ -17,7 +17,7 @@ import numpy as np
|
|||||||
#from numpy.linalg import norm
|
#from numpy.linalg import norm
|
||||||
from ..Point import *
|
from ..Point import *
|
||||||
from ..SRTTransform import SRTTransform
|
from ..SRTTransform import SRTTransform
|
||||||
from math import atan2, cos, sin, pi, sqrt, hypot
|
from math import atan2, cos, sin, pi, sqrt, hypot, radians, degrees
|
||||||
from .. import functions as fn
|
from .. import functions as fn
|
||||||
from .GraphicsObject import GraphicsObject
|
from .GraphicsObject import GraphicsObject
|
||||||
from .UIGraphicsItem import UIGraphicsItem
|
from .UIGraphicsItem import UIGraphicsItem
|
||||||
@ -1524,7 +1524,7 @@ class Handle(UIGraphicsItem):
|
|||||||
devPos = dt.map(QtCore.QPointF(0,0))
|
devPos = dt.map(QtCore.QPointF(0,0))
|
||||||
tr = QtGui.QTransform()
|
tr = QtGui.QTransform()
|
||||||
tr.translate(devPos.x(), devPos.y())
|
tr.translate(devPos.x(), devPos.y())
|
||||||
tr.rotate(va * 180. / pi)
|
tr.rotate(degrees(va))
|
||||||
|
|
||||||
return dti.map(tr.map(self.path))
|
return dti.map(tr.map(self.path))
|
||||||
|
|
||||||
@ -1663,7 +1663,7 @@ class LineROI(ROI):
|
|||||||
d = pos2-pos1
|
d = pos2-pos1
|
||||||
l = d.length()
|
l = d.length()
|
||||||
ang = Point(1, 0).angle(d)
|
ang = Point(1, 0).angle(d)
|
||||||
ra = ang * pi / 180.
|
ra = radians(ang if ang is not None else 0.)
|
||||||
c = Point(-width/2. * sin(ra), -width/2. * cos(ra))
|
c = Point(-width/2. * sin(ra), -width/2. * cos(ra))
|
||||||
pos1 = pos1 + c
|
pos1 = pos1 + c
|
||||||
|
|
||||||
@ -1673,9 +1673,6 @@ class LineROI(ROI):
|
|||||||
self.addScaleHandle([0.5, 1], [0.5, 0.5])
|
self.addScaleHandle([0.5, 1], [0.5, 0.5])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MultiRectROI(QtGui.QGraphicsObject):
|
class MultiRectROI(QtGui.QGraphicsObject):
|
||||||
r"""
|
r"""
|
||||||
Chain of rectangular ROIs connected by handles.
|
Chain of rectangular ROIs connected by handles.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from math import atan2, pi
|
from math import atan2, pi, degrees
|
||||||
|
|
||||||
from ..Qt import QtGui, QtCore
|
from ..Qt import QtGui, QtCore
|
||||||
from ..Point import Point
|
from ..Point import Point
|
||||||
@ -243,7 +243,7 @@ class TargetItem(UIGraphicsItem):
|
|||||||
tr = QtGui.QTransform()
|
tr = QtGui.QTransform()
|
||||||
tr.translate(devPos.x(), devPos.y())
|
tr.translate(devPos.x(), devPos.y())
|
||||||
va = atan2(v.y(), v.x())
|
va = atan2(v.y(), v.x())
|
||||||
tr.rotate(va * 180.0 / pi)
|
tr.rotate(degrees(va))
|
||||||
tr.scale(self.scale, self.scale)
|
tr.scale(self.scale, self.scale)
|
||||||
return dti.map(tr.map(self._path))
|
return dti.map(tr.map(self._path))
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from math import pi, atan2
|
from math import atan2, degrees
|
||||||
from ..Qt import QtCore, QtGui
|
from ..Qt import QtCore, QtGui
|
||||||
from ..Point import Point
|
from ..Point import Point
|
||||||
from .. import functions as fn
|
from .. import functions as fn
|
||||||
@ -208,7 +208,7 @@ class TextItem(GraphicsObject):
|
|||||||
angle = -self.angle
|
angle = -self.angle
|
||||||
if self.rotateAxis is not None:
|
if self.rotateAxis is not None:
|
||||||
d = pt.map(self.rotateAxis) - pt.map(Point(0, 0))
|
d = pt.map(self.rotateAxis) - pt.map(Point(0, 0))
|
||||||
a = atan2(d.y(), d.x()) * 180 / pi
|
a = degrees(atan2(d.y(), d.x()))
|
||||||
angle += a
|
angle += a
|
||||||
t.rotate(angle)
|
t.rotate(angle)
|
||||||
self.setTransform(t)
|
self.setTransform(t)
|
||||||
|
@ -5,7 +5,7 @@ import numpy as np
|
|||||||
from .. import Vector
|
from .. import Vector
|
||||||
from .. import functions as fn
|
from .. import functions as fn
|
||||||
import warnings
|
import warnings
|
||||||
from math import cos, sin, tan
|
from math import cos, sin, tan, degrees, radians
|
||||||
##Vector = QtGui.QVector3D
|
##Vector = QtGui.QVector3D
|
||||||
|
|
||||||
ShareWidget = None
|
ShareWidget = None
|
||||||
@ -184,7 +184,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
|
|||||||
nearClip = dist * 0.001
|
nearClip = dist * 0.001
|
||||||
farClip = dist * 1000.
|
farClip = dist * 1000.
|
||||||
|
|
||||||
r = nearClip * tan(fov * 0.5 * np.pi / 180.)
|
r = nearClip * tan(0.5 * radians(fov))
|
||||||
t = r * h / w
|
t = r * h / w
|
||||||
|
|
||||||
## Note that X0 and width in these equations must be the values used in viewport
|
## Note that X0 and width in these equations must be the values used in viewport
|
||||||
@ -326,8 +326,8 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
|
|||||||
pos = center - self.opts['rotation'].rotatedVector( Vector(0,0,dist) )
|
pos = center - self.opts['rotation'].rotatedVector( Vector(0,0,dist) )
|
||||||
else:
|
else:
|
||||||
# using 'euler' rotation method
|
# using 'euler' rotation method
|
||||||
elev = self.opts['elevation'] * np.pi / 180
|
elev = radians(self.opts['elevation'])
|
||||||
azim = self.opts['azimuth'] * np.pi / 180
|
azim = radians(self.opts['azimuth'])
|
||||||
pos = Vector(
|
pos = Vector(
|
||||||
center.x() + dist * cos(elev) * cos(azim),
|
center.x() + dist * cos(elev) * cos(azim),
|
||||||
center.y() + dist * cos(elev) * sin(azim),
|
center.y() + dist * cos(elev) * sin(azim),
|
||||||
@ -388,7 +388,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
|
|||||||
cPos = self.cameraPosition()
|
cPos = self.cameraPosition()
|
||||||
cVec = self.opts['center'] - cPos
|
cVec = self.opts['center'] - cPos
|
||||||
dist = cVec.length() ## distance from camera to center
|
dist = cVec.length() ## distance from camera to center
|
||||||
xDist = dist * 2. * tan(0.5 * self.opts['fov'] * np.pi / 180.) ## approx. width of view at distance of center point
|
xDist = dist * 2. * tan(0.5 * radians(self.opts['fov'])) ## approx. width of view at distance of center point
|
||||||
xScale = xDist / self.width()
|
xScale = xDist / self.width()
|
||||||
zVec = QtGui.QVector3D(0,0,1)
|
zVec = QtGui.QVector3D(0,0,1)
|
||||||
xVec = QtGui.QVector3D.crossProduct(zVec, cVec).normalized()
|
xVec = QtGui.QVector3D.crossProduct(zVec, cVec).normalized()
|
||||||
@ -409,9 +409,9 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
|
|||||||
# apply translation
|
# apply translation
|
||||||
self.opts['center'] += scale_factor * (xv*-dx + yv*dy + zv*dz)
|
self.opts['center'] += scale_factor * (xv*-dx + yv*dy + zv*dz)
|
||||||
else: # use default euler rotation method
|
else: # use default euler rotation method
|
||||||
elev = np.radians(self.opts['elevation'])
|
elev = radians(self.opts['elevation'])
|
||||||
azim = np.radians(self.opts['azimuth'])
|
azim = radians(self.opts['azimuth'])
|
||||||
fov = np.radians(self.opts['fov'])
|
fov = radians(self.opts['fov'])
|
||||||
dist = (self.opts['center'] - self.cameraPosition()).length()
|
dist = (self.opts['center'] - self.cameraPosition()).length()
|
||||||
fov_factor = tan(fov / 2) * 2
|
fov_factor = tan(fov / 2) * 2
|
||||||
scale_factor = dist * fov_factor / self.width()
|
scale_factor = dist * fov_factor / self.width()
|
||||||
@ -435,7 +435,7 @@ class GLViewWidget(QtWidgets.QOpenGLWidget):
|
|||||||
dist = ((pos-cam)**2).sum(axis=-1)**0.5
|
dist = ((pos-cam)**2).sum(axis=-1)**0.5
|
||||||
else:
|
else:
|
||||||
dist = (pos-cam).length()
|
dist = (pos-cam).length()
|
||||||
xDist = dist * 2. * tan(0.5 * self.opts['fov'] * np.pi / 180.)
|
xDist = dist * 2. * tan(0.5 * radians(self.opts['fov']))
|
||||||
return xDist / self.width()
|
return xDist / self.width()
|
||||||
|
|
||||||
def mousePressEvent(self, ev):
|
def mousePressEvent(self, ev):
|
||||||
|
Loading…
Reference in New Issue
Block a user