Показать сообщение отдельно
Старый 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 xyz;
    
point()
    {
        
0;
        
0;
        
0;
    }
};

float get_r(point apoint 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 0ni++)
    {
        
scanf("%f %f %f", &mas[i].x, &mas[i].y, &mas[i].z);
        
c.+= mas[i].x;
        
c.+= mas[i].y;
        
c.+= mas[i].z;
    }

    
c./= n;
    
c./= n;
    
c./= n;

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

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

    
printf("\n%f %f %f\n"mas[min_i].xmas[min_i].ymas[min_i].z);

    return 
0;

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