[casse tête mathématique]

[casse tête mathématique] - Algo - Programmation

Marsh Posté le 14-04-2003 à 18:04:46    

hello les gars, j'ai un casse tête mathématique,
il faut quej e calcule l'aire commune entre deux rectangles, et j'ai:
 
Rectangle A:
 
Xamin
Xamax
Yamin
Yamax
 
 
Rectangle B:
 
Xbmin
Xbmax
Ybmin
Ybmax
 
 
 
j'ai besoin d'une toute petit eligne de calcul qui me sorte l'aire commune entre les deux rectangles !!! mais j'ya arrive po ça fait une demie journée que je cherche mais j'ya arrive po :( à l'aide !!!!!!!!! :'( :'( pitié de mon ignorance et mon illogicité...

Reply

Marsh Posté le 14-04-2003 à 18:04:46   

Reply

Marsh Posté le 14-04-2003 à 18:10:08    

ca doit pas se faire en une seule ligne ... Ou alors je ne vois pas la bonne approche du problème ... Je cherche ...

Reply

Marsh Posté le 14-04-2003 à 18:14:30    

ce que j'ai pondu et qui marche pas c'est ça:
 


 
var boxminx = Math.max(minax,minbx);
var boxmaxx = Math.min(maxax,maxbx);
var boxminy = Math.max(minay,minby);
var boxmaxy = Math.max(maxay,maxby);
 
var commonarea = (Math.abs(boxmaxx-boxminx)*Math.abs(boxmaxy-boxminy));
 
 

Reply

Marsh Posté le 14-04-2003 à 18:29:40    

--------------------
 
var boxminx = Math.max(minax,minbx);
var boxmaxx = Math.min(maxax,maxbx);
var boxminy = Math.max(minay,minby);
var boxmaxy = Math.min(maxay,maxby);
 
var commonarea = (Math.abs(boxmaxx-boxminx)*Math.abs(boxmaxy-boxminy));
 
--------------------
 
 
tu t'es pas trompé pour boxmaxy? moi je verrais plutot un min


Message édité par kaloskagatos le 14-04-2003 à 18:30:30
Reply

Marsh Posté le 14-04-2003 à 18:32:43    

yes en effet il ya une condition comme celle ci à vérifier, cas contraire l'aire commune est donc 0, mais j'essaye de trouver une manière courte et élégante en mathématiques qui me résolve mon problème mais j'y arrive po :'(
je vais essye en mettant un min au lieu du max :)

Reply

Marsh Posté le 14-04-2003 à 18:35:55    

à part faire un joli paquet de if / else je ne vois pas trop comment faire pour tester si un point d'un rectangle appartient à l'autre ...

Reply

Marsh Posté le 14-04-2003 à 18:37:28    

kaloskagatos a écrit :

--------------------
 
var boxminx = Math.max(minax,minbx);
var boxmaxx = Math.min(maxax,maxbx);
var boxminy = Math.max(minay,minby);
var boxmaxy = Math.min(maxay,maxby);
 
var commonarea = (Math.abs(boxmaxx-boxminx)*Math.abs(boxmaxy-boxminy));
 
--------------------
 
 
tu t'es pas trompé pour boxmaxy? moi je verrais plutot un min


 
et après tu vérifie que le signe de tes soustractions est bon (les 2 doivent être positif en la faisant dans le bon sens).
tu vires tes abs() aussi.
 
Si un des signes est négatifs, tu mesures l'aire qui n'est pas comprise entre les 2 (il n'y a pas intersection)

Reply

Marsh Posté le 14-04-2003 à 18:40:02    


 
 Xam               XaM
  __________________   Yam          
 |                  |  
 |        Xbm       |            XbM
 |          ________|____________
 |      Ybm|////////|            |
 |_________|////////|  YaM       |
           |                     |
           |                     |
           |                     |
        YbM|_____________________|
 


:D


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 14-04-2003 à 18:42:22    

kaloskagatos a écrit :


 
 Xam               XaM
  __________________   Yam          
 |                  |  
 |        Xbm       |            XbM
 |          ________|____________
 |      Ybm|////////|            |
 |_________|////////|  YaM       |
           |                     |
           |                     |
           |                     |
        YbM|_____________________|
 


:D


 
[:roxelay]
 
J'ai fait Exactement le même schéma sur ma feuille de papier devant mon PC ! :D


Message édité par theshockwave le 14-04-2003 à 18:52:56
Reply

Marsh Posté le 14-04-2003 à 19:02:12    

bon bin merci à vous tous de m'avoir encouragé à trouver la réponse qui cassait la tête de tout le monde ici :)
 
 
la solution est:
 
 
 
(pour avoir un quotient d'au moins "this.fitarea" )
 


 
    if ( (szmaxx < ezminx) || (szmaxy < ezminy) || (szminx > ezmaxx) || (szminy > ezmaxy) )
    {
     return false;
    }
    else
    {
     var boxminx = Math.max(szminx,ezminx);
     var boxmaxx = Math.min(szmaxx,ezmaxx);
     var boxminy = Math.max(szminy,ezminy);
     var boxmaxy = Math.min(szmaxy,ezmaxy);
     var totalarea = sz.defw * sz.defh;
     var commonarea = (Math.abs(boxmaxx-boxminx)*Math.abs(boxmaxy-boxminy));
     //alert(commonarea + " : " + totalarea);
     if (commonarea >= totalarea*this.fitarea)
     {
      return true;
     }
     else
     {
      return false;
     }
    }
 
 


 
 
merci messieurs :)

Reply

Marsh Posté le 14-04-2003 à 19:02:12   

Reply

Marsh Posté le 23-04-2003 à 11:56:01    

Je trouve que cette solution est un peu plus élégante (attention, je n'ai pas dit forcément plus performante ou autre ...)
 


 
  var boxminx = Math.max(szminx,ezminx);
  var boxmaxx = Math.min(szmaxx,ezmaxx);
  var boxminy = Math.max(szminy,ezminy);
  var boxmaxy = Math.min(szmaxy,ezmaxy);
 
  if(((boxmaxx-boxminx)<=0) || ((boxmaxy-boxminy)<=0)) {
    return false;
  }
 
  var totalarea = sz.defw * sz.defh;
  var commonarea = (boxmaxx-boxminx)*(boxmaxy-boxminy));
  //alert(commonarea + " : " + totalarea);
  if (commonarea >= totalarea*this.fitarea)
  {
    return true;
  }
  else
  {
    return false;
  }
 


 
Edit : ca te permet aussi de virer les Math.abs ...


Message édité par theshockwave le 23-04-2003 à 11:59:21

---------------
last.fm
Reply

Marsh Posté le 24-04-2003 à 00:48:52    

S = max(0,min(Xamax,Xbmax)-max(Xamin,Xbmin))*
    max(0,min(Yamax,Ybmax)-max(Yamin,Ybmin))

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed