C/C++

Соси++ (с++) Множество точек в трехмерном пространстве и сфера радиуса. СТРУКТУРЫ

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

Писать подобным образом:
#include <iostream>
const int N=5;
int imin,jmin;
struct TPoint {
double x, y;
};
struct TPoint PS[N]={{0,0},{0,2},{1,1},{4,2},{2,4}};
double Dist(TPoint a, TPoint b);
double MinDist(void);
int main() {
double SMin;
SMin=MinDist();
printf("I=%i J=%i S=%6.2f\n",imin,jmin,SMin );
system("pause");
return 0;
}
6
double Dist(TPoint a, TPoint b){
double temp;
temp=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
return temp;
}
double MinDist(void) {
int i,j,k;
double d, SMin;
SMin=Dist(PS[0],PS[1]);
imin=0;
jmin=1;
for (i=0;i<N-1;i++)
for (j=i+1;j<N;j++){
d=Dist(PS[i],PS[j]);
if (d<SMin) {
SMin=d;
imin=i;
jmin=j;
}
}
return SMin;
}
Samir Aliev
Samir Aliev
99
А что тут сложного? Вот так вот можно, например (с n-ным количеством точек, n и координаты точек вводятся с экрана; если есть более одной точки, шар радиуса R в которой содержит максимальное количество из множества М, то находятся и выводятся координаты точки с максимальным индексом):
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
int i, j, n, m, max = 0, imax;
double R, RR;
struct p { double x, y, z; };
cout << "n: ";
cin >> n;
p *M = new p[n];
for (i = 0; i < n; i++)
cin >> M[i].x >> M[i].y >> M[i].z;
cout << "R = ";
cin >> R;
RR = R * R;
for (i = 0; i < n; i++)
{
m = 0;
for (j = 0; j < n; j++)
if (pow(M[j].x - M[i].x, 2) + pow(M[j].y - M[i].y, 2)
+ pow(M[j].z - M[i].z, 2) <= RR) m++;
if (m >= max)
{
max = m;
imax = i;
}
}
cout << "max=" << max << ": " << M[imax].x
<< ' ' << M[imax].y << ' ' << M[imax].z << endl;
system("pause");
return 0;
}
Виталий Бойко
Виталий Бойко
66 572
Лучший ответ
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
using namespace std;
double real(const char* msg, istream& inp = cin) {
cout << msg;
double value;
inp >> value;
inp.ignore(numeric_limits<streamsize>::max(), '\n');
return value;
}
class Point {
public:
Point() : x(0), y(0), z(0) {}
Point(const double x, const double y, const double z) : x(x), y(y), z(z) {}
double length(const Point& p)const {
return sqrt(pow(x - p.x, 2) + pow(y - p.y, 2) + pow(z - p.z, 2));
}
private:
double x, y, z;
friend istream& operator>>(istream& inp, Point& p) {
p.x = real("x: ", inp);
p.y = real("y: ", inp);
p.z = real("z: ", inp);
puts("");
return inp;
}
friend ostream& operator<<(ostream& out, const Point& p) {
return out << "{ " << p.x << "; " << p.y << "; " << p.z << " }";
}
};
class PointsCollection {
public:
void add(const Point& p) {
box.push_back(p);
}
pair<Point, unsigned> search(const double radius) {
auto max = 0U;
Point target;
const auto length = box.size();
for (auto i = 0U; i < length; ++i) {
auto count = 0U;
for (auto j = i; j < length; ++j) {
if (box[i].length(box[j]) <= radius) {
++count;
}
}
if (count > max) {
max = count;
target = box[i];
}
}
return { target, max };
}
private:
vector<Point> box;
};
int main() {
system("chcp 1251 > nul");
cout << "Количество точек: ";
size_t quantity;
cin >> quantity;
PointsCollection pc;
Point p;
for (auto i = 0U; i < quantity; ++i) {
cin >> p;
pc.add(p);
}
auto radius = real("Радиус: ");
auto [point, count] = pc.search(radius);
cout
<< "Точка: " << point << '\n'
<< "Количество: " << count << '\n';
system("pause > nul");
}
насколько я понял задача в том чтобы из например 10 ПРОСТРАНСТВЕННЫХ точек выбрать такую, чтобы став центром шара включить в себя большее количество соседей? Если так, то выше решения не совсем правильны. Необходимо методом перебора вариантов сравнивать ОТ КАЖДОЙ потенциально цетральной точки РАССТОЯНИЕ, то есть вектор, который меньше диаметра шара и тогда... Ну ты понял? ))) Сложновато будет, но решаемо