Boggle

Introduction 

Si vous être un peu âgé vous connaissez peut-être le Boggle, un jeu qui a eu un certain succès dans les années 90. Il s'agit d'un jeu de lettres, composé de 16 dés à 6 faces. Sur chacune des faces se trouve une lettre et le but est, après avoir mélangé les lettres aléatoirement, de trouver un maximum de mots de trois lettres ou plus en respectant 2 règles : le mot doit être constitué de lettres contiguës les unes des autres (il faut donc se "déplacer" dans la grille de lettre en lettre, dans n'importe quel sens) et chaque lettre ne peut être utilisée qu'une seule fois dans le mot.

Une fois le temps écoulé, chaque joueur compte ses points en fonction des mots trouvés et de leur longueur. Les mots de 3 ou 4 lettres rapportent 1 point, les mots de 5 lettres rapportent 2 points, ceux de 6 lettres rapportent 3 points, ceux de 7 lettres rapportent 5 points et les mots de 8 lettres ou plus rapportent 11 points. Évidemment il existe des variantes dans les règles et dans la manière de compter les points.

 

Notre étude a pour but de lister les faits intéressants concernant les résultats qu'il est possible d'obtenir. Pour ce faire, j'ai crée du code permettant de "simuler" des tirages et de lister tous les mots possibles (en accord avec un dictionnaire de référence - ici l'officiel du Scrabble dans sa version 5) et de compter le nombre de points qu'il est possible d'obtenir pour chaque grille. Les résultats qui sont présentés par la suite sont donc issus de la simulation aléatoire d'un million de grilles. Cela peut sembler énorme mais ne représente en fait qu'une petite partie du nombre total de configurations possibles. En effet il en existe 16! x 6^16 combinaisons possibles (même si certaines configurations sont redondantes et réduisent le nombre "réel" de grilles différentes). 

A titre de comparaison (débile) : Il y a deux fois moins de gouttes d'eau dans les océans que de combinaisons possibles (à raison de 20 000 gouttes d'eau par litre et d'une estimation de 1.37 milliards de km3 d'eau dans les océans). C'est fou non?

 Bref, revenons à nos moutons.

Exemple 

Voici un exemple de grille que l'on peut obtenir.

Il existe de nombreux mots que l'on peux trouver, par exemple : "SALIE", ce qui vous rapporte 2 points.

Distribution des scores

Une fois les simulations réalisées il est intéressant de voir comment se répartit le nombre de points que l'on peut obtenir.

Il existe une grande variabilité dans les scores obtenus en fonction des grilles mais la majorité du temps vous pouvez espérer obtenir entre 100 et 270 points. Cependant on constate une queue de distribution qui s'étend trèèès loin et il existe ainsi des grilles (très rares certes) à plus de 2000 points. Dans les simulations réalisées, le maximum obtenu fut de 2525 points mais certaines personnes ont trouvé des grilles à 3000 points. Je rappelle que nous n'avons testé qu'un minuscule échantillon de toutes les grilles existantes. Pour reprendre l'analogie des gouttes d'eau dans l’océan qui représenteraient l'ensemble des combinaisons de grilles possibles, notre million de grille simulées représente un échantillon de 250 litres d'eau.

Le mot le plus long

D'une manière similaire, nous pouvons regarder quel est la longueur maximale des mots que l'on peut trouver. Sachant qu'il y a 16 dés dans la grille et qu'il n'y a pas le droit d'utiliser deux fois le même dé, la longueur maximale théorique est donc limitée à 16. De plus comme les mots de moins de 3 lettres ne rapportent pas de points la longueur minimale est de 3.

Dans environ 2/3 des cas, le mot le plus long que vous pourrez trouver sera composé de 7 ou 8 lettres et dans 94% des cas il fera entre 6 et 9 lettres. Dans certains cas très rares il a été possible de trouver des mots allant jusqu’à 13 lettres ! Mais en réalité il est même possible de trouver des mots de 16 lettres.

Il est a noter aussi, que dans 87 grilles (sur 1 million) il a été impossible de trouver de mots de 3 lettres ou plus. Ce sont donc des grilles qui rapportent 0 point. Après vérification, ces grilles à 0 point sont toujours composées uniquement de consonnes (et donc forcément c'est plus compliqué)

L'importance du nombre de E 

Connaissant la langue française et la répartition des lettres, on peut avoir l'intuition qu'une grille contenant des E permettra surement de trouver plus de mots (car le E est une lettre très souvent utilisée). Pour cela, il suffit de compter le nombre de E dans chacune de nos 1 million de grilles et de voir la répartition des scores obtenus.


Les constats :

Dans le cas le plus fréquent, 29% des cas, votre grille contiendra 2 E et vous pouvez obtenir, dans 80% des parties, des scores entre 80 et 420 points.

Dans 24% des cas, la grille ne contiendra qu'un E et vos scores s’étendront plutôt entre 60 et 340 points (c'est donc un peu plus dur avec un seul E).

Dans 21% des cas, vous aurez 3 E et comme c'est le cas le plus favorable, les scores s'étendront la moitié du temps dans une fourchette allant de 80 à 450 points. 

On constate après que dans des cas plus rares (par exemple 5 E), les scores diminuent (moins de 360 points la plupart du temps) et dans le cas à 0 E, il sera assez dur de marquer plus de 240 points mais il est possible de se débrouiller avec les autres voyelles quand même.

Il existe des grilles contenant encore plus de E (le maximum théorique est une grille avec 12 E mais je n'en ai pas rencontré dans mes simulations). Dans les simulations réalisées, il y a eu 2 grilles avec 10 E et à chaque fois le score maximal était inférieur à 40 points. Dans la trentaine de grille avec 9 E, le meilleur score obtenu fut 102 points mais la moyenne des scores de ces grilles était plutôt de 40 points.

Les mots les plus fréquents

A partir de nos résultats il est possible de voir quels mots apparaissent le plus régulièrement dans les grilles. 

Les mots de 7 lettres les plus fréquents sont les suivant :

RangMotNombre d'occurences
1RELATEE2588
2RESALEE2507
3REALESE2233
4ALIENEE2125
5ENRENAI2067
6ALESIEN2019
7REALESA2018
8SATANEE2013
9RATELEE2003
10ETALEES1992

 Les mots de 8 lettres les plus fréquents sont :

RangMotNombre d'occurences
1REALESEE672
2REALESAI575
3ALTERNEE478
4ETALERAI455
5ANEANTIE454
6RETENTEE450
7RELATEES449
8RONERAIE448
9ALIENEES442
10ENCESAI440

Les meilleurs plateaux

Parmi le million de grilles simulées, 6 grilles contiennent des mots de 13 lettres. En voici un exemple avec le mot BICENTENAIRES, dans une grille qui rapporte (seulement) 610 points.

Il existe des grilles qui rapportent bien plus de points, non pas parce qu'il y a beaucoup de mots longs, mais plutôt parce qu'il y a énormément de mots différents. La grille suivante a rapporté 2525 points. C'est le meilleur total obtenu dans nos simulations et elle est composée de 691 mots dont le plus long fait 11 lettres : RABOUTERAIS

Je rappelle que la règle du Boggle stipule que chaque joueur dispose de 3 minutes pour trouver un maximum de mots. Ne le vivez donc pas mal si vous n'arrivez pas à trouver les 691 mots en 3 minutes (ça fait a peu près 4 mots à trouver chaque secondes)

La meilleure grille actuelle que j'ai trouvé sur internet rapporte 3086 points selon mon dictionnaire (les résultats varient toujours un peu selon les dictionnaires utilisés) et comporte 680 mots dont 4 de 12 lettres : INTERESSASSE, PETASSERIONS (du verbe occitan "petasser" qui signifie raccommoder),  SINTERISASSE (imparfait du subjonctif du verbe  sinteriser qui signifie "Agglomérer des poudres en chauffant pour produire un objet solide") et ASSISTERIONS (là ça va je connais)

Il est évidemment possible de trouver des grilles permettant de faire des mots encore plus longs (jusqu’à 16 lettres) il est en revanche plus compliqué de trouver quelle grille permettrait de marquer le maximum de points.

Le pays le plus proche de chez vous


Après avoir vu passer quelques résultats similaires sur internet, je me suis lancé dans le projet de trouver, pour différentes zones géographiques, quels pays étaient les plus proches. Le but est donc, par exemple de découper un pays en différentes zones, chaque point d'une même zone étant plus proche d'un pays en particulier. La proximité se calcule ici à vol d'oiseau.

Méthode


Hélas la méthode pour réaliser cette analyse n'est pas des plus fines. En effet, le but de la manœuvre consiste à partitionner un polygone (par exemple un pays) en zones qui sont fonction de leur distances à d'autres polygones. La seule méthode que j'ai trouvé pour approximer ce résultat consiste à calculer le pays le plus proche pour un ensemble de points répartis à intervalles réguliers sur la carte.
Par exemple pour la France, il y a approximativement 27 000 points pour lesquels on a calculé quel était le pays le plus proche. Ces points sont répartis sous forme d'une grille très dense et sont représentés sur la carte ci-dessous.

Ça fonctionne, c'est pas le problème. Les deux seuls inconvénients sont le temps important de calcul pour obtenir cette précision et le fait que sur les limites entre deux zones on voit de manière assez évidente les crénelures formées par les points. (Ce n'est pas très propre).

Dans l'idéal, il serait plus élégant de trouver une solution qui permettrait de définir de nouveaux polygones de manière analytique via des équations des segments (et non pas via ce système de "grille de points")

Résultats

Sans plus attendre, les différents résultats. Tout d'abord commençons par la France.

C'est pas un peu magnifique?

J'ai ajouté les limites de départements afin que l'on puisse mieux voir où se situent les différentes zones. Les deux résultats un peu étonnant sont les surfaces très importantes liées à la Suisse et à la Belgique. Ce sont deux pays relativement modestes en terme de superficie et de longueur de frontière avec la France mais finalement ce sont eux qui s'en sortent le mieux. La surface que représente chacun des pays sur le territoire français se réparti ainsi : 25.2% pour l'Espagne, 22.4% pour la Suisse, 17.4% pour la Belgique, 17.3% pour la Grande-Bretagne, 9.9% pour l'Italie, 3.8% pour l'Allemagne (c'est peu je trouve), 2% pour Andorre (qui s’étend d'une manière assez cocasse à l'intérieur des terres), 1.2% pour Monaco et 0.7% pour le Luxembourg.
Le point le plus notable de ce résultat se situe à la frontière entre l'Indre-et-Loire et la Vienne où on petite zone de territoire est presque parfaitement à équidistance de l'Espagne, la Grande-Bretagne, la Belgique et la Suisse. Si vous habitez un peu au nord de Châtellerault vous avez l'embarras du choix pour partir en vacances. Le choix, parce que vous avec 4 disposition mais l'embarras parce qu'ils sont tous très éloignés.


Poursuivons à l'est avec le résultat pour L'Allemagne
Dans le cas de l'Allemagne, il y a une écrasante victoire de la République Tchèque qui représente 24% de la surface totale. Suivent les Pays-Bas avec 19.9%, la Pologne 15.5%, la France 11.4%, le Danemark 10.7%, l'Autriche avec 9.6%, la Belgique avec 4.5%, la Suisse avec 2.8% et enfin le Luxembourg avec 1.6%.

Passons ensuite à nos amis italiens :

Évidemment on obtient des résultats un peu étranges. VAT désigne le Vatican et SMR est le code pou la République de San-Marin. Ces deux petites enclaves en territoire italien sont donc assez souvent les pays "limitrophes" les plus proches. Malgré tout (et grâce à la Sardaigne), c'est la France qui est le mieux représentée car sa zone de proximité couvre 17.7% du territoire grâce à la proximité de la Corse, suivie de près par la Suisse (CHE) avec 17.3%, le Vatican avec 16.1% et San-Marin avec 14.5%. Enfin, plus loin derrière on trouve la Croatie (HRV) avec 7.7% qui est constituée de deux zones : un triangle au sud-est et un petit croissant au nord. On poursuit avec Malte au sud et en Sicile avec 7.6%, l'Albanie avec 6.7%, l’Autriche avec 6.5% et en queue de peloton, trois pays avec un faible pourcentage : la Tunisie avec 2.3% la Slovénie au nord-est avec 2.1% et la Grèce avec 1.4%.


Terminons enfin avec la péninsule ibérique.
Pas la peine de préciser que 100% du Portugal est plus proche de l'Espagne que de n'importe quel autre pays. On s'en doutait un peu. Pour l'Espagne les proportions sont les suivantes : 48.6% pour le Portugal, 30% pour la France, 9.7% pour le Maroc, 8.3% pour l'Algérie et 3.4% pour Andorre qui se débrouille pas si mal que ça. Il est a noter que Gibraltar n'est pas présent sur la carte (contrairement aux petits états comme Monaco, San Marin ou le Vatican) tout simplement parce que cette zone n’était pas présente dans les données dont je disposais. C'est pourtant plus grand que le Vatican mais cela de doit peut-être pas compter comme un territoire souverain. Si tel avait été le cas, le résultat aurai contenu une zone supplémentaire qui aurait eu approximativement la forme de celle crée par Andorre.

Conclusion


Maintenant vous savez quel est le pays le plus proche de votre lieu d'habitation, cela peut par exemple servir si vous devez rapidement quitter le pays (pour raison fiscale par exemple - dans ce cas-là je vous conseille quand même plutôt la Suisse) mais on peut aussi comprendre pourquoi de nombreux exilés fiscaux parisiens aiment aussi la Belgique.
Finalement vous avez ci-dessus une représentation de la meilleure manière d'optimiser votre exil fiscal.




La carte de Peutinger


Pas de stats dans cet article, juste de la cartographie amusante avec la "Table de Peutinger". Cette carte (ou plutôt ensemble de cartes) est une copie du XIII ème siècle, réalisée par des moines de Colmar d'une carte datant de 350 et qui représente le réseau "routier" de l'Empire romain. Cette carte est en fait découpée en 12 morceaux, qui, une fois assemblés, représente sur une bande de 6m82 sur 34 cm, les routes, les villes et les distances d'une zone immense. Cela regroupe l'Europe, un partie de l'Asie (jusqu'au Sri-Lanka) et un partie de l'Afrique du Nord. Elle est rentrée ensuite en la possession: en 1508, de Konrad Peutinger d'où elle tire son nom.



Le lien pour zoomer comme un petit fou : Carte de Peutinger

Comme vous pouvez le voir, sur les 12 panneaux, seuls 11 semblent encore exister, la partie tout à l'ouest a disparu. Elle contenait probablement une partie de l'Angleterre, l'Espagne et le nord du Maroc.

Il faut considérer cette table comme un plan schématique (comme un plan de métro) plutôt qu'une vraie carte. En effet, les distances y sont extrêmement distordues, les fleuves et mers sont déformés, mais ce n'est pas réellement un problème car chaque route indique les distances entre les différentes étapes. Et cette précision dans les distances a même permis d'orienter des recherches de sites archéologiques. Attention quand même, selon les régions, les distances ne sont pas forcement exprimées dans la même unités (en miles romains, en lieues gauloises...). De plus cette carte étant le fruit d'une copie il est possible que des erreurs se soient involontairement glissées (un X qui se transforme en V) et il semble aussi que certains ajouts inutiles aient été fait au Moyen-Age, surchargeant la carte d'informations erronées.

Cette illustration montre a quel point la topographie est distordue, la notion de Nord-Sud et Est-Ouest est a peu près bien respectée mais apprêtez-vous quand même à vous triturer un peu les méninges. On retrouve certains repères topographiques naturels (fleuves, montagnes...) mais d'autres ont complétement été omis.

Jonction entre la partie 1 (en gris car manquante) et la partie 2 (la Gaule)


Ce qui est donc amusant, c'est d'essayer de retrouver les différentes villes que l'on connait afin de comprendre comment cette carte est déformée. N'étant pas cartographe ni spécialiste de la Gaule romaine, j'ai donc du utiliser internet et mes quelques connaissances en noms romains de villes (Je tiens d'ailleurs à remercier Astérix - et principalement Astérix et le tour de Gaule, qui m'a appris, dès le plus jeune âge, l'existence de villes comme Condate, Nemesos ou Burdigala).

Toutes les villes et tous les points d’intérêt ne sont pas forcément détaillés, simplement parce que certains lieux majeurs au temps romain (principalement des zones thermales) ont périclité et ne sont plus que de petites communes dont le nom ne parlera à personne (voire même juste un champ de patates) et d'un autre côté, certaines grandes villes actuelles (Caen ou le Havre par exemple) n'étaient pas d'une importance significative à l'époque romaine. Le but est avant tout d'avoir une vue d'ensemble.

Évidemment nous ne nous intéresserons uniquement qu'au second segment, celui qui traverse la France. Le résultat est donc le suivant : 



On constate que les choses sont a peu près dans l'ordre mais je vous déconseille quand même d'utiliser cette carte pour partir en vacances, vous risqueriez de vous perdre. Au "nord" de la France (en tout cas au dessus- des villes françaises, se trouvent des villes belges, mais aussi allemandes sur la partie droite de la carte). La côte Atlantique en prend quand même un sacré coup mais en revanche, le bassin méditerranéen est décrit de manière complète, surtout à partir de l'embouchure du Rhône.

On critique, on critique, mais il faut néanmoins reconnaitre une très grande exhaustivité dans les informations fournies ainsi qu'une très grande précision dans les mesures de distances. (Mais niveau représentation c'est 0/20).

Vous trouverez des informations bien plus complètes et détaillées sur internet. Au moins via wikipedia : https://fr.wikipedia.org/wiki/Table_de_Peutinger et pour le reste je vous laisse chercher.



Vue à 360°

Introduction

La question est très simple, si vous montez au sommet de la Tour Eiffel à Paris (pas la Tour Eiffel à Las Vegas) et que vous regardez vers l'ouest. Quel est le premier pays que votre regard "croisera"?
Pour vous aider un peu, en regardant vers l'ouest votre regard va donc voir l'ouest parisien, mais si l'on imagine plus loin derrière l'horizon on traversera la Bretagne puis l'Atlantique jusqu'à arriver aux côtes du continent américain. Le premier pays (autre que le France) que votre regard croisera est donc un pays d'Amérique. Mais lequel ? Réfléchissez 1 minute avant de continuer la lecture afin d'être bien certain de votre réponse.

L'objectif de cet article est de calculer, étant donné un point de référence (ici la Tour Eiffel) quel est le premier pays (autre que la France évidemment) que votre regard croisera selon la direction dans laquelle vous regardez. Vers l'est on doit certainement tomber sur l'Allemagne, vers le sud-ouest surement sur l'Espagne, etc... C'est plutôt simple à visualiser pour les pays limitrophes mais nous verrons que les choses sont moins intuitives lorsqu'il y a de grandes distances à traverser.

Méthode

Pour effectuer les calculs il nous faut les positions et la forme de chaque pays. Il faut alors utiliser des fichiers de type shapefile qui représentent chaque pays sous forme de polygones plus ou moins détaillés (selon la précision de la carte) et en définissent les contours sous forme de coordonnées. L'analyse consiste alors à vérifier si la droite (la direction) suivie par notre regard traverse le polygone en question et si tel est le cas, à quelle distance (puisque nous cherchons le "polygone" le plus proche).

La méthode retenue consiste à choisir évidemment un point de départ et une direction (un angle). Ensuite, deux possibilités s'offrent a vous :
- Transformer la représentation du fichier de polygones en coordonnées azimutales centrées sur votre point de départ (ce qui conserve les angles) et ensuite étudier les intersections entre votre droite et les polygones comme vous le feriez dans un plan orthogonal en utilisant les équations de droite et les intersections. C'est la méthode retenue. La représentation azimutale est par exemple utilisée pour le logo des nations unies :

La représentation est ici centrée sur le pôle nord mais il est possible facilement de centrer cette représentation sur n'importe quel point. A partir de ce point, les angles sont parfaitement conservés.

- Vous pouvez aussi garder les coordonnées initiales, en revanche dans ce cas-là, l'intersection entre la droite formée par votre regard et le polygone ne pourra se résoudre qu'en utilisant des équations beaucoup plus complexes à cause de la rotondité de la Terre. Cela reste faisable néanmoins.


Étape 1 : On charge le shapefile (sauvé préalablement dans mon working directory)

# On charge les shapefiles des pays
library('rgdal')
library('ggplot2')
shp10 <- readOGR(dsn = "ne_10m_admin_0_countries", layer = "ne_10m_admin_0_countries") shp50 <- readOGR(dsn="ne_50m_admin_0_countries", layer="ne_50m_admin_0_countries") shp110 <- readOGR(dsn = "ne_110m_admin_0_countries", layer = "ne_110m_admin_0_countries") shp2 <- fortify(shp50) colnames(shp2)[1:2] = c("Longitude", "Latitude") # On a 10654 points de shapes appartenant a 176 Pays pour shp110 # On a 99599 points pour shp50 # on a 548121 points pour shp10


Finalement c'est le fichier de plus petite taille qui a été retenu. Il est composé de 10 000 points ce qui constitue une résolution malgré tout suffisante pour notre analyse. Le temps de calcul étant de toute façon proportionnel au nombre de points, on ne veut pas y passer trop de temps. Malgré tout il n'est pas nécessaire d'avoir une très grande précision dans le détail des polygones puisque le point qui nous intéresse est uniquement de savoir si on croise ou pas le pays. Il sera toujours possible d'ergoter sur quelques cas particuliers mais dans la grande majorité le résultat sera suffisamment satisfaisant.




Étape 2 : Définition des villes d’intérêt, on crée juste un data.frame avec les informations initiales. On parcourra une à une chaque ligne.

VILLE=data.frame(NOM=c("PARIS","BREST","CALAIS","MARSEILLE","STRASBOURG","AJACCIO"),
                LON=c(2.2069771,-4.5095871,1.6557295,5.2400702,7.6918828,8.6356297),
                LAT=c(48.8587741,48.3637114,50.9718019,43.2805546,48.5692058,41.9227051))

Et enfin l’étape 3, la boucle sur chacune des villes. J'annonce à l'avance que ce code peut être amélioré. Il est très basique dans le sens que l'on teste toutes les paires de coordonnées d'un polygone ainsi que la majorité des polygones. Il s'agit évidemment de la partie la plus consommatrice de temps. Il existe énormément de polygones qui n'auraient pas besoin d'être testés (par exemple, depuis la France, tous les polygones représentant les pays au sud du Maghreb ne seront jamais "visibles" car toujours "bloqués" par les pays d'Afrique du Nord. Idem pour la plupart des pays asiatiques. En fait c'est le cas pour tous les pays "enclavés" (c'est à dire entourés d'autres pays). Seuls les pays ayant une frontières terrestre avec la France ou bordant la mer ou un océan peuvent nous convenir. Tous les autres pourraient être éliminés.

Il existe d'autre versions de la résolutions de ce problème que vous pourrez trouver un peu partout sur le net). Par exemple c'est du Python. Ici, ça sera en R.

for(N in 1:nrow(VILLE)){
  print(VILLE[N,1])
  Longitude0 <- VILLE[N,"LON"]
  Latitude0 <- VILLE[N,"LAT"]
  # Transfo azimutale (a faire a chaque fois que l'on change de centre)
  shp110a <- spTransform(shp110, CRS(sprintf("+proj=aeqd +lat_0=%f +lon_0=%f",Latitude0,Longitude0)))
  # Conversion de l'objet
  shpa <- fortify(shp110a)
  colnames(shpa)[1:2] = c("Longitude", "Latitude")

  # On splitte par groupe
  # attention un pays peut appartenir a +ieurs gpe : expl france + corse + guyane)
  sshpa <- split(shpa,as.numeric(shpa$group))

  # On va stocker le pays le plus proche pour chaque valeur d'angle
  BESTCOUNTRY = c()
  # Liste des angles a parcourir, ici tous les 1°
  SEQ =  seq(0,360,by=1)
  t0 <- Sys.time()
  for (angle in SEQ){
    cat(sprintf("\n-----------\nAngle %i\n-----------\n",angle))
    # On convertit l'angle qui est en degree
    theta = pi * angle / 180
    RESangle = array(Inf,dim=length(sshpa))
    # On parcourt les pays 1 a 1 pylogones 1 a 1
    for(i in 1:length(sshpa)){
      # On skippe l'id de la france
      if(i%in% c(120,121,122)) next

      dat <- unique(sshpa[[i]][,1:2])
      colnames(dat) = c("long","lat")
      # En fonction de l'angle, certain pays n'ont pas a etre testés
      # Par exemple si on regarde vers le NE
      # Tous les points des coordonnées negatives n'ont pas a etre analysé
      # Réduit le nb de calculs a faire
      if(angle%%360 >=0 & angle%%360 <=180) if(all(dat$lat<0)) next
      if(angle%%360 >=180) if(all(dat$lat>=0)) next
      if((angle-90)%%360 >=0 & (angle-90)%%360 <=180) if(all(dat$long>0)) next
      if((angle-90)%%360 >=180) if(all(dat$long<=0)) next

      # Si le pays est visible on l'affiche
      # On parcourt toutes les paires de points
      Dist = Inf
      tmp1=tmp2 =c ()
      for(j in 1:nrow(dat)){
        if(j==nrow(dat)){
          p1 = dat[j,c("long","lat")]
          p2 = dat[1,c("long","lat")]
        }else{
          p1 = dat[j,c("long","lat")]
          p2 = dat[j+1,c("long","lat")]
        }
        # On calcule l'intersection entre notre point (0,0) et le segment p1 p2
        # Equation de la droite passant par 0,0 et de pente "angle"
        a1 = tan(theta)
        b1 = 0
        # Equation du segment formé par les deux points consecutifs
        a2 = (p2[2]-p1[2]) / (p2[1]-p1[1])
        b2 = p1[2] - a2 * p1[1] 
        # Intersection des deux droites
        xi = (b2-b1)/(a1-a2)
        yi = a1 * xi + b1
        # On teste si cette intersection se trouve a l'interieur du segment
        isIN = xi < max(p1[1],p2[1]) &  xi > min(p1[1],p2[1]) & yi < max(p1[2],p2[2]) &  yi > min(p1[2],p2[2])
        # L'intersection est peut-etre sur le segment mais il faut verifier qu'on soit dans le bon sens
        # expl : avec un angle a 180 degree on s'attend a ce que xi < 0
        if(isIN){
          if(angle%%360 >=0 & angle%%360 <=180) if(round(yi,3)<0) isIN = FALSE
          if(angle%%360 >=180) if(round(yi,3)>0) isIN = FALSE
          if((angle-90)%%360 >=0 & (angle-90)%%360 <=180) if(round(xi,3)>0) isIN = FALSE
          if((angle-90)%%360 >=180) if(round(xi,3)<0) isIN = FALSE
        }
        # Et on calcule la distance de cette intersection a 0,0
        if(isIN) if(sqrt(xi^2 + yi^2) < Dist) Dist = sqrt(xi^2 + yi^2)
        tmp1[j]=isIN
        tmp2[j]=unlist(sqrt(xi^2 + yi^2))
      }  
      RESangle[i] = as.numeric(Dist)
    }

    # On regarde quel est l'id du polygone le plus proche
    # et que l'on a traversé
    gpebest = order(RESangle)[1]
    # On retrouve le pays auquel il appartient
    idbest = as.numeric(sshpa[[gpebest]]$id[1])
    print(shp110$ADMIN[idbest+1])
    BESTCOUNTRY[match(angle,SEQ)] = shp110$ADMIN[idbest+1]
    print( Sys.time() - t0)
  }
  save(BESTCOUNTRY,SEQ,file=sprintf("dat%s.RData",VILLE$NOM[N]))
}


Il s'agit donc d'un code assez "bourrin" qui cherche les coordonnées de l'intersection entre la droite (en fait, une demi-droite) définie par notre regard et une arête d'un polygone. Si cette intersection se trouve bien à l’intérieur du segment définit par l'arête, alors notre regard a bien croisé cette arête et donc ce polygone, il ne reste plus qu'à en calculer la distance et stocker tout cela. Sans parallélisation du code et en utilisant la cartographie à 10 000 points, il faut environ 1h30 de calcul pour obtenir les 360 résultats (un résultat par degré) donc il ne faut pas être trop pressé. La partie importante de ce code réside dans la conversion en coordonnées azimutale, ce qui implique que le point où vous vous trouvez se situe forcément aux coordonnées (0,0) et que les coordonnées des polygones des pays ont été redéfinies en fonction de cette nouvelle origine. Cela simplifie énormément les calculs et comme la fonction de transformation existe déjà cela enlève la partie la plus complexe de l'analyse.

Résultats

Une fois obtenu le résultat, la représentation graphique est laissé à l'inspiration de chacun. J'en ai fait une version assez basique mais très colorée. (De toute façon peu importe les couleurs que vous choisirez, il y a 28 pays différents, donc 28 couleurs a représenter, inutile d’espérer de trouver une palette de couleurs avec 28 teintes réellement différentiables a tous les coups)

Regarde maman, on voit vachement bien le Venezuela d'ici

Dans cette représentation, le nord est en haut et le reste des points cardinaux est à l'avenant.

Analyse

En regardant ce premier résultat pour Paris, on arrive bien a imaginer qu'en se postant au sommet de la tour Eiffel et en regardant vers l'est le prochain pays que notre regard "rencontrera" sera l'Allemagne, ou la Suisse, le Luxembourg et la Belgique selon l'angle choisit. Je met des guillemets à "rencontrera" parce qu'on est bien d'accord qu'arrivé à cette étape vous vous doutez bien qu'on ne "voit" pas vraiment l'autre pays depuis la tour Eiffel, déjà parce que la Terre étant ronde la visibilité maximale autour de la tour Eiffel et d'environ 65 km et aussi parce que même si la Terre était plate, l'air de Paris serait trop pollué pour espérer voir quoique ce soit. (En revanche si la Terre est plate les calculs doivent surement être plus simples)
Revenons à nos moutons. Si vous êtes habitués aux cartes et aux projections traditionnelles, vous devez surement vous dire, comme moi, qu'en regardant vers l'ouest depuis Paris on devrait tomber sur le Canada ou les USA, en tout cas pas la République Dominicaine !!!

Preuve (Google Maps) :




Il existe donc deux possibilités : soit mon code est faux, soit la Terre n'est pas plate. Comme mon code n'est (évidemment) pas faux, la Terre n'est donc pas plate (CQFD) et il faut donc utiliser Google Earth pour tracer une vraie ligne droite sur le globe.

Preuve (Google Earth) :



On part bien vers l'ouest depuis Paris



Et paf, on est en République Dominicaine !


Étonnant non? Vous ne l'aviez pas vue venir celle-là? On peut ensuite regarder les différents résultats obtenus selon la ville de départ sélectionnée :

Pour Brest :

C'est l'endroit d'où on voit le mieux le Brésil.


Pour Calais :

Apparemment, de Calais on semble très bien voir le Royaume-Uni et la Belgique (et aussi accessoirement l'Espagne mais il me semble que c'est un peu plus loin). Il est amusant de constater que toutes ces villes du Nord peuvent apercevoir (à des degrés divers) des pays qui semblent très au sud comme le Brésil, ce qui n'est possible que parce que la vue n'est pas obstruée par l'Espagne lorsque l'on se situe suffisamment au nord.

Pour Marseille :


Côté est c'est évidemment l'Italie qui prédomine, au sud l'Algérie, pour la partie est / sud-ouest on a aussi l'Espagne. Ces trois pays représentent respectivement 127°, 60° et 57° soit donc un total de 244°, les 2/3 du paysage donc.

Pour Strasbourg :

Le Pac-Man allemand.

Pour Ajaccio :


Et pour notre dernier essai, le Pac-Man italien, a noter une petite incursion de la Libye.





Friends


Évaluation des relations entre les personnages de Friends


Introduction

Cet article va expliquer en partie comment fonctionne actuellement ce blog. Je m'explique. Je regardais l'épisode 6 de la saison 1 de "The good place". A un moment, un personnage compare son amitié avec celle qui unie Ross et Phoebe (il ne maitrise pas trop les concepts d'amitié). Cette affirmation surprend l'autre personnage puisque, pour ceux qui ont suivi la série Friends, Ross et Phoebe sont probablement les deux personnages de la série qui se fréquentent le moins. Il existe des relations d'amitié bien plus fortes dans cette série (par exemple entre Chandler et Joey).




Analyse des relations


Pour tous les fans de la série il est évident que Ross et Phoebe n'ont (quasiment) pas de liens d'amitié. Je voulais voir si il était possible de confirmer cette évidence en s'appuyant sur des données chiffrées. Pour cela rien de plus "simple". En se basant sur le fait que deux personnes amies auront plutôt tendance à passer du temps ensemble nous allons essayer de comptabiliser le nombre de temps où deux personnages sont ensemble dans la même scène. Il existe alors deux solutions : la première consiste à regarder les 236 épisodes (comptez environ 86h) et de noter toutes les fois où les acteurs sont ensemble dans chaque scène. La deuxième solution (pour les grosses feignasses comme moi) repose sur deux éléments : Tout d'abord le site https://fangj.github.io/friends/ qui recense les scripts de tous les épisodes de Friends, chaque script contenant les dialogues et didascalies. Dans un second temps il faut extraire et formater les données. Coup de chance cela a déjà été fait par un autre blogger anglophone (Lien ici) qui a aussi réalisé une étude à ce sujet (mais qui ne répond pas à notre question). Dans son article il essaye de trouver quel personnage peut être considéré comme le personnage principal. Pour cela il compte la quantité de dialogue pour chaque personnage (ce qui constitue un indicateur de l'importance du personnage). La conclusion est que les scénaristes ont plutôt bien fait leur travail et la quantité de tirade pour chacun des acteurs est plutôt bien équilibrée tout au long de la série.

Bref, revenons à nos moutons. Nous avons désormais un jeu de données qui liste toutes les scènes de la série ainsi que la liste de chaque personnage qui a des lignes de texte dans chacune des scènes. Nous allons donc pouvoir compter le nombre total de scènes parlantes par personnage (c'est à dire où l'acteur parle) mais aussi le nombre de fois où il partage l'écran avec un autre acteur. On obtient donc une matrice 6 x 6 (puisqu'il y a 6 personnages principaux). Le résultat est le suivant.


Nombre de scènes en commun entre deux acteurs

Prenons le cas de Chandler. Au total Chandler apparait dans 1359 scènes (la série contient 2857 scènes au total). Sur ces 1359 scènes, il en partage 837 avec Joey et 881 avec Monica (ce qui semble logique, Chandler étant très ami avec Joey et en couple avec Monica pendant une bonne partie de la série). Ensuite, Chandler partage 687 scènes avec Ross et seulement 626 avec Rachel et 638 avec Phoebe (donc environ 30% de scènes en moins). Si l'on recherche les "couples" d'acteurs ayant le moins de scènes ensemble, on trouve bien le duo Ross-Phoebe avec seulement 602 scènes ensemble et, de manière plus surprenante, il n'y a que 607 scènes entre Ross et Monica (qui sont pourtant frères et sœurs).

Pour mettre en évidence ces relations, il est aussi possible d'aller un peu plus loin en comptant le nombre de scènes communes à chaque couple de personnages mais avec la condition supplémentaire qu'ils soient les deux seuls acteurs principaux à parler dans ces scènes (il peut y avoir d'autres personnages présents parmi les 6 principaux mais ils doivent seulement faire de la figuration de même qu'il peut y avoir des acteurs secondaires qui parlent). L'idée est de voir si chaque binôme peut avoir sa propre part de narration. Le résultat est le suivant :


Nombre de scènes à deux sans autres acteurs principaux

Cette fois-ci, le résultat fait la part belle aux couples d'amoureux (Monica-Chandler et Ross-Rachel). Il semble logique que ces couples puissent disposer de scènes entre eux afin de faire avancer leur relation amoureuse. On retrouve, un peu derrière, le "couple" Joey-Chandler. Parmi les 336 scènes de Chandler à deux acteurs, il en a 146 avec Monica et 111 avec Joey, les trois autres acteurs se répartissent les 23% de scènes restantes.
Une fois de plus, en queue de peloton on retrouve des couples "improbables" qui partagent à peine une vingtaine de scènes à deux. Il s'agit des couples Chandler-Phoebe, Ross-Monica (une fois de plus) et Chandler-Rachel. Les déséquilibres sont plus forts dans cette configuration puisque cela favorise les couples très importants pour le récit.

Une version moins "amoureuse" et plus "amicale" consiste à regarder les scènes avec des trios (c'est a dire exactement trois acteurs principaux qui parlent dans la même scènes). On obtient alors le résultat suivant :


Répartition des scènes avec trois acteurs


Dans ce dernier cas, on peut constater que c'est le couple Chandler-Joey qui repasse devant. Ils ont 155 scènes ensemble dont 67 avec Ross, 55 avec Monica, 17 avec Rachel et 10 avec Phoebe. Ainsi, en moyenne il n'y a qu'une scène par saison avec le trio Chandler-Joey-Phoebe, autant dire que c'est rare. La palme du trio le plus rare est Monica-Ross-Joey, qui n'ont que 5 scènes ensemble parmi toutes les scènes à trois.
Les trios les plus fréquents sont donc Ross-Chandler-Joey (avec 67 occurrences) et Monica-Rachel-Phoebe avec 60 occurrences. Cela confirme que les scènes à 3 personnages se déroulent plutôt dans le cadre amical alors que les scènes à deux sont plus liées aux relations amoureuses.