Консультация № 189359
13.05.2016, 20:26
0.00 руб.
0 3 1
Уважаемые эксперты! Пожалуйста,помогите с реализацией на Си, желательно с комментариями строк:

Задано множество m точек в трёхмерном пространстве.
Найти такую из них, что шар заданного радиуса с центром в этой точке
содержит максимальное число точек множества.

Обсуждение

давно
Посетитель
7438
7205
14.05.2016, 12:24
общий
это ответ
Здравствуйте, dasha.com!
Вот такая получилась программка...
[code h=200]
/*
Задано множество m точек в трёхмерном пространстве.
Найти такую из них, что шар заданного радиуса с центром в этой точке
содержит максимальное число точек множества
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <math.h>
#include <windows.h>

typedef struct _point
{
double x;
double y;
double z;
}point;

// Вычисляет расстояние между точками
double distance(point a, point b)
{
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y) + (a.z - b.z)*(a.z - b.z));
}

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int i, j, m, r, n, max, imax;
printf("Введите число точек m: ");
scanf("%d", &m);
printf("Введите радиус r: ");
scanf("%d", &r);

point* p = (point*)malloc(m*sizeof(point)); //массив точек

srand(time(NULL)); //инициируем генератор псевдослучайных чисел

for(i=0; i<m; i++) //заполним массив координат случайными дробными числами
{ // в интервале [-100,99]
// чтобы было число дробное, делим на случайное число [1,9]
// +1, чтобы не было деления на 0
p[i].x = (double)((rand()%200) - 100) / ((rand()%9)+1);
p[i].y = (double)((rand()%200) - 100) / ((rand()%9)+1);
p[i].z = (double)((rand()%200) - 100) / ((rand()%9)+1);
}

for(i=0; i<m; i++) //по всем точкам
{
for(n=j=0; j<m; j++) //считаем расстояние от i-й до всех остальных
{ // и считаем те, которые ближе, чем радиус r
if (j!=i) //исключаем из расчета i-ю точку
n += distance(p[i], p[j]) <= r; //если расстояние меньше r, то прибавится 1
}
if (i==0)
{
max = n; //количество для первой точки сохраняем, как максимальное
imax = i; //сохраним индекс центра
}
else if (max < n) //для всех остальных сравниваем с максимумом
{
max = n; //новый максимум
imax = i; //индекс нового центра
}
}
if (max == 0) //если окажется, что не найдено ни одной точки, ближе, чем на r
printf("Точки не найдены\n");
else //выводим результат
printf("Центр шара: x = %.2f, y = %.2f, z = %.2f\nЧисло точек внутри = %d\n",
p[imax].x, p[imax].y, p[imax].z, max);

free(p); //освободим память под массив точек
return 0;
}
[/code]

5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400315
5
15.05.2016, 19:38
общий
15.05.2016, 19:40
Пожалуйста, напишите идею решения задачи словами, так как не совсем поняла!
давно
Посетитель
7438
7205
15.05.2016, 20:09
общий
Адресаты:
Делаем следующее:
1) Вводим число точек и радиус шара
2) Строим динамический массив точек указанного размера m.
Заполняем его случайными вещественными числами из диапазона [-100,99]
3) Далее, в цикле по всем точкам ищем расстояние от текущей точки до
всех остальных. И если это расстояние меньше заданного r, то значит эта точка
попадает в шар с центром в текущей точке и радиуса r. Считаем такие точки.
4) Ищем точку, для которой количество "внутренних" точек максимальное.
Одновременно запоминаем и индекс точки-центра шара
Для самой первой точки считаем сразу, как максимальное, чтобы было с чем сравнивать.
5) Расстояние между двумя точками ищется по формуле [$8730$]((x1-x2)2+(y1-y2)2+(z1-z2)2)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа