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