BALLS FINAL

#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 A1, ball A2) { ball v0; float R; R = r0(A1, A2); // нормировка вектора 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; return v0; } // нахождение центра описанной окружности ball circum(ball a, ball b, ball c) { ball res, A1, A2; float r_ab, r_ac, r_bc; r_ab = r0(a, b); r_ac = r0(a, c); r_bc = r0(b, c); //проверим, что точки не лежат на одой прямой if (r_ab == r_ac + r_bc) { A1 = a; A2 = b; } if (r_ac == r_ab + r_bc) { A1 = a; A2 = c; } if (r_bc == r_ab + r_ac) { A1 = a; A2 = c; } ball v0, v1, v2; v0 = vect(A1, A2); //радиус-вектор первого шара v1.x = A1.x + v0.x*A1.rad; v1.y = A1.y + v0.y*A1.rad; v1.z = A1.z + v0.z*A1.rad; if (r0(v1, A2) < R) //поворот вектора в другую сторону, если он направлен к центру { v1.x = A1.x - v0.x*A1.rad; v1.y = A1.y - v0.y*A1.rad; v1.z = A1.z - v0.z*A1.rad; }; //радиус-вектор второго шара v2.x = A2.x + v0.x*A2.rad; v2.y = A2.y + v0.y*A2.rad; v2.z = A2.z + v0.z*A2.rad; if (r0(v2, A1) < R) //поворот вектора в другую сторону, если он направлен к центру { v2.x = A2.x - v0.x*A2.rad; v2.y = A2.y - v0.y*A2.rad; v2.z = A2.z - v0.z*A2.rad; }; res.rad = r0(v1, v2) / 2; res.x = v1.x + (v2.x - v1.x) / 2; res.y = v1.y + (v2.y - v1.y) / 2; res.z = v1.z + (v2.z - v1.z) / 2; } void main() { int n, i, j; ball BALLS[M], A1, A2, v0, res; ball v1, v2; float R, max1, max2; printf("n = "); scanf("%i", &n); printf("\n"); max1 = -1; max2 = -1; for (i = 0; i < n; i++) scanf_s("%f%f%f%f", &BALLS[i].x, &BALLS[i].y, &BALLS[i].z, &BALLS[i].rad); //если занесен 1 шар if (n == 1) printf("RESULT: %.3f %.3f %.3f %.3f\n", BALLS[0].x, BALLS[0].y, BALLS[0].z, BALLS[0].rad); //если занесено 2 шара if (n == 2) { A1 = BALLS[0]; A2 = BALLS[1]; v0 = vect(A1, A2); //радиус-вектор первого шара v1.x = A1.x + v0.x*A1.rad; v1.y = A1.y + v0.y*A1.rad; v1.z = A1.z + v0.z*A1.rad; if (r0(v1, A2) < R) //поворот вектора в другую сторону, если он направлен к центру { v1.x = A1.x - v0.x*A1.rad; v1.y = A1.y - v0.y*A1.rad; v1.z = A1.z - v0.z*A1.rad; }; //радиус-вектор второго шара v2.x = A2.x + v0.x*A2.rad; v2.y = A2.y + v0.y*A2.rad; v2.z = A2.z + v0.z*A2.rad; if (r0(v2, A1) < R) //поворот вектора в другую сторону, если он направлен к центру { v2.x = A2.x - v0.x*A2.rad; v2.y = A2.y - v0.y*A2.rad; v2.z = A2.z - v0.z*A2.rad; }; res.rad = r0(v1, v2) / 2; res.x = v1.x + (v2.x - v1.x) / 2; res.y = v1.y + (v2.y - v1.y) / 2; res.z = v1.z + (v2.z - v1.z) / 2; printf("RESULT: %.3f %.3f %.3f %.3f\n", res.x, res.y, res.z, res.rad); } //если больше двух шаров, ищем новый, который выходит за пределы уже построенного и строим итоговый if (n>2) for (i = 2; i <= n; i++) if (res.rad + r0(res, BALLS[i]) + BALLS[i].rad > 2 * res.rad) //если новый выходит за пределы построенного { v0 = vect(res, BALLS[i]); v1.x = BALLS[i].x + v0.x*BALLS[i].rad; v1.y = BALLS[i].y + v0.y*BALLS[i].rad; v1.z = BALLS[i].z + v0.z*BALLS[i].rad; if (r0(v1, res) < R) { v1.x = BALLS[i].x - v0.x*BALLS[i].rad; v1.y = BALLS[i].y - v0.y*BALLS[i].rad; v1.z = BALLS[i].z - v0.z*BALLS[i].rad; }; v2.x = res.x + v0.x*res.rad; v2.y = res.y + v0.y*res.rad; v2.z = res.z + v0.z*res.rad; if (r0(v2, BALLS[i]) < R) { v2.x = res.x - v0.x*res.rad; v2.y = res.y - v0.y*res.rad; v2.z = res.z - v0.z*res.rad; }; res.rad = r0(v1, v2) / 2; res.x = v1.x + (v2.x - v1.x) / 2; res.y = v1.y + (v2.y - v1.y) / 2; res.z = v1.z + (v2.z - v1.z) / 2; } printf("RESULT: %.3f %.3f %.3f %.3f\n", res.x, res.y, res.z, res.rad); 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.