Une sphere englobant tous les points

MrPatachou Messages postés 2 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 14 avril 2003 - 9 avril 2003 à 15:05
MrPatachou Messages postés 2 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 14 avril 2003 - 14 avril 2003 à 17:46
Bonjour
Je dois realiser un programme qui analyse des formes du dos ; mais je reste bloque a une etape a cause de mes lacunes en maths, je m explique :

Je dois dessiner a un moment des spheres qui englobent n points donnees ( des pR3 donc ).
J ai besoin de son centre (3 coordonnees) et de son rayon, en fonction des n points que j aurai recupere d une maniere ou d une autre.

Et evidemment je n ai AUCUNE idee de comment faire ( je sors de DUT info, les maths ne sont pas vraiment approfondies).

Si l un d entre vous peut me mettre sur la voie, je lui en serait tres reconnaissant !

Merci d avance.

Greg.

5 réponses

crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
9 avril 2003 à 16:22
Moi aussi je sors de IUT info, et c'est vrai que les math c'est pas ca !

Sinon, pour ta sphere, il faut (je propose) que tu fasse la moyenne des coordonéés des points, ca te donne le centre de la sphere
ex :
p1(3,5,2)
p2(10,2,0)
p3(3,9,2)
-->
psphere(5.33,5.33,1.33) -->origine

pour le rayon, c'est la difference entre ton point le plus loin par rapport au centre de la sphere et le centre de la sphere.

Je sais pas si c'est exact mais ca peut marcher

Hart
0
cs_payen Messages postés 252 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 1 mai 2005
9 avril 2003 à 16:26
je dirais que tu pourrais :

1. calculer le barycentre du nuage de points dans chacune des dimensions (tu calcules en fait la moyenne de tous les points sur chacun des axes)
2. une fois ce point determine, tu calcules la distance entre ce point (le barycentre) et tous les autres points (tu fais en fait des differences de coordonnees sur chacun des axes, puis tu calcules la norme sur les 3 coordonnees)
3. tu as maintenant la plus grande distance entre le barycentre du nuage de points et l'ensemble des points: c'est le rayon de ta sphere ...

cette solution fonctionne certainement, mais je ne sais pas si c'est la solution optimale (c'est a dire la sphere de plus petit rayon) ...

il te reste plus qu'a la tracer!
si t'as des soucis en maths sur ce que j'ai presente, n'hesite pas a envoyer un mail ...
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
12 avril 2003 à 16:23
Tu calcules un cube qui emglobe les points en calculant le
min(xi), max(xi), min(yi), max(yi), min(zi), max(zi)
{xi, yi, zi} sont chaque point:
les 8 points du cubes sont donc:
{min(xi), min(yi), min(zi)}
{max(xi), min(yi), min(zi)}
{min(xi), max(yi), min(zi)}
{max(xi), max(yi), min(zi)}
{min(xi), min(yi), max(zi)}
{max(xi), min(yi), max(zi)}
{min(xi), max(yi), max(zi)}
{max(xi), max(yi), max(zi)}

Les diagonales du cubes sont donc le diamètre de ta sphère
centre: {(min(xi)+max(xi))/2, (min(yi)+max(yi))/2, (min(zi)+max(zi))/2}
et le rayon est la moitié de la longueur d'une diagonale:
sqrt((max(xi)-min(xi))²+(max(yi)-min(yi))²+(max(zi)-min(zi))²)/2

Voici un exemple en C pour calculer:

typedef struct {double x, y, y} point;
typedef struct {point min, max} minmax;
typedef struct {point centre; double rayon} sphere;

// Calcule les minima et maxima
void cal_minmax(point *nuage, int n, minmax *resultat)
{
int i;

resultat->min= resultat->max= nuage[0];
if( n > 1 )
{
for(i= 1; i < n; i++)
{
if( resultat->min.x > nuage[i].x )
resultat->min.x= nuage[i].x;
if( resultat->max.x < nuage[i].x )
resultat->max.x= nuage[i].x;

if( resultat->min.y > nuage[i].y )
resultat->min.y= nuage[i].y;
if( resultat->max.y < nuage[i].y )
resultat->max.y= nuage[i].y;

if( resultat->min.z > nuage[i].z )
resultat->min.z= nuage[i].z;
if( resultat->max.z < nuage[i].z )
resultat->max.z= nuage[i].z;
}
}
}

// Calcule la sphère englobante
void cal_sphere(point *nuage, int n, sphere *resultat)
{
minmax cube;
point vect;

cal_minmax(nuage, n, &cube);

resultat->centre.x= (cube.max.x + cube.min.x) / 2;
resultat->centre.y= (cube.max.y + cube.min.y) / 2;
resultat->centre.z= (cube.max.z + cube.min.z) / 2;

vect->x= cube.max.x - cube.min.x;
vect->y= cube.max.y - cube.min.y;
vect->z= cube.max.z - cube.min.z;

resultat->rayon= sqrt((vect->x * vect->x) +
(vect->y * vect->y) +
(vect->z * vect->z)) / 2;
}

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
12 avril 2003 à 18:02
Tu calcules un cube qui emglobe les points en calculant le
min(xi), max(xi), min(yi), max(yi), min(zi), max(zi)
{xi, yi, zi} sont chaque point:
les 8 points du cubes sont donc:
{min(xi), min(yi), min(zi)}
{max(xi), min(yi), min(zi)}
{min(xi), max(yi), min(zi)}
{max(xi), max(yi), min(zi)}
{min(xi), min(yi), max(zi)}
{max(xi), min(yi), max(zi)}
{min(xi), max(yi), max(zi)}
{max(xi), max(yi), max(zi)}

Les diagonales du cubes sont donc le diamètre de ta sphère
centre: {(min(xi)+max(xi))/2, (min(yi)+max(yi))/2, (min(zi)+max(zi))/2}
et le rayon est la moitié de la longueur d'une diagonale:
sqrt((max(xi)-min(xi))²+(max(yi)-min(yi))²+(max(zi)-min(zi))²)/2

Voici un exemple en C pour calculer:

typedef struct {double x, y, y} point;
typedef struct {point min, max} minmax;
typedef struct {point centre; double rayon} sphere;

// Calcule les minima et maxima
void cal_minmax(point *nuage, int n, minmax *resultat)
{
int i;

resultat->min= resultat->max= nuage[0];
if( n > 1 )
{
for(i= 1; i < n; i++)
{
if( resultat->min.x > nuage[i].x )
resultat->min.x= nuage[i].x;
if( resultat->max.x < nuage[i].x )
resultat->max.x= nuage[i].x;

if( resultat->min.y > nuage[i].y )
resultat->min.y= nuage[i].y;
if( resultat->max.y < nuage[i].y )
resultat->max.y= nuage[i].y;

if( resultat->min.z > nuage[i].z )
resultat->min.z= nuage[i].z;
if( resultat->max.z < nuage[i].z )
resultat->max.z= nuage[i].z;
}
}
}

// Calcule la sphère englobante
void cal_sphere(point *nuage, int n, sphere *resultat)
{
minmax cube;
point vect;

cal_minmax(nuage, n, &cube);

resultat->centre.x= (cube.max.x + cube.min.x) / 2;
resultat->centre.y= (cube.max.y + cube.min.y) / 2;
resultat->centre.z= (cube.max.z + cube.min.z) / 2;

vect->x= cube.max.x - cube.min.x;
vect->y= cube.max.y - cube.min.y;
vect->z= cube.max.z - cube.min.z;

resultat->rayon= sqrt((vect->x * vect->x) +
(vect->y * vect->y) +
(vect->z * vect->z)) / 2;
}

Core Breaker :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MrPatachou Messages postés 2 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 14 avril 2003
14 avril 2003 à 17:46
Merci Beaucoup pour toute vos reponses !!!!
Je vais pouvoir avancer, merci !
0
Rejoignez-nous