ModelTranslator: UV 岛数/翻转/利用率纯逻辑(TDD)
This commit is contained in:
@@ -24,6 +24,38 @@ def within_tolerance(target, actual, tol=TOLERANCE):
|
||||
return abs(actual - target) <= target * tol
|
||||
|
||||
|
||||
UV_BAD_TOL = 0.02 # 质量门:UV 翻转/重叠面占比超此值则回退 smart_project
|
||||
|
||||
|
||||
def count_islands(n_faces, adjacent_pairs):
|
||||
"""union-find 数 UV 岛:n_faces 个面,adjacent_pairs 为 UV 连续的面索引对。"""
|
||||
parent = list(range(n_faces))
|
||||
|
||||
def find(i):
|
||||
while parent[i] != i:
|
||||
parent[i] = parent[parent[i]]
|
||||
i = parent[i]
|
||||
return i
|
||||
|
||||
for a, b in adjacent_pairs:
|
||||
ra, rb = find(a), find(b)
|
||||
if ra != rb:
|
||||
parent[ra] = rb
|
||||
return len({find(i) for i in range(n_faces)})
|
||||
|
||||
|
||||
def flipped_fraction(signed_areas):
|
||||
"""UV 面签名面积为负(翻转)的占比。"""
|
||||
if not signed_areas:
|
||||
return 0.0
|
||||
return sum(1 for a in signed_areas if a < 0) / float(len(signed_areas))
|
||||
|
||||
|
||||
def fill_ratio(abs_areas):
|
||||
"""UV 空间利用率:面积和(重叠会虚高,截断到 1.0)。"""
|
||||
return min(1.0, sum(abs_areas))
|
||||
|
||||
|
||||
# ---------------- 以下仅在 Blender 内执行 ----------------
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user