[StatisticsPen] Some more (probably over-) optimization
This commit is contained in:
parent
8335af0d1d
commit
a02a429573
@ -8,48 +8,54 @@ __all__ = ["StatisticsPen"]
|
|||||||
|
|
||||||
class StatisticsPen(MomentsPen):
|
class StatisticsPen(MomentsPen):
|
||||||
|
|
||||||
# Center of mass
|
def __init__(self, glyphset=None):
|
||||||
# https://en.wikipedia.org/wiki/Center_of_mass#A_continuous_volume
|
MomentsPen.__init__(self, glyphset=glyphset)
|
||||||
@property
|
self.__zero()
|
||||||
def meanX(self):
|
|
||||||
return self.momentX / self.area if self.area else 0
|
|
||||||
@property
|
|
||||||
def meanY(self):
|
|
||||||
return self.momentY / self.area if self.area else 0
|
|
||||||
|
|
||||||
# Var(X) = E[X^2] - E[X]^2
|
def _closePath(self):
|
||||||
@property
|
MomentsPen._closePath(self)
|
||||||
def varianceX(self):
|
self.__update()
|
||||||
return self.momentXX / self.area - self.meanX**2 if self.area else 0
|
|
||||||
@property
|
|
||||||
def varianceY(self):
|
|
||||||
return self.momentYY / self.area - self.meanY**2 if self.area else 0
|
|
||||||
|
|
||||||
@property
|
def __zero(self):
|
||||||
def stddevX(self):
|
self.meanX = 0
|
||||||
variance = self.varianceX
|
self.meanY = 0
|
||||||
return math.copysign(abs(variance)**.5, variance)
|
self.varianceX = 0
|
||||||
@property
|
self.varianceY = 0
|
||||||
def stddevY(self):
|
self.stddevX = 0
|
||||||
variance = self.varianceY
|
self.stddevY = 0
|
||||||
return math.copysign(abs(variance)**.5, variance)
|
self.covariance = 0
|
||||||
|
self.correlation = 0
|
||||||
|
self.slant = 0
|
||||||
|
|
||||||
# Covariance(X,Y) = ( E[X.Y] - E[X]E[Y] )
|
def __update(self):
|
||||||
@property
|
|
||||||
def covariance(self):
|
|
||||||
return self.momentXY / self.area - self.meanX*self.meanY if self.area else 0
|
|
||||||
|
|
||||||
# Correlation(X,Y) = Covariance(X,Y) / ( stddev(X) * stddev(Y) )
|
area = self.area
|
||||||
# https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
|
if not area:
|
||||||
@property
|
self.__zero()
|
||||||
def correlation(self):
|
return
|
||||||
correlation = self.covariance / (self.stddevX * self.stddevY) if self.area else 0
|
|
||||||
return correlation if abs(correlation) > 1e-3 else 0
|
|
||||||
|
|
||||||
@property
|
# Center of mass
|
||||||
def slant(self):
|
# https://en.wikipedia.org/wiki/Center_of_mass#A_continuous_volume
|
||||||
slant = self.covariance / self.varianceY if self.area else 0
|
self.meanX = meanX = self.momentX / area
|
||||||
return slant if abs(slant) > 1e-3 else 0
|
self.meanY = meanY = self.momentY / area
|
||||||
|
|
||||||
|
# Var(X) = E[X^2] - E[X]^2
|
||||||
|
self.varianceX = varianceX = self.momentXX / area - meanX**2
|
||||||
|
self.varianceY = varianceY = self.momentYY / area - meanY**2
|
||||||
|
|
||||||
|
self.stddevX = stddevX = math.copysign(abs(varianceX)**.5, varianceX)
|
||||||
|
self.stddevY = stddevY = math.copysign(abs(varianceY)**.5, varianceY)
|
||||||
|
|
||||||
|
# Covariance(X,Y) = ( E[X.Y] - E[X]E[Y] )
|
||||||
|
self.covariance = covariance = self.momentXY / area - meanX*meanY
|
||||||
|
|
||||||
|
# Correlation(X,Y) = Covariance(X,Y) / ( stddev(X) * stddev(Y) )
|
||||||
|
# https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
|
||||||
|
correlation = covariance / (stddevX * stddevY)
|
||||||
|
self.correlation = correlation if abs(correlation) > 1e-3 else 0
|
||||||
|
|
||||||
|
slant = covariance / varianceY
|
||||||
|
self.slant = slant if abs(slant) > 1e-3 else 0
|
||||||
|
|
||||||
|
|
||||||
def _test(glyphset, upem, glyphs):
|
def _test(glyphset, upem, glyphs):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user