Système de deux triangles

Olympiades mathématiques, énigmes et défis
Caesar
Messages: 6
Enregistré le: 18 Jan 2011, 22:13

Système de deux triangles

par Caesar » 20 Déc 2011, 15:45

Bonjour,


J'ai un problème de géométrie qui a pourtant l'air simple mais qui n'empêche pas de me poser une sacré colle !

Image

Tous les segments noirs sont connus, les triangles sont tous quelconques, on sait que CB/CA = FE/FD, et le but est de trouver AB et DE (ou BC et EF, cela revient au même).


Quelque chose me dit qu'il faut utiliser un système de deux équations vu que les points E et B sont liés par une égalité relative à chaque triangle, mas je ne vois pas comment.

Une idée ?



Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 23 Déc 2011, 18:38

Bonjour,
Le problème peut être posé de la façon suivante :
Soient 2 segments AC et DF, et un point O, trouver le segment BE, passant par O, tel que B et E partagent les segments suivant le même rapport.
Il se trouve que justement j'aimerais bien résoudre ce problème, alors qi quelqu'un a une idée, on est au moins 2 à être intéressés.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 24 Déc 2011, 12:28

Je ne trouve pas grand chose.. Tout ce que j'arrive à trouver c'est:



Avec k la valeur du rapport (m'enfin je crois, si je ne me suis pas trompé..)
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 24 Déc 2011, 12:40

Lostounet a écrit:Je ne trouve pas grand chose.. Tout ce que j'arrive à trouver c'est:



Avec k la valeur du rapport (m'enfin je crois, si je ne me suis pas trompé..)
Si on écrit les différentes équations, on arrive à un système de 5 équations dont une n'est pas linéaire, pour 4 inconnues. Il n'y a pas 1 équation de trop, mais c'est un système gaur je ne sais par résoudre.
Par contre, en cherchant dans mon livre de géométrie, j'ai trouve "Division harmonique" mais hier soir il était trop tard.
Je m'y remet, en tout cas, merci.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 24 Déc 2011, 12:49

Mais il doit certainement y avoir une preuve plus élégante, ou plus géométrique...
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 24 Déc 2011, 15:23

Lostounet a écrit:Mais il doit certainement y avoir une preuve plus élégante, ou plus géométrique...

Je ne sais pas, je n'ai pas encore trouvé.
La difficulté est que le rapport k est inconnu, et c'est en fait cela qu'on cherche.
Si on sait résoudre un système de 5 équations dont l'une n'est pas linéaire, le problème est résolu.
Je crois que je vais finir par le faire par une méthode itérative. En d'autres termes, il faut que j'y arrive.
Pour l'instant, la division harmonique ne donne rien, la seule liaison entre les 2 faisceaux est qu'ils n'ont qu'une droite en commun et le même rapport harmonique.

Voila la solution que je vais adopter.
Je calcule la position du point O par rapport à la droite joignant les milieux des 2 segments
Suivant le résultat, gauche ou droite, je divise chaque segment en deux. C'est le type d'opération rapide à calculer. Je m'arrête lorsque la modification des milieux n'est plus significative. La seule opération longue, c'est le calcul du signe du produit vectoriel, sinon, ce ne sont que des divisions par 2.

Caesar
Messages: 6
Enregistré le: 18 Jan 2011, 22:13

par Caesar » 24 Déc 2011, 18:12

C'est dommage d'utiliser une méthode itérative, il doit sûrement exister une solution plus directe car on arrive bien à tracer à peu près BE de tête en respectant la condition CB/CA = FE/FD.

On peut avec le pivot de Gauss résoudre un système de plusieurs équations, mais je ne pense pas qu'il fonctionne si l'une d'entre elles n'est pas linéaire.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 24 Déc 2011, 18:23

Caesar a écrit:C'est dommage d'utiliser une méthode itérative, il doit sûrement exister une solution plus directe car on arrive bien à tracer à peu près BE de tête en respectant la condition CB/CA = FE/FD.

On peut avec le pivot de Gauss résoudre un système de plusieurs équations, mais je ne pense pas qu'il fonctionne si l'une d'entre elles n'est pas linéaire.

Pourquoi serait-ce dommage d'utiliser une méthode itérative, tant que les calculs intermédiaires sont faciles, ce qui est le cas de la division par 2 et du produit vectoriel ?
Si vous avez une autre méthode, je suis preneur.
Ce n'est pas la résolution d'un système linéaire qui me fait peur, simplement je ne sais pas faire si l'une des équations n'est pas linéaire.
D'ailleurs, en l'occurrence, le problème admet (sauf erreur) 3 solutions, dont 2 sans intérêt.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 25 Déc 2011, 01:53

Je me sens un peu hors sujet là :ptdr:
Mais je cherche pour le plaisir de chercher !

J'ai trouvé:



Mais y'a toujours une inconnue, OE^2
Et on peut faire de même pour l'autre triangle, et on aura une autre inconnue également, OB^2.

On sait que (OE + OB = EB, et qu'ils entretiennent le même rapport que les céviennes "communes" à ODA et OFC...).

C'est vrai que je ne fais pas avancer les choses, mais au moins je m’entraîne si vous n'y voyez pas d'inconvénient :zen:
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Caesar
Messages: 6
Enregistré le: 18 Jan 2011, 22:13

par Caesar » 25 Déc 2011, 12:38

Dlzlogic a écrit:Pourquoi serait-ce dommage d'utiliser une méthode itérative, tant que les calculs intermédiaires sont faciles, ce qui est le cas de la division par 2 et du produit vectoriel ?
Si vous avez une autre méthode, je suis preneur.


Si j'ai bien compris, la méthode itérative a une précision limitée et ajustable, si par exemple le rapport k vaut 1/3, on trouvera par cette méthode k = 0,333, or 3*k ne vaudra plus exactement 1, ce qui peut poser problème si l'on doit utiliser ce facteur dans d'autres calculs pour telle ou telle raison.

On peut bien sûr faire des estimations et des arrondis tout à fait louables ; je ne blâme pas cette méthode (je n'ai pas non plus besoin d'une telle précision), je craignais juste qu'elle close le sujet.


Lostounet a écrit:Je me sens un peu hors sujet là

Tu es au contraire pile dans le sujet, Lostounet ! Ça me fait très plaisir de voir autant d'investissement, je cherche également de mon côté mais je ne suis hélas pas meilleur.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 25 Déc 2011, 13:31

Bonjour,
J'avais essayé dès le début, mais comme je n'avais rien trouvé, je l'avais gardé dans un coin de ma tête.
Il se trouve que, a l'occasion d'une question sur ce forum, s"est posé le problème de l'interpolation bilinéaire. Dans le cas de division en mailles plus petites, ça ne pose pas de problème, là où ça devient plus compliqué, c'est quand le quadrilatère n'est pas régulier. D'où l'application de ce sujet.

Concernant la limite à choisir pour l'itération, en ce qui concerne mon problème, en informatique, on travaille avec des valeurs dont le nombre de chiffres significatifs est fixé. Par exemple, un divisé par trois ne sera jamais égal à 1/3.

Si j'ai bien compris, la méthode itérative a une précision limitée et ajustable, si par exemple le rapport k vaut 1/3, on trouvera par cette méthode k = 0,333, or 3*k ne vaudra plus exactement 1, ce qui peut poser problème si l'on doit utiliser ce facteur dans d'autres calculs pour telle ou telle raison.
Cela est toujours vrai en informatique. Petit code pour s'en convaincre :
A = 3./7.
Si (3./7. = A ) Print ("Bon")
else Print("FAUX !)

Je l'ai écrit volontairement indépendamment de tout langage, chacun peut le réécrire dans son langage préféré.

La façon de limiter l'itération doit être bien réfléchie. On peut par exemple aller jusqu'à avoir l'avant dernier chiffre significatif invariant, c'est certainement les plus précis. Je vais faire des test, et de toute façon je vous tiens au courant.

Concernant une méthode rigoureuse, comme je crois qu'il y 3 solutions, ça risque d'être difficile.

@Caesar, serait-il indiscret de demander le contexte de cette recherche ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 25 Déc 2011, 19:17

Bonsoir,
Donc, pour moi, c'est à dire dans un contexte de calcul numérique, c'est résolu.
Voila le programme en C, je pense qu'il n'y aura aucune difficulté pour le transposer éventuellement dans un autre langage.
Code: Tout sélectionner
struct UNPOINT
{
  double X;
  double Y;
  float T;
};

int IProdVect(double XP1, double YP1, double XP2, double YP2, double XP, double YP, double tol)
{
// produit vectoriel des vecteurs pc -> p1
// il est positif si le point p est à droite de c1
// ou le point 1 est à droite de pc
// les points p-c-1 tournent dans la sens des aiguilles d'une montre.
  double xp1=(XP - XP1);
  double yp1=(YP - YP1);
  double xpc=(XP - XP2);
  double ypc=(YP - YP2);
  double PVec=(xpc*yp1-xp1*ypc);
  double Maxxy;
  if (fabs(xp1) > fabs(yp1)) Maxxy=fabs(xp1);
  else Maxxy= fabs(yp1);
  if (fabs(xpc) > Maxxy) Maxxy = fabs(xpc);
  if (fabs(ypc) > Maxxy) Maxxy = fabs(ypc);
  if (fabs(PVec)  0)  return 1;
  else return -1;
}

float BiLineaire(UNPOINT HG, UNPOINT HD, UNPOINT BG, UNPOINT BD, double XP, double YP, FILE *ecr)
{
/*
Cette fonction interpole une valeur dans un quadrilatère
les valeurs intérieures
Méthode utilisée : interpolation bilinéaire
On cherche la droite qui passe par P et qui divise HG-HD et BG-BD dans le même rapport
Les points calculés sont IH et IB
recherche par dichotomie.
Le quadrilatère peut être quelconque, mais il doit être convexe
Le paramètre ecr désigne le fichier d'éctiture des contrômes. Il peut être supprimé à terme.
*/
  UNPOINT HMD;
  UNPOINT BMD;
  UNPOINT HMG;
  UNPOINT BMG;
  HMD.X= (HG.X+ HD.X)/2.0;
  HMD.Y= (HG.Y+ HD.Y)/2.0;
  BMD.X= (BG.X+ BD.X)/2.0;
  BMD.Y= (BG.Y+ BD.Y)/2.0;
  double tol=0.001;
  float ValP = 0.0;
  int sens = IProdVect(HMD.X, HMD.Y, BMD.X, BMD.Y, XP, YP,tol);
  if (sens == 1)
  {
    HMG.X = HG.X;
    HMG.Y = HG.Y;
    BMG.X = BG.X;
    BMG.Y = BG.Y;
  }
  else
  {
    HMG.X = HMD.X;
    HMG.Y = HMD.Y;
    BMG.X = BMD.X;
    BMG.Y = BMD.Y;
    HMD.X = HD.X;
    HMD.Y = HD.Y;
    BMD.X = BD.X;
    BMD.Y = BD.Y;
  }
  int compt=0;
  for (;;)
  {
fprintf(ecr," N=%d HMG : %0.4f %0.4f HMD : %0.4f %0.4f BMG : %0.4f %0.4f BMD : %0.4f %0.4f",
             compt, HMG.X, HMG.Y, HMD.X, HMD.Y, BMG.X, BMG.Y, BMD.X, BMD.Y);
    double XIH = (HMG.X + HMD.X)/2.;
    double YIH = (HMG.Y + HMD.Y)/2.;
    double XIB = (BMG.X + BMD.X)/2.;
    double YIB = (BMG.Y + BMD.Y)/2.;
    sens = IProdVect(XIH, YIH, XIB, YIB, XP, YP,tol);
fprintf(ecr,"    sens=%d\n",sens);
    if (sens == 1)
    {
      HMD.X=XIH;
      HMD.Y=YIH;
      BMD.X=XIB;
      BMD.Y=YIB;
    }
    else if (sens == -1)
    {
      HMG.X=XIH;
      HMG.Y=YIH;
      BMG.X=XIB;
      BMG.Y=YIB;
    }
    else
    {
// les points d'interpolation sont IH et IB
      float TIH= HG.T + (HD.T - HG.T) * (XIH - HG.X ) / (HD.X - HG.X );
      float TIB= BG.T + (BD.T - BG.T) * (XIB - BG.X ) / (BD.X - BG.X );
      ValP= TIH + (TIB - TIH) * (YP - YIH) / (YIB - YIH);
fprintf(ecr,"TIH = %0.2f  TIB = %0.2f ValP = %0.2f \n",TIH, TIB, ValP);
      break;
    }
    if (compt++ > 30 )
    {
      printf("Pas trouvé la solution\n");
      break;  //return 0.0;  // valeur conventionnelle.
    }
  }
  printf("\n");
  return ValP;
}

int main()
{
// pourront être passés en paramètre
/*
  int Nlin=5;
  int Ncol=5;
  float HG=10.;
  float HD=14.;
  float BG=8.;
  float BD=12.;
  InterpoleQ(HG,HD,BG,BD,Ncol,Nlin);
*/
  FILE *ecr=fopen("Bilineaire.txt","wt");
  UNPOINT HG, HD, BG, BD;
// valeurs numériques pour test.
  HG.X=1000;
  HG.Y=5000;
  HG.T=100;
  HD.X=1200;
  HD.Y=4900;
  HD.T=110;
  BG.X=850;
  BG.Y=3200;
  BG.T=105;
  BD.X=1250;
  BD.Y=3825;
  BD.T=125;
  float Tres;
  double XP=1140;
  double YP=4820;
  Tres=BiLineaire(HG, HD, BG, BD, XP, YP,ecr);
  XP=1025;
  YP=3850;
  Tres=BiLineaire(HG, HD, BG, BD, XP, YP,ecr);

  fclose(ecr);
  system("pause");
  return 0;
}

J'ai laissé volontairement les éléments d'essai et les impressions intermédiaires.
La méthode utilisée pour arrêter la recherche est la suivante.
Le but de la fonction ProdVect(...) est de savoir si un point est à droite ou à gauche d'une droite orientée. La formule utilisée est le produit vectoriel. Sa valeur est homogène à une aire. Le plus grand delta X ou delta Y multiplié par la tolérance est une aire. C'est la comparaison de ces deux valeurs, en valeur absolue qui indique si le triangle étudié est un triangle plat.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 25 Déc 2011, 19:41

Caesar a écrit:Tu es au contraire pile dans le sujet, Lostounet ! Ça me fait très plaisir de voir autant d'investissement, je cherche également de mon côté mais je ne suis hélas pas meilleur.


Sympa :) Merci !

Dlzlogic, pourrais-tu me donner une ou deux pistes pour une résolution... numérique? s'il te plaît! Merci :++:
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 25 Déc 2011, 19:55

Lostounet a écrit:Dlzlogic, pourrais-tu me donner une ou deux pistes pour une résolution... numérique? s'il te plaît! Merci :++:
Ben oui, naturellement.
Petit secret entre nous, j'ai écrit et je maintiens depuis une bonne dizaine d'années un programme, en gros DAO + CAO + SIG qui traite justement de tous ces problèmes. Il y a un certain nombre d'aspect que je connais assez bien, le traitement de maillage triangulaire ou non, représentation du terrain etc.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 26 Déc 2011, 12:48

Bonjour,
Lostounet a écrit:Dlzlogic, pourrais-tu me donner une ou deux pistes pour une résolution... numérique? s'il te plaît! Merci :++:
En fait, je n'ai pas vraiment compris la question. Je me suis demandé si c'était une note d'humour, étant donné qu'une telle résolution ne pouvait être que numérique, mais c'est peut être sur la méthode d'itération, ou la non disposition d'un ordinateur.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 26 Déc 2011, 13:20

Dlzlogic a écrit:Bonjour,
En fait, je n'ai pas vraiment compris la question. Je me suis demandé si c'était une note d'humour, étant donné qu'une telle résolution ne pouvait être que numérique, mais c'est peut être sur la méthode d'itération, ou la non disposition d'un ordinateur.


Euh non, pas d'humour :p
Je crois (croyais) en l'existence d'une méthode purement géométrique, qui nous permette de lier les côtés "inconnus" avec les autres connus...
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Caesar
Messages: 6
Enregistré le: 18 Jan 2011, 22:13

par Caesar » 28 Déc 2011, 21:39

Dlzlogic a écrit:@Caesar, serait-il indiscret de demander le contexte de cette recherche ?


Je cherche la solution de ce problème pour un script amateur qui détermine, dans un logiciel de modélisation 3D, les coordonnées UVW de texture d'un point situé à l'intérieur d'un polygone par rapport aux coordonnées XYZ et UVW de ses sommets (donc prendre tel pourcentage de chaque sommet pour en déduire les coordonnées UVW du point O).


Dlzlogic a écrit:Concernant la limite à choisir pour l'itération, en ce qui concerne mon problème, en informatique, on travaille avec des valeurs dont le nombre de chiffres significatifs est fixé. Par exemple, un divisé par trois ne sera jamais égal à 1/3.

Cela est toujours vrai en informatique. Petit code pour s'en convaincre :
A = 3./7.
Si (3./7. = A ) Print ("Bon")
else Print("FAUX !)


C'est curieux car dans mon logiciel (Cinéma 4D, en langage COFFEE), j'obtiens Vrai :
Code: Tout sélectionner
var a = 3./7.;
if (a == 3./7.) println("Vrai");
else println("Faux");


Ce qui ne me choque pas trop, à vrai dire, comme sur une calculatrice lorsque l'on tape 1/3, puis le résultat *3, on obtient bien 1.


Lostounet veut sans doute parler de la méthode qu'on cherche, c'est à dire sans itération, avoir :
k = formule magique

J'explore quelques pistes, si au moins DF et AC étaient parallèles cela serait bien plus facile, donc peut-être en calculant le nouveau point O' avec DF' // AC, et disons I le point d'intersection entre DA et FC, k vaudrait alors le rapport d'angle CÎO / CÎA.
C'est une idée.

Avatar de l’utilisateur
Lostounet
Membre Légendaire
Messages: 9665
Enregistré le: 16 Mai 2009, 11:00

par Lostounet » 28 Déc 2011, 22:04

Caesar a écrit:
J'explore quelques pistes, si au moins DF et AC étaient parallèles cela serait bien plus facile, donc peut-être en calculant le nouveau point O' avec DF' // AC, et disons I le point d'intersection entre DA et FC, k vaudrait alors le rapport d'angle CÎO / CÎA.
C'est une idée.


Salut,

Pourquoi est-ce que k vaudrait ce rapport d'angle ? Désolé si ma question parait (est) un peu bête .. :doh:
Je vais essayer de chercher du côté des transformations :)
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 28 Déc 2011, 22:15

Lostounet a écrit:Euh non, pas d'humour :p
Je crois (croyais) en l'existence d'une méthode purement géométrique, qui nous permette de lier les côtés "inconnus" avec les autres connus...

Bonsoir, ce message m'a échappé (petit bug de Maths-forum).
Il y a des quantités de fonctions que l'on ne sait pas résoudre sous forme strictement analytique, et même si on sait les résoudre, il n'est pas prouvé qu'une méthode itérative n'est pas meilleure.
Concernant ce problème précis, je crois réellement que la solution que j'ai proposée est la plus simple et la plus rapide pour un traitement informatique.
Concernant le test 3./7., il n'est pas évident que le test (3./7. == a ) et non l'inverse soit vrai aussi.
Ce test exemple est cité dans ma norme IEEE utilisée par la langage C, pour les autres, je ne sais pas.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 28 Déc 2011, 22:18

Lostounet a écrit:Salut,

Pourquoi est-ce que k vaudrait ce rapport d'angle ? Désolé si ma question parait (est) un peu bête .. :doh:
Je vais essayer de chercher du côté des transformations :)

Du côté de l'inversion, peut-être ? Là je n'ai pas cherché.
A mon avis, là on est dans le cas typique où le mieux est l'ennemi du bien.

 

Retourner vers ⚔ Défis et énigmes

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite