Files
rtdd/behavior_pack_v8jz0zSR/Script_NeteaseModousIY5aSF/BlueFoxTools/SpecialFunciton/BlueFoxMath.py
T
2026-09-28 11:18:26 +08:00

117 lines
2.8 KiB
Python

# coding=utf-8
import time
from math import *
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