ШАРЫ 5

#include "stdafx.h" #include <stdio.h> #include <math.h> #include <conio.h> const int M = 10; struct ball // тип вводимых данных о шаре: координаты его центра и радиус { float x; float y; float z; float rad; }; // расстояние между двумя центрами float r0(ball a1, ball a2) { float r; r = sqrt(fabs((a1.x - a2.x)*(a1.x - a2.x) + (a1.y - a2.y)*(a1.y - a2.y) + (a1.z - a2.z)*(a1.z - a2.z))); return (r); } // построение направляющего вектора прямой, содержащей 2 заданные точки ball vect(ball o1, ball o2) { ball e1; float R; R = r0(o1, o2); // нормировка вектора e1.x = (o2.x - o1.x) / R; e1.y = (o2.y - o1.y) / R; e1.z = (o2.z - o1.z) / R; e1.rad = 0; return e1; } void main() { ball A1, A2, v0; float R; scanf_s("%f%f%f%f", &A1.x, &A1.y, &A1.z, &A1.rad); printf("x2 y2 z2 rad2: \n"); scanf_s("%f%f%f%f", &A2.x, &A2.y, &A2.z, &A2.rad); R = r0(A1, A2); v0.rad = 0; v0.x = A2.x - A1.x; v0.x = v0.x / R; v0.y = A2.y - A1.y; v0.y = v0.y / R; v0.z = A2.z - A1.z; v0.z = v0.z / R; printf("v0: %.3f %.3f %.3f \n", v0.x, v0.y, v0.z); printf("R: %.3f \n", R); ball v1, v2; v1.x = v0.x*A1.rad; v1.y = v0.y*A1.rad; v1.z = v0.z*A1.rad; printf("r1: %.3f \n", r0(v1, A2)); if (r0(v1, A2) < R) { v1.x = -v0.x*A1.rad; v1.y = -v0.y*A1.rad; v1.z = -v0.z*A1.rad; }; v2.x = v0.x*A2.rad; v2.y = v0.y*A2.rad; v2.z = v0.z*A2.rad; printf("r2: %.3f \n", r0(v2, A1)); if (r0(v2, A1) < R) { v2.x = -v0.x*A2.rad; v2.y = -v0.y*A2.rad; v2.z = -v0.z*A2.rad; }; printf("v1: %.3f %.3f %.3f \n", v1.x, v1.y, v1.z); printf("v2: %.3f %.3f %.3f \n", v2.x, v2.y, v2.z); getch(); } /* void main() { ball A1, A2, v1, v2; float answ; int i; printf("x1 y1 z1 rad1: \n"); scanf_s("%f%f%f%f", &A1.x, &A1.y, &A1.z, &A1.rad); printf("x2 y2 z2 rad2: \n"); scanf_s("%f%f%f%f", &A2.x, &A2.y, &A2.z, &A2.rad); answ=r0(A1, A2); v1 = vect(A1, A2); v2.x = v1.x*answ; v2.y = v1.y*answ; v2.z = v1.z*answ; printf("r0 = %f \n", answ); printf(" %.0f %.0f %.0f \n", v1.x, v1.y, v1.z); printf(" %.0f %.0f %.0f \n", v2.x, v2.y, v2.z); getch(); } void main() { ball A[M], B1, B2, ANSW; //искомый шар float max; //максимальное расстояние между центрами плюс радиусы int i, j, n; max = 0; scanf("%i", &n); for (i = 0; i < n; i++) { A[i].rad = 0; A[i].x = 0; A[i].y = 0; A[i].z = 0; } printf("x y z rad: \n"); for (i = 0; i < n; i++) { scanf("%f%f%f%f", &A[i].x, &A[i].y, &A[i].z, &A[i].rad); } if (n == 1) { ANSW = A[0]; printf("(%.0f,%.0f,%.0f), r = %.2f \n", ANSW.x, ANSW.y, ANSW.z, ANSW.rad); } else { for (i = 0; i < n; i++) { for (j = 0; j < n; j++) //поиск максимального расстояния между центрами + радиусы if ((A[i].rad + A[j].rad + r0(A[i], A[j]))>max) { max = A[i].rad + A[j].rad + r0(A[i], A[j]); B1 = A[i]; B2 = A[j]; } } // нашли 2 максимально удаленных друг от друга шара. найдем искомый шар ball v0, v1, v2; v0 = vect(B1, B2); //направляющий вектор прямой, соединяющий 2 точки (с началом в В1) v1.x = v0.x + B1.rad; v1.y = v0.y + B1.rad; v1.z = v0.z + B1.rad; if (r0(v1, B2) < r0(B1, B2)) v1.x = v1.x - 2 * B1.rad; v1.y = v1.y - 2 * B1.rad; v1.z = v1.z - 2 * B1.rad; // проверяем, правильно ли направлен вектор v1 v2.x = v0.x + B2.rad; v2.y = v0.y + B2.rad; v2.z = v0.z + B2.rad; if (r0(v1, B1) < r0(B1, B2)) v2.x = v2.x - 2 * B2.rad; v2.y = v2.y - 2 * B2.rad; v2.z = v2.z - 2 * B2.rad; // проверяем, правильно ли направлен вектор v1 ANSW.rad = r0(v1, v2); ball v3; v3 = vect(v1, v2); v3.x = (v3.x*r0(v1, v2)) / 2; v3.y = (v3.y*r0(v1, v2)) / 2; v3.z = (v3.z*r0(v1, v2)) / 2; if (r0(v3, v1) != r0(v3, v2)) { v3 = vect(v2, v1); v3.x = (v3.x*r0(v1, v2)) / 2; v3.y = (v3.y*r0(v1, v2)) / 2; v3.z = (v3.z*r0(v1, v2)) / 2; } ANSW.x = v3.x; ANSW.y = v3.y; ANSW.z = v3.z; printf(" %.0f %.0f %.0f %.2f \n", ANSW.x, ANSW.y, ANSW.z, ANSW.rad); printf("x y z rad: \n"); } getch(); }*/

Be the first to comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.