2025-08-26 13:56:12 +08:00
|
|
|
class_name MathTool
|
|
|
|
|
|
2025-09-05 22:23:41 +08:00
|
|
|
static func rate(value: float) -> bool:
|
2025-08-26 13:56:12 +08:00
|
|
|
return randf() < value
|
2026-01-18 15:31:52 +08:00
|
|
|
static func sampleInCircle(radius: float):
|
|
|
|
|
return sampleInRing(0, radius)
|
|
|
|
|
static func sampleInRing(innerRadius: float, outerRadius: float):
|
2025-12-14 15:06:22 +08:00
|
|
|
return Vector2.from_angle(randf_range(0, 2 * PI)) * randf_range(innerRadius, outerRadius)
|
|
|
|
|
static func randomChoiceFrom(array: Array):
|
2025-08-27 21:43:06 +08:00
|
|
|
return array[randi() % array.size()]
|
2026-01-18 15:31:52 +08:00
|
|
|
static func randomChoiceFromWeights(indexes: Array, weights: Array[int]):
|
2025-09-06 18:45:05 +08:00
|
|
|
var totals: Array = []
|
2025-09-06 18:52:58 +08:00
|
|
|
var index = 0
|
2025-09-06 18:45:05 +08:00
|
|
|
for i in indexes:
|
2025-09-06 18:52:58 +08:00
|
|
|
for j in range(weights[index]):
|
2025-09-06 18:45:05 +08:00
|
|
|
totals.append(i)
|
2025-09-06 18:52:58 +08:00
|
|
|
index += 1
|
2025-12-14 15:06:22 +08:00
|
|
|
return randomChoiceFrom(totals)
|
2026-01-18 15:31:52 +08:00
|
|
|
static func toSigned(value: float):
|
2025-08-28 13:58:31 +08:00
|
|
|
return ("+" if value > 0 else "-" if value < 0 else "") + str(abs(value))
|
2025-08-28 15:03:12 +08:00
|
|
|
static func percent(value: float):
|
|
|
|
|
return value / 100
|
2025-09-05 22:23:41 +08:00
|
|
|
static func shrimpRate(value: float):
|
2025-12-14 13:22:35 +08:00
|
|
|
return floor(value) + int(rate(value - floor(value)))
|
2025-09-06 18:33:11 +08:00
|
|
|
static func getClosestIntersection(a: Vector2, b: Vector2, r: float) -> Vector2:
|
|
|
|
|
var ab = b - a
|
|
|
|
|
var distance = ab.length()
|
|
|
|
|
if distance < 0.00001:
|
|
|
|
|
return a + Vector2.RIGHT * r
|
|
|
|
|
var abNormalized = ab / distance
|
|
|
|
|
var distanceB = distance
|
|
|
|
|
if distanceB <= r:
|
|
|
|
|
return b
|
|
|
|
|
var intersection = a + abNormalized * r
|
|
|
|
|
return intersection
|
2025-09-21 14:47:43 +08:00
|
|
|
static func priority(a, b):
|
|
|
|
|
return a if a else b
|