ШАРЫ 3

// ГЕОМЕТРИЯ ШАРЫ #include "stdafx.h" #include <stdio.h> #include <math.h> struct ball // тип вводимых данных о шаре: координаты его центра и радиус { double x; double y; double z; double rad; }; struct vector // вектор в его координатах { double x; double y; double z; }; // возвращает расстояние между центрами BALL double r0(ball a1, ball a2) { double r0; r0 = 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 (r0); } // возвращает расстояние между центрами VECTOR double r0vec(vector a1, vector a2) { double r0; r0 = 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 (r0); } // возвращает расстояние между центрами BALL-VECTOR double r0ballvec(vector a1, ball a2) { double r0vec; r0vec = 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 (r0vec); } // построение направляющего вектора прямой, содержащей 2 заданные точки vector vect(vector o1, vector o2) { vector e1; double R; R = sqrt(fabs((o1.x - o2.x)*(o1.x - o2.x) + (o1.y - o2.y)*(o1.y - o2.y) + (o1.z - o2.z)*(o1.z - o2.z))); // нормировка вектора e1.x = (o2.x - o1.x) / R; e1.y = (o2.y - o1.y) / R; e1.z = (o2.z - o1.z) / R; return e1; } // приложение вектора к точке, выдает конец построенного вектора vector scADD(vector dot, vector vec) { vector aux; aux.x = dot.x + vec.x; aux.y = dot.y + vec.y; aux.z = dot.z + vec.z; return aux; } // определяет координаты центра окружности, охватывающей 2 заданных шара ball res(ball ballO1, ball ballO2) { vector e0, vecO1, vecO2, OplusR1, OplusR2, // концы нужного отрезка e1, e2; // векторы нужного направления соотв окружностей ball res1; vecO1.x = ballO1.x; vecO1.y = ballO1.y; vecO1.z = ballO1.z; vecO2.x = ballO2.x; vecO2.y = ballO2.y; vecO2.z = ballO2.z; e0 = vect(vecO1, vecO2); { e1.x = e0.x * ballO1.rad; e1.y = e0.y * ballO1.rad; e1.z = e0.z * ballO1.rad; } { e2.x = e0.x * ballO2.rad; e2.y = e0.y * ballO2.rad; e2.z = e0.z * ballO2.rad; } OplusR1 = vect(vecO1, e1); // проверяется, правильно ли направлен вектор if (r0ballvec(OplusR1, ballO1) < r0(ballO1, ballO2)) { e1.x = -2 * (e0.x * ballO1.rad); e1.y = -2 * (e0.y * ballO1.rad); e1.z = -2 * (e0.z * ballO1.rad); OplusR1 = vect(vecO1, e1); } OplusR2 = vect(vecO2, e2); if (r0ballvec(OplusR2, ballO2) < r0(ballO1, ballO2)) { e2.x = -2 * (e0.x * ballO2.rad); e2.y = -2 * (e0.y * ballO2.rad); e2.z = -2 * (e0.z * ballO2.rad); OplusR1 = vect(vecO2, e2); } res1.rad = r0vec(OplusR1, OplusR2); res1.x = OplusR1.x - OplusR2.x; res1.y = OplusR1.y - OplusR2.y; res1.z = OplusR1.z - OplusR2.z; return res1; } void main() { int n; int i, j; ball ANSW; ball A[1000]; ball sphere; double x, y, z, rad; double max1; // максимальное расстояние между радиусами max1 = 0; printf("enter the number of spheres: "); scanf("%i", &n);// кол-во всего шаров for (i = 0; i < n; i++) // занесли все шары в массив { printf("enter the (x,y,z) coordinates of the sphere numer %i and it's radius \n", i); scanf("%d%d%d%d", &x, &y, &z, &rad); // считали координаты всех шаров и их радиусы A[i].x = x; A[i].y = y; A[i].z = z; A[i].rad = rad; } if (n == 1) { ANSW = A[0]; printf("your desired sphere is: \n"); printf("(%d,%d,%d) with R = %d ", ANSW.x, ANSW.y, ANSW.z, ANSW.rad); // случай, когда вводится 1 шар } 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])) > max1) // если сумма радиусов + расстояние между ними больше max { max1 = A[i].rad + A[j].rad + r0(A[i], A[j]); ANSW = res(A[i], A[j]); } } printf("your desired sphere is: \n"); printf("(%d,%d,%d) with R = %d ", ANSW.x, ANSW.y, ANSW.z, ANSW.rad); } } scanf("%i", &n); }

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.