Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
674 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  Programme en Maple

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme en Maple

n°1645223
exeed
Posté le 19-11-2007 à 13:05:44  profilanswer
 

Bonjour,
 
Je souhaite resoudre un challenge informatique, je dois trouver le point dans un triangle de 273 metres de coté qui est a des distances EXACTES des sommets. Pour trouver ce point j'ai faitun programme en maple (langage plus simple pour les calculs mathematiques que le C).
 
trianglesuper := proc ()::list;
local x::integer, y::integer, a::float, b::float, c::float;
for x to 273 do
for y to 84 do
if y < 2*x and y < -2*x+223587 then
a := sqrt(x^2+y^2);  
b := sqrt((273*abs(sin(60))-y)^2+(273/2-x)^2);
c := sqrt((x-273)^2+y^2);  
if floor(a)-a = 0 and floor(b)-b = 0 and floor(c)-c = 0
then return evalf([a, b, c])
end if  
end if  
end do
end do  
end proc
 
J'ai modelise mon triangle dans un repere. Un des cotés se trouve sur l'axe X donc x peut aller de 0 a 273.
Les deux autres cotés sont des fonctions (2x) et (-2x+223587) car la pente de la fonction 2x fait un angle de 60° avec l'axe x et que 223587 est l'ordonée necessaire pour que la fonction coupe l'axe des abcisses en 273.
 
84 est l'ordonée maximale de mon triangle.
 
Donc avec mes boucles je suis dans un carre de 273*84(arrondi de 273*sin60) et grace a mes conditionnelles je suis dans mon triangle normalement (puisque "sous" mes fonctions), ensuite je calcule la distance du point vis a vis des 3 sommets (formules incorrectes pê :x) et si ce sont des valeurs entieres alors je les renvoie sous forme de listes.
 
Lorsque je l'execute il ne me renvoie rien.
 
Qu'ai je mal codé  ? :)
 
Merci


Message édité par exeed le 19-11-2007 à 13:13:37
mood
Publicité
Posté le 19-11-2007 à 13:05:44  profilanswer
 

n°1645373
franceso
Posté le 19-11-2007 à 16:32:54  profilanswer
 

  • les droites de pente 2 et -2 ne font pas un angle de 60° avec l'axe des abscisses
  • un test du genre floor(a)-a = 0 risque de ne jamais marcher à cause de la représentation flottante de tes nombres. Essaie avec des tests du genre abs(floor(a) - a) < 1e-5.
  • es-tu sûr qu'il existe une solution à ton problème ?
  • n'y aurait-il pas une méthode plus intelligente pour résoudre ce problème, plutôt que de faire une recherche exhaustive ? (c'est une question ouverte : je ne sais pas si une telle méthode directe existe)


---------------
TriScale innov
n°1645375
franceso
Posté le 19-11-2007 à 16:34:41  profilanswer
 

Un autre problème : est-ce que l'énoncé stipule qu'il faut rechercher des points de coordonnées entières ?


---------------
TriScale innov
n°1645380
MagicBuzz
Posté le 19-11-2007 à 16:39:56  profilanswer
 

Euh...
 
Triangle de 273 mètres de coté... Angles de 60°... J'en déduit que ton triangle est équilatéral non ?
 
Ben y'a quand même plus simple pour trouver le centre de grativé/orthocentre/centre du cercle circonscrit/centre du cercle inscrit à ton triangle...
 
Je te renvoie à tes cours de 6°...
http://pagesperso-orange.fr/pierre [...] iEqu01.htm
 
Honnêtement, ça se fait en 4 lignes, même en ASM, et pas besoin d'avoir un côté sur l'axe X ou Y...
Utilise simplement la formule du calcul du centre de gravité... Même pas besoin de faire intervenir le moindre calcul à base de sin() et cnie... Deux bêtes addition et deux bonnes divisions par 3 et roule ma poule, je vois pas comment on peut faire plus simple... Ah si, peut-être trouver le centre de gravité d'un point [:magicbuzz]
 
 
/me vient de réalister... Tu cherches peut-être pas le point qui est à la même distance de chaque point, mais celui qui sera à une distance entière de chacun des points c'est ça ?

Message cité 2 fois
Message édité par MagicBuzz le 19-11-2007 à 16:45:19
n°1645387
franceso
Posté le 19-11-2007 à 16:47:02  profilanswer
 

MagicBuzz a écrit :

/me vient de réalister... Tu cherches peut-être pas le point qui est à la même distance de chaque point, mais celui qui sera à une distance entière de chacun des points c'est ça ?

Oui, je crois que c'est ça...
 
Par contre, ce qui n'est pas clair c'est si on cherche un point de coordonnées entières, ou un point quelconque...


---------------
TriScale innov
n°1645388
MagicBuzz
Posté le 19-11-2007 à 16:48:51  profilanswer
 

Sinon, moi je ferais pas comme ça.
 
Je dirais que :
- Ton point doit de trouver sur le cercle c1 de centre A et de rayon r1 entier.
- Ton point doit de trouver sur le cercle c2 de centre B et de rayon r2 entier.
- Ton point doit de trouver sur le cercle c3 de centre C et de rayon r3 entier.
 
Donc moi je tenterais de trouver le point d'intersection commun des cercles r1, r2 et r3.
 
Ceci donne d'ailleurs comme conclusion qu'il y a au point 3 points (qui peuvent être confondus) qui répondent au problème.

Message cité 1 fois
Message édité par MagicBuzz le 19-11-2007 à 16:50:04
n°1645390
franceso
Posté le 19-11-2007 à 16:51:17  profilanswer
 

Il y a plein de cercles de centre A et de rayon r1 entier  :??:  
 
Et étant donnés trois rayons entiers r1, r2, r3, rien ne prouve que les 3 cercles sont concourrants.


---------------
TriScale innov
n°1645416
MagicBuzz
Posté le 19-11-2007 à 17:36:06  profilanswer
 

Y'en a 273 pour être exact.
 
Mais déjà, tu peux partir du principe qu'il ne peux pas être de rayon > que distance avec lecentre de gravité, sinon le point "équivalent" en partant des deux autres somment vient remplacer ceux que tu as déjà fait.
 
Donc.
 


Chercher la distance D entre A et le centre de gravité G.
Pour r1 = 1 à D
  Pour r2 = 273-D à 273
    Pour r3 = 273-D à 273
      regarder si c1, c2 et c3 ont un point d'intersection commun.
    Fin pour r3
  Fin pour r2
Fin pour r1


 
Ca me semble être la solution la plus simple.
 
Du moins, c'est la solution "humaine" que 3 maçons peuvent aisément mettre en oeuvre avec chacun une corde attachée à chacun des 3 sommets.
 
Un matheux te trouveras certainement de grosses optimisations évidentes, mais moi et la théorie matheuse... Une corde et un maçon au bout, ça je me le représente, des sqtr(cos(pi/12)) là moi je nage.

Message cité 2 fois
Message édité par MagicBuzz le 19-11-2007 à 17:39:51
n°1645438
exeed
Posté le 19-11-2007 à 18:10:56  profilanswer
 

franceso a écrit :

  • les droites de pente 2 et -2 ne font pas un angle de 60° avec l'axe des abscisses
  • un test du genre floor(a)-a = 0 risque de ne jamais marcher à cause de la représentation flottante de tes nombres. Essaie avec des tests du genre abs(floor(a) - a) < 1e-5.
  • es-tu sûr qu'il existe une solution à ton problème ?
  • n'y aurait-il pas une méthode plus intelligente pour résoudre ce problème, plutôt que de faire une recherche exhaustive ? (c'est une question ouverte : je ne sais pas si une telle méthode directe existe)


Lol ok donc je vais chercher du coté des droites alors.
Pourquoi 1e-5? Mon prof d'algo m'as dit que c'etait correct, apres il se trompe peut etre ..  :pt1cable:  
En effet il y a surement une methode plus "mathematique" et "logique" mais je ne vois vraiment pas. J'ai eu des echos comme quoi la methode des trois cercles que vous proposez apres fonctionnerait par contre faudrait que je reflechisse a comment le programmer.
 

franceso a écrit :

Un autre problème : est-ce que l'énoncé stipule qu'il faut rechercher des points de coordonnées entières ?


Oui C'est la toute la difficulté du probleme.
 

MagicBuzz a écrit :

Euh...
 
Triangle de 273 mètres de coté... Angles de 60°... J'en déduit que ton triangle est équilatéral non ?
 
Ben y'a quand même plus simple pour trouver le centre de grativé/orthocentre/centre du cercle circonscrit/centre du cercle inscrit à ton triangle...
 
Je te renvoie à tes cours de 6°...
http://pagesperso-orange.fr/pierre [...] iEqu01.htm
 
Honnêtement, ça se fait en 4 lignes, même en ASM, et pas besoin d'avoir un côté sur l'axe X ou Y...
Utilise simplement la formule du calcul du centre de gravité... Même pas besoin de faire intervenir le moindre calcul à base de sin() et cnie... Deux bêtes addition et deux bonnes divisions par 3 et roule ma poule, je vois pas comment on peut faire plus simple... Ah si, peut-être trouver le centre de gravité d'un point [:magicbuzz]
 
 
/me vient de réalister... Tu cherches peut-être pas le point qui est à la même distance de chaque point, mais celui qui sera à une distance entière de chacun des points c'est ça ?


 :jap:  

franceso a écrit :

Oui, je crois que c'est ça...
 
Par contre, ce qui n'est pas clair c'est si on cherche un point de coordonnées entières, ou un point quelconque...


Un point quelconque si j'ai bien compris le probleme.
 

MagicBuzz a écrit :

Sinon, moi je ferais pas comme ça.
 
Je dirais que :
- Ton point doit de trouver sur le cercle c1 de centre A et de rayon r1 entier.
- Ton point doit de trouver sur le cercle c2 de centre B et de rayon r2 entier.
- Ton point doit de trouver sur le cercle c3 de centre C et de rayon r3 entier.
 
Donc moi je tenterais de trouver le point d'intersection commun des cercles r1, r2 et r3.
 
Ceci donne d'ailleurs comme conclusion qu'il y a au point 3 points (qui peuvent être confondus) qui répondent au problème.


 

franceso a écrit :

Il y a plein de cercles de centre A et de rayon r1 entier  :??:  
 
Et étant donnés trois rayons entiers r1, r2, r3, rien ne prouve que les 3 cercles sont concourrants.


 

MagicBuzz a écrit :

Y'en a 273 pour être exact.
 
Mais déjà, tu peux partir du principe qu'il ne peux pas être de rayon > que distance avec lecentre de gravité, sinon le point "équivalent" en partant des deux autres somment vient remplacer ceux que tu as déjà fait.
 
Donc.
 


Chercher la distance D entre A et le centre de gravité G.
Pour r1 = 1 à D
  Pour r2 = 273-D à 273
    Pour r3 = 273-D à 273
      regarder si c1, c2 et c3 ont un point d'intersection commun.
    Fin pour r3
  Fin pour r2
Fin pour r1


 
Ca me semble être la solution la plus simple.
 
Du moins, c'est la solution "humaine" que 3 maçons peuvent aisément mettre en oeuvre avec chacun une corde attachée à chacun des 3 sommets.
 
Un matheux te trouveras certainement de grosses optimisations évidentes, mais moi et la théorie matheuse... Une corde et un maçon au bout, ça je me le représente, des sqtr(cos(pi/12)) là moi je nage.


Ca me semble interessant mais je ne vois pas comment "regarder si c1, c2 et c3 ont un point d'intersection commun."
 
Je vais reflechir a ca.
 
MErci pour vos reponses.

n°1645443
franceso
Posté le 19-11-2007 à 18:23:08  profilanswer
 

MagicBuzz a écrit :

Y'en a 273 pour être exact.

Entièrement d'accord avec ça. Ce que je remettais en cause, c'est ta "preuve" qu'il y a "au moins trois points qui répondent au problème".
 
 
exeed> le calcul des points d'intersections de deux cercles est vraiment très classique et très simple. Si tu ne veux pas / ne sais pas le faire toi-même, une recherche te donnera rapidement les formules.
 
L'histoire du abs(...)<1e-5 c'est juste pour dire qu'il y a une différence entre la vraie vie et les maths. Dans la vraie vie, les nombres réels sont stockés dans des variables en virgule flottante, les cos et sin sont calculés de manière approchée, etc. Donc un test exact n'a quasiment aucune chance de marcher.
 
Si le point que tu recherches n'a pas forcément des coordonnées entières, oublie ton algo et pars sur celui que te proposes MagicBuzz. Il ya sans doute plein d'optimisations à faire, mais ce sera pour plus tard.


---------------
TriScale innov
mood
Publicité
Posté le 19-11-2007 à 18:23:08  profilanswer
 

n°1645449
exeed
Posté le 19-11-2007 à 18:28:33  profilanswer
 

Est ce que le theoreme de Miquel est utile?  
Je vais y penser ... :p

n°1645621
franceso
Posté le 20-11-2007 à 09:51:44  profilanswer
 

exeed a écrit :

Est ce que le theoreme de Miquel est utile?  
Je vais y penser ... :p

Non, les théorèmes de Miquel ne servent à mon avis à rien dans ta situatio, puisqu'ils ne parlent pas des centres des cercles concourrants.


---------------
TriScale innov
n°1645650
franceso
Posté le 20-11-2007 à 10:36:43  profilanswer
 

un autre algo plus efficace je pense que celui de MagicBuzz :

pour r1 variant de 1 à 273
  pour r2 variant de 273-r1 à 273
    pour chaque point d'intersection P de C1(P1,r1) et C2(P2,r2)
      si P est dans le triangle
        si distance(P, P3) entière
          afficher r1, r2, r3, x, y
        fin si
      fin si
    fin pour chaque P
  fin pour r2
fin pour r1


---------------
TriScale innov
n°1645802
MagicBuzz
Posté le 20-11-2007 à 14:06:46  profilanswer
 

franceso a écrit :

Entièrement d'accord avec ça. Ce que je remettais en cause, c'est ta "preuve" qu'il y a "au moins trois points qui répondent au problème".


C'est simple, tu es dans un triangle equilatéral.
 
En gros, quand tu trouves un point p1 avec dA = x, dB = y, dC = z, alors il existe aussi un point p2 avec dA = y, dB = z, dC = x et un point p3 avec dA = z, dB = x, dC = y.
 
Le seul cas où il n'y a pas 3 points, c'est si x = y = z, et que ton point est le centre de gravité (et donc les trois points sont confondus).
 
Ceci dit, un triangle équilatéral étant symétrique, je dois dire qu'en fait il y a non pas 3 points mais 6 points qui répondent à la question, puisque p4 (dA= x, dB = z, dC = y), p5 (dA = y, dB = x, dC = z) et p6 (dA = z, dB = y, dC = x) existent aussi.

Message cité 1 fois
Message édité par MagicBuzz le 20-11-2007 à 14:08:25
n°1645806
MagicBuzz
Posté le 20-11-2007 à 14:09:56  profilanswer
 

En gros, quand t'as trouvé des distances d1, d2 et d3 qui fonctionnent, alors tu peux faire toutes les combinaisons de 3 cercles de rayon d1, d2, d3 en partant de chacun des sommets de ton triangle, il y aura un point d'intersection.
 
Et d'ailleurs, l'inverse est vrai aussi, et peut représenter une très grosse optimisation : pour n'importe quel d1, d2, d3 qui ne marche pas, alors ça ne marchera pas quelque soient les somments centres des cercles ayant pour rayon d1, d2 et d3 (cela devrait te permettre de réduire considérablement les itérations des boucles imbriquées).


Message édité par MagicBuzz le 20-11-2007 à 14:24:53
n°1645899
franceso
Posté le 20-11-2007 à 15:31:08  profilanswer
 

MagicBuzz a écrit :


C'est simple, tu es dans un triangle equilatéral.
 
En gros, quand tu trouves un point p1 avec dA = x, dB = y, dC = z, alors il existe aussi un point p2 avec dA = y, dB = z, dC = x et un point p3 avec dA = z, dB = x, dC = y.
 
Le seul cas où il n'y a pas 3 points, c'est si x = y = z, et que ton point est le centre de gravité (et donc les trois points sont confondus).
 
Ceci dit, un triangle équilatéral étant symétrique, je dois dire qu'en fait il y a non pas 3 points mais 6 points qui répondent à la question, puisque p4 (dA= x, dB = z, dC = y), p5 (dA = y, dB = x, dC = z) et p6 (dA = z, dB = y, dC = x) existent aussi.

OK pour la symétrie : si tu arrives à trouver un point solution, alors en général tu en obtiens d'autres par symétrie. Mais rien ne te prouve qu'il existe un point solution.
 
C'est une hypothèse que tu sembles faire depuis le début et qui est fausse dans le cas général. Considère par exemple un petit triangle équilatéral de côté 10 : tu ne trouveras aucune solution non triviale.


---------------
TriScale innov
n°1645922
MagicBuzz
Posté le 20-11-2007 à 15:49:45  profilanswer
 

Déjà, y'a 3 points solution qui sont évident à trouver :sol:
 
A, B et C sont trois points qui répondent au problème avec d1 = COTE, d2 = COTE et d3 = 0 :sol:

Message cité 1 fois
Message édité par MagicBuzz le 20-11-2007 à 15:50:40
n°1645969
franceso
Posté le 20-11-2007 à 16:31:45  profilanswer
 

MagicBuzz a écrit :

Déjà, y'a 3 points solution qui sont évident à trouver :sol:
 
A, B et C sont trois points qui répondent au problème avec d1 = COTE, d2 = COTE et d3 = 0 :sol:

franceso a écrit :

Considère par exemple un triangle équilatéral de côté 10 : tu ne trouveras aucune solution non triviale.



---------------
TriScale innov
n°1645975
MagicBuzz
Posté le 20-11-2007 à 16:35:40  profilanswer
 

Chais pas si ça marche (y trouve tous les points ?), mais si c'est bon, ça te donne une version optimisée de mon algo :

Code :
  1. using System;
  2.  
  3. namespace TestCercles
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            const double COTE = 273;
  10.  
  11.            Triangle MonTriangle = new Triangle(COTE);
  12.  
  13.            double maxRayon = COTE - 1;
  14.  
  15.            for (double i = 1; i < maxRayon; i++)
  16.            {
  17.                for (double j = COTE - i; j < maxRayon; j++)
  18.                {
  19.                    Point p = MonTriangle.TrouverIntersection(i, j);
  20.                    double k = p.ObtenirDistance(MonTriangle.C);
  21.                    if (Math.Ceiling(k) == k)
  22.                        Console.WriteLine("Le point ({0}, {1}) répond au problème.", p.X, p.Y);
  23.                }
  24.            }
  25.            Console.ReadKey(true);
  26.        }
  27.    }
  28.  
  29.    public class Point
  30.    {
  31.        public double X;
  32.        public double Y;
  33.  
  34.        public Point(double x, double y)
  35.        {
  36.            this.X = x;
  37.            this.Y = y;
  38.        }
  39.  
  40.        public double ObtenirDistance(Point p)
  41.        {
  42.            return Math.Sqrt(Math.Pow(p.X - this.X, 2) + Math.Pow(p.Y - this.Y, 2));
  43.        }
  44.    }
  45.  
  46.    public class Triangle
  47.    {
  48.        public Point A;
  49.        public Point B;
  50.        public Point C;
  51.  
  52.        private double Cote;
  53.  
  54.        public Triangle(double cote)
  55.        {
  56.            this.Cote = cote;
  57.            this.A = new Point(0f, 0f);
  58.            this.B = new Point(cote, 0f);
  59.            this.C = new Point(cote / 2, Math.Sqrt(Math.Pow(cote, 2) - Math.Pow(cote / 2, 2)));
  60.        }
  61.  
  62.        // Trouve le point d'intersection inscrit dans le triangle entre les cercles de rayons r1 et r2 ayant pour sommets A et B (on part du principe qu'il existe forcément !)
  63.        public Point TrouverIntersection(double r1, double r2)
  64.        {
  65.            // (TRES) adapté à partir du code source en C trouvé ici
  66.            // ATTENTION : Ce n'est pas du tout l'algo exact. Il s'agit ici d'une version épurée
  67.            // qui ne retourne que le point d'intersection qui se trouve dans le triangle
  68.            // et on part du principe que les deux cercles ont effectivement une intersection.
  69.  
  70.            double a = (Math.Pow(r1, 2) - Math.Pow(r2, 2) + Math.Pow(this.Cote, 2)) / (2 * this.Cote);
  71.            double h = Math.Sqrt(Math.Pow(r1, 2) - (Math.Pow(a, 2)));
  72.            return new Point(a, h);
  73.        }
  74.    }
  75. }


 


Le point (65, 0) répond au problème.
Le point (32.5, 56.2916512459885) répond au problème.
Le point (120, 0) répond au problème.
Le point (60, 103.923048454133) répond au problème.
Le point (153, 0) répond au problème.
Le point (76.5, 132.501886779019) répond au problème.
Le point (208, 0) répond au problème.
Le point (213, 103.923048454133) répond au problème.
Le point (196.5, 132.501886779019) répond au problème.
Le point (240.5, 56.2916512459885) répond au problème.


 
Si en plus tu veux les points dont les coordonées sont entières, y'a un petit filtre à rajouter...


Message édité par MagicBuzz le 20-11-2007 à 17:28:07
n°1645986
MagicBuzz
Posté le 20-11-2007 à 16:51:07  profilanswer
 

sinon, l'algo original, c'était quoi exactement ? parceque je panne rien au code, avec l'algo ce serait peut-être plus clair :D

n°1646186
exeed
Posté le 20-11-2007 à 23:37:52  profilanswer
 

eh bah ca travaille :p merci a vous pour cette aide ;)

n°1653496
exeed
Posté le 05-12-2007 à 20:56:43  profilanswer
 

OK donc j'ai rajouté un test pour qu'une des coordonnées soient égale a 0 (le point ne peux pas être un des sommets), je tombe donc sur 6 réponses avec 2 trio de distances (qui se répètent donc 3 fois chacun, pas dans le même ordre, l'ordre n'as pas d'importance)
 
Y aurait il des tests supplémentaire a faire?
 
Je ne vois pas comment améliorer l'algorithme pourtant j'y travaille depuis plusieurs heures :x

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  Programme en Maple

 

Sujets relatifs
Besoins d'aide pour programme lycéeprogramme visual basic
Programme simple avec VB6ecrire sur une seule ligne un programme
[Aide] Programme VBA exercicesAide programme Jeu : Devinez le bon chiffre
[D7] Un programme s'exécutant avant Windowsprogramme C en maple
programme maplePetit programme sous Maple
Plus de sujets relatifs à : Programme en Maple


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR