$vertices, 'faces' => $faces); } function ppc3d_tetrahedron_volume($v0, $v1, $v2) { $volume = (1 / 6) * abs( $v0[1] * ($v1[2] * $v2[3] - $v2[2] * $v1[3]) + $v1[1] * ($v2[2] * $v0[3] - $v0[2] * $v2[3]) + $v2[1] * ($v0[2] * $v1[3] - $v1[2] * $v0[3]) ); return $volume; } function ppc3d_calculate_stl_volume($parsed_data, $unit, $scale, $layer_height_mm, $printer_speed_mm_per_s) { // `ppc3d_parse_stl_file` already applied unit/scale to vertices, // use the parsed vertices directly to avoid double-scaling. $scaled_vertices = $parsed_data['vertices']; $total_volume = 0; foreach ($parsed_data['faces'] as $faceVertices) { $v0 = $scaled_vertices[$faceVertices[0]]; $v1 = $scaled_vertices[$faceVertices[1]]; $v2 = $scaled_vertices[$faceVertices[2]]; $tetrahedron_volume = ppc3d_tetrahedron_volume($v0, $v1, $v2); if ($tetrahedron_volume !== false) { $total_volume += $tetrahedron_volume; } else { // Handle error in volume calculation return false; } } $total_volume_cm3 = $total_volume / 1000.0; return $total_volume_cm3; } function ppc3d_calculate_printing_time($parsed_data, $layer_height, $printer_speed) { $max_z = max(array_map(function ($vertex) { return $vertex[2]; }, $parsed_data['vertices'])); $num_layers = ceil($max_z / $layer_height); $printing_time_hours = ($num_layers * $layer_height) / $printer_speed; return $printing_time_hours; } function ppc3d_calculate_total_grams($parsed_data) { $density = PPC3D_MATERIAL_DENSITY; // grams per cubic centimeter (g/cm³) $total_volume_mm3 = 0; foreach ($parsed_data['faces'] as $faceVertices) { $v0 = $parsed_data['vertices'][$faceVertices[0]]; $v1 = $parsed_data['vertices'][$faceVertices[1]]; $v2 = $parsed_data['vertices'][$faceVertices[2]]; $tetrahedron_volume = ppc3d_tetrahedron_volume($v0, $v1, $v2); if ($tetrahedron_volume === false) { return false; } $total_volume_mm3 += $tetrahedron_volume; } // Convert mm³ to cm³ and multiply by density (g/cm³) $total_volume_cm3 = $total_volume_mm3 / 1000.0; return $total_volume_cm3 * $density; } function ppc3d_calculate_triangle_surface_area($v0, $v1, $v2) { $a = sqrt(pow($v1[1] - $v0[1], 2) + pow($v1[2] - $v0[2], 2) + pow($v1[3] - $v0[3], 2)); $b = sqrt(pow($v2[1] - $v1[1], 2) + pow($v2[2] - $v1[2], 2) + pow($v2[3] - $v1[3], 2)); $c = sqrt(pow($v0[1] - $v2[1], 2) + pow($v0[2] - $v2[2], 2) + pow($v0[3] - $v2[3], 2)); $s = ($a + $b + $c) / 2; $area = sqrt($s * ($s - $a) * ($s - $b) * ($s - $c)); return $area; }