// ГЕОМЕТРИЯ ШАРЫ
#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.x = (o2.y - o1.y) / R;
e1.x = (o2.z - o1.z) / R;
return e1;
}
// приложение вектора к точке, выдает конец построенного вектора
vector scADD(vector dot, vector vec)
{
vector aux;
aux.x = dot.x + vec.x;
aux.x = dot.x + vec.x;
aux.x = dot.x + vec.x;
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 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", &sphere.x, &sphere.y, &sphere.z, &sphere.rad); // считали координаты всех шаров и их радиусы
A[i] = sphere;
}
if (n == 1) printf("%d", A[0].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.