Загрузка данных
# Решение задачи 17 на Python
# Задача: обработка тетраэдров из файла
code = '''
import math
import sys
def parse_tetrahedron(line):
"""Парсит строку с 12 числами, возвращает 4 точки (x,y,z)"""
nums = list(map(float, line.strip().split()))
if len(nums) != 12:
return None
points = []
for i in range(4):
points.append((nums[i*3], nums[i*3+1], nums[i*3+2]))
return points
def vec_sub(a, b):
"""Векторное вычитание"""
return (a[0]-b[0], a[1]-b[1], a[2]-b[2])
def vec_cross(a, b):
"""Векторное произведение"""
return (a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0])
def vec_dot(a, b):
"""Скалярное произведение"""
return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]
def vec_len(v):
"""Длина вектора"""
return math.sqrt(v[0]**2 + v[1]**2 + v[2]**2)
def tetrahedron_volume(points):
"""
Объем тетраэдра через смешанное произведение.
V = |AB · (AC × AD)| / 6
"""
A, B, C, D = points
AB = vec_sub(B, A)
AC = vec_sub(C, A)
AD = vec_sub(D, A)
cross = vec_cross(AC, AD)
mixed = vec_dot(AB, cross)
return abs(mixed) / 6.0
def centroid(points):
"""Центроид тетраэдра — среднее арифметическое координат вершин"""
cx = sum(p[0] for p in points) / 4.0
cy = sum(p[1] for p in points) / 4.0
cz = sum(p[2] for p in points) / 4.0
return (cx, cy, cz)
def distance_from_origin(point):
"""Расстояние от начала координат"""
return math.sqrt(point[0]**2 + point[1]**2 + point[2]**2)
def face_normal(points, i, j, k):
"""
Нормаль к грани (Pi, Pj, Pk).
Возвращает нормализованный вектор нормали.
"""
Pi, Pj, Pk = points[i], points[j], points[k]
v1 = vec_sub(Pj, Pi)
v2 = vec_sub(Pk, Pi)
n = vec_cross(v1, v2)
ln = vec_len(n)
if ln < 1e-12:
return (0.0, 0.0, 0.0)
return (n[0]/ln, n[1]/ln, n[2]/ln)
def dihedral_cosine(points):
"""
Косинус двугранного угла между гранями (P1,P2,P3) и (P1,P2,P4).
Используем нормали к граням.
"""
# Грань 1: P1, P2, P3
n1 = face_normal(points, 0, 1, 2)
# Грань 2: P1, P2, P4
n2 = face_normal(points, 0, 1, 3)
dot = vec_dot(n1, n2)
# Ограничиваем значение из-за погрешностей
dot = max(-1.0, min(1.0, dot))
return dot
def process_file(filepath, epsilon=1e-9):
"""
Основная функция обработки файла.
"""
valid_tetrahedrons = []
volumes = []
with open(filepath, 'r') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
points = parse_tetrahedron(line)
if points is None:
print(f"Пропуск строки {line_num}: неверный формат")
continue
vol = tetrahedron_volume(points)
if vol < epsilon:
# Вырожденный тетраэдр — пропускаем
continue
valid_tetrahedrons.append(points)
volumes.append(vol)
if not valid_tetrahedrons:
print("Нет невырожденных тетраэдров в файле.")
return
# Находим тетраэдр с центроидом на наибольшем расстоянии от начала координат
max_dist = -1.0
best_tetra = None
best_centroid = None
for points in valid_tetrahedrons:
cent = centroid(points)
dist = distance_from_origin(cent)
if dist > max_dist:
max_dist = dist
best_tetra = points
best_centroid = cent
# Вычисляем косинус двугранного угла для найденного тетраэдра
cos_angle = dihedral_cosine(best_tetra)
# Средний объем
avg_volume = sum(volumes) / len(volumes)
print(f"Количество невырожденных тетраэдров: {len(valid_tetrahedrons)}")
print(f"Центроид тетраэдра с максимальным удалением: ({best_centroid[0]:.6f}, {best_centroid[1]:.6f}, {best_centroid[2]:.6f})")
print(f"Расстояние центроида от начала координат: {max_dist:.6f}")
print(f"Косинус двугранного угла: {cos_angle:.10f}")
print(f"Средний объем всех невырожденных тетраэдров: {avg_volume:.10f}")
return cos_angle, avg_volume
# Пример использования:
if __name__ == "__main__":
if len(sys.argv) > 1:
filepath = sys.argv[1]
else:
filepath = "tetrahedrons.txt"
process_file(filepath)
'''
with open('/mnt/agents/output/task17.py', 'w') as f:
f.write(code)
print("Код сохранен в task17.py")
print(code)