Показать сообщение отдельно
Старый 20.08.2011, 20:06   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Геометрическая задачка

Мой вариант:
1) сложить все x|y|z точек и поделить на N. Получим cx, cy, cz
2) Перебрать все точки, находить растояние от неё до С. r = (cx-x)^2+(cy-y)^2+(cz-z)^2
(корень убрать для скорости)
3) та, у которой r минимальна - исходная



upd: вот накатал =)
#include <cstdio>

struct point
{
    
float x, y, z;
    
point()
    {
        
x = 0;
        
y = 0;
        
z = 0;
    }
};

float get_r(point a, point b)
{
    return (
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()
{
    
int n;
    
scanf("%d", &n);
    
point c;
    
point *mas = new point[n];

    for(
int i = 0; i < n; i++)
    {
        
scanf("%f %f %f", &mas[i].x, &mas[i].y, &mas[i].z);
        
c.x += mas[i].x;
        
c.y += mas[i].y;
        
c.z += mas[i].z;
    }

    
c.x /= n;
    
c.y /= n;
    
c.z /= n;

    
float min_r = get_r(mas[0], c);
    
int min_i = 0;

    for(
int i = 1; i < n; i++)
    {
        
float r = get_r(mas[1], c);
        if(
r < min_r)
        {
            
min_r = r;
            
min_i = i;
        }
    }

    
printf("\n%f %f %f\n", mas[min_i].x, mas[min_i].y, mas[min_i].z);

    return 
0;
} 
(Offline)
 
Ответить с цитированием