Загрузка данных



# Решение задачи 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)