#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.