116 lines
2.8 KiB
Python
116 lines
2.8 KiB
Python
# coding=utf-8
|
|
import time
|
|
|
|
|
|
class GraduallySum(object):
|
|
"""
|
|
渐变数
|
|
"""
|
|
|
|
def __init__(self, coefficient, target, initValue):
|
|
self.target = target
|
|
self.coefficient = coefficient
|
|
self.value = initValue
|
|
|
|
def ResetCoefficient(self, newCoefficient):
|
|
self.coefficient = newCoefficient
|
|
|
|
def Refresh(self):
|
|
self.value += self.coefficient * (self.target - self.value)
|
|
|
|
def ResetTarget(self, newTarget):
|
|
self.target = newTarget
|
|
|
|
|
|
class GraduallySumTime(GraduallySum):
|
|
"""
|
|
时间相关渐变数
|
|
"""
|
|
|
|
def __init__(self, coefficient, target, initSum):
|
|
self.time = time.time()
|
|
super(GraduallySumTime, self).__init__(coefficient, target, initSum)
|
|
|
|
def Refresh(self):
|
|
_time = time.time()
|
|
coe = self.coefficient * (_time - self.time)
|
|
# 放置系数过大
|
|
coe = coe if coe < 0.99 else 0.99
|
|
self.value += coe * (self.target - self.value)
|
|
|
|
|
|
def Clamp(value, _min, _max):
|
|
# type:(float,float,float) -> float
|
|
return _max if value > _max else _min if value < _min else value
|
|
|
|
|
|
def ComBin(i, place, result):
|
|
# type:(int,int,int) -> bool
|
|
"""
|
|
提取参数i位于place的结果并于result比较
|
|
例如输入:0b00101,0b10000,0b01110,则会返回false
|
|
"""
|
|
return i & place == result & place
|
|
|
|
|
|
def BinCal(i, place, result):
|
|
# type:(int,int,bool) -> int
|
|
"""
|
|
为参数i设置位于place的result结果
|
|
例如输入:0b00100,0b00101,True
|
|
输出将会是:0b00101
|
|
"""
|
|
return ((i | place) ^ place) | place * result
|
|
|
|
|
|
def CosOfTwoVec(vec1, vec2):
|
|
"""
|
|
获取两个相同维度向量的夹角cos值
|
|
"""
|
|
if vec1.__len__() != vec2.__len__():
|
|
return 0
|
|
nv1 = Normalize(vec1)
|
|
nv2 = Normalize(vec2)
|
|
_ = 0
|
|
for index in range(nv1.__len__()):
|
|
_ += nv1[index] * nv2[index]
|
|
return _
|
|
|
|
|
|
def Normalize(vec):
|
|
# type:(Union[List,Tuple]) -> Union[List,Tuple]
|
|
"""
|
|
将任意维度向量转换为单位向量
|
|
"""
|
|
r = 0
|
|
for _ in vec:
|
|
r += _ ** 2.0
|
|
r = r ** 0.5
|
|
cls = vec.__class__
|
|
return cls([(_ / r) for _ in vec])
|
|
|
|
|
|
def GetTwoPointVec(pos1, pos2):
|
|
# type:(Union[List,Tuple],Union[List,Tuple]) -> Tuple
|
|
"""
|
|
计算任意两点的方向向量, 非单位向量, pos1 -> pos2
|
|
"""
|
|
li = []
|
|
if pos1.__len__() != pos2.__len__():
|
|
return tuple(li)
|
|
for index in range(pos1.__len__()):
|
|
li.append(pos2[index] - pos1[index])
|
|
return tuple(li)
|
|
|
|
|
|
def MatProduct(vec, mat):
|
|
"""
|
|
计算向量或者坐标与矩阵相乘, 需要i=j
|
|
"""
|
|
new = [0.0 for _ in range(vec.__len__())]
|
|
lengthIndex = range(vec.__len__())
|
|
for _ in lengthIndex:
|
|
for __ in lengthIndex:
|
|
new[_] += vec[__] * mat[_][__]
|
|
return new
|