mirror of
https://github.com/snowykami/mbcp.git
synced 2024-11-23 14:55:04 +08:00
205 lines
3.2 KiB
Markdown
205 lines
3.2 KiB
Markdown
---
|
||
title: mbcp.mp_math.utils
|
||
---
|
||
### *def* `clamp()`
|
||
|
||
|
||
区间截断函数。
|
||
|
||
参数:
|
||
|
||
x:
|
||
|
||
min_:
|
||
|
||
max_:
|
||
|
||
|
||
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def clamp(x: float, min_: float, max_: float) -> float:
|
||
"""
|
||
区间截断函数。
|
||
Args:
|
||
x:
|
||
min_:
|
||
max_:
|
||
|
||
Returns:
|
||
限制后的值
|
||
"""
|
||
return max(min(x, max_), min_)
|
||
```
|
||
</details>
|
||
|
||
### *def* `approx(x: float = 0.0, y: float = APPROX)`
|
||
|
||
|
||
判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
|
||
|
||
参数:
|
||
|
||
x:
|
||
|
||
y:
|
||
|
||
epsilon:
|
||
|
||
|
||
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def approx(x: float, y: float=0.0, epsilon: float=APPROX) -> bool:
|
||
"""
|
||
判断两个数是否近似相等。或包装一个实数,用于判断是否近似于0。
|
||
Args:
|
||
x:
|
||
y:
|
||
epsilon:
|
||
|
||
Returns:
|
||
是否近似相等
|
||
"""
|
||
return abs(x - y) < epsilon
|
||
```
|
||
</details>
|
||
|
||
### *def* `sign(x: float = False)`
|
||
|
||
|
||
获取数的符号。
|
||
|
||
参数:
|
||
|
||
x: 数
|
||
|
||
only_neg: 是否只返回负数的符号
|
||
|
||
|
||
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def sign(x: float, only_neg: bool=False) -> str:
|
||
"""获取数的符号。
|
||
Args:
|
||
x: 数
|
||
only_neg: 是否只返回负数的符号
|
||
Returns:
|
||
符号 + - ""
|
||
"""
|
||
if x > 0:
|
||
return '+' if not only_neg else ''
|
||
elif x < 0:
|
||
return '-'
|
||
else:
|
||
return ''
|
||
```
|
||
</details>
|
||
|
||
### *def* `sign_format(x: float = False)`
|
||
|
||
|
||
格式化符号数
|
||
-1 -> -1
|
||
1 -> +1
|
||
0 -> ""
|
||
|
||
参数:
|
||
|
||
x: 数
|
||
|
||
only_neg: 是否只返回负数的符号
|
||
|
||
|
||
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def sign_format(x: float, only_neg: bool=False) -> str:
|
||
"""格式化符号数
|
||
-1 -> -1
|
||
1 -> +1
|
||
0 -> ""
|
||
Args:
|
||
x: 数
|
||
only_neg: 是否只返回负数的符号
|
||
Returns:
|
||
符号 + - ""
|
||
"""
|
||
if x > 0:
|
||
return f'+{x}' if not only_neg else f'{x}'
|
||
elif x < 0:
|
||
return f'-{abs(x)}'
|
||
else:
|
||
return ''
|
||
```
|
||
</details>
|
||
|
||
### ***class*** `Approx`
|
||
|
||
- #### *def* `__init__(self, value: RealNumber)`
|
||
|
||
- #
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def __init__(self, value: RealNumber):
|
||
self.value = value
|
||
```
|
||
</details>
|
||
|
||
- #### *def* `__eq__(self, other)`
|
||
|
||
- #
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def __eq__(self, other):
|
||
if isinstance(self.value, (float, int)):
|
||
if isinstance(other, (float, int)):
|
||
return abs(self.value - other) < APPROX
|
||
else:
|
||
self.raise_type_error(other)
|
||
elif isinstance(self.value, Vector3):
|
||
if isinstance(other, (Vector3, Point3, Plane3, Line3)):
|
||
return all([approx(self.value.x, other.x), approx(self.value.y, other.y), approx(self.value.z, other.z)])
|
||
else:
|
||
self.raise_type_error(other)
|
||
```
|
||
</details>
|
||
|
||
- #### *def* `raise_type_error(self, other)`
|
||
|
||
- #
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def raise_type_error(self, other):
|
||
raise TypeError(f'Unsupported type: {type(self.value)} and {type(other)}')
|
||
```
|
||
</details>
|
||
|
||
- #### *def* `__ne__(self, other)`
|
||
|
||
- #
|
||
<details>
|
||
<summary>源码</summary>
|
||
|
||
```python
|
||
def __ne__(self, other):
|
||
return not self.__eq__(other)
|
||
```
|
||
</details>
|
||
|