Archive for October, 2010

L’arrondi

Friday, October 22nd, 2010

Introduction

Un arrondi est nécessaire lorsqu’un nombre d’une certaine précision, doit être converti en un nombre d’une moindre précision.

Typiquement, un arrondi doit être effectué lorsqu’un nombre à virgule est converti en un nombre entier.

Cette notion peut sembler toute simple. Nous avons tous appris en cours de math qu’un nombre à virgule s’arrondi de la façon suivante :

  1. si la partie décimale est inférieure à 0.5, le nombre est arrondi vers le bas (par exemple 1.3 ≈ 1)
  2. si la partie décimale est supérieure ou égale à 0.5, le nombre est arrondi vers le haut (par exemple 1.6 ≈ 2 ou encore 1.5 ≈ 2)

Un premier doute s’installe lorsqu’il s’agit d’un nombre négatif. Un arrondi vers le bas correspond-il a un arrondi vers un nombre plus positif ou plus négatif ?

D’autre part, est-ce réellement la seule façon d’arrondir un nombre à virgule ? Y a-t-il une façon plus juste qu’une autre ?

Lors de l’écriture d’un programme qui manipule des nombres ayant à être arrondis, il est nécessaire de connaître comment une fonction d’arrondi réalise l’opération et quel sera le résultat obtenu.

Pour commencer, voyons les différentes façons d’arrondir un nombre à virgule (appelé également nombre réel).

Arrondi vers le bas (arrondi vers -∞)

Le nombre réel est arrondi vers l’entier inférieur.

3.4 ≈ 3

-3.4 ≈ -4

Arrondi vers le haut (arrondi vers +∞)

Le nombre réel est arrondi vers l’entier supérieur.

3.4 ≈ 4

-3.4 ≈ -3

Arrondi par troncature (vers zéro)

Le nombre réel est arrondi vers l’entier suivant le plus proche de zéro. Concrètement, la partie décimale du nombre réel est simplement retirée.

3.4 ≈ 3

-3.4 ≈ -3

Arrondi vers les infinis (par éloignement de zéro)

Le nombre réel est arrondi vers l’entier suivant s’éloignant le plus de zéro.

3.4 ≈ 4

-3.4 ≈ -4

Arrondi au plus proche

Le nombre réel est arrondi vers l’entier le plus proche du nombre réel.

3.4 ≈ 3

3.6 ≈ 4

-3.4 ≈ -3

– 3.6 ≈ -4

Cette dernière forme d’arrondi pose problème lorsque la partie décimale est exactement à mi-chemin entre deux nombre entiers (par exemple 3.5 ou -3.5).

Dans ce cas, il existe plusieurs façons d’arrondir :

Arrondi vers le bas (vers -∞)

3.5 ≈ 3

-3.5 ≈ -4

Arrondi vers le haut (vers +∞)

Cette méthode d’arrondi est également appelée arrondi arithmétique asymétrique.

3.5 ≈ 4

-3.5 ≈ -3

Arrondi vers zéro

3.5 ≈ 3

-3.5 ≈ 3

Arrondi vers les infinis

Cette méthode d’arrondi est celle qui est certainement la plus communément utilisée en arithmétique. On parle également d’arrondi arithmétique symétrique.

3.5 ≈ 4

-3.5 ≈ -4

Arrondi au pair le plus proche (arrondi bancaire)

Si la partie entière est impaire, le nombre arrondi sera le nombre pair le plus proche.

Si la partie entière est paire, elle correspond au nombre arrondi.

3.5 ≈ 4

2.5 ≈ 2

-3.5 ≈ -4

-2.5 ≈ -2

Cette méthode élimine le biais qui survient en cas d’arrondi systématique vers les infinis (ou vers zéro).

Arrondi à l’impair le plus proche

Si la partie entière est paire, le nombre arrondi sera le nombre impair le plus proche.

Si la partie entière est impaire, elle correspond au nombre arrondi.

3.5 ≈ 3

2.5 ≈ 3

-3.5 ≈ -3

-2.5 ≈ -3

Cette méthode d’arrondi est très rarement utilisée, sauf lorsqu’il est important que -0.5 et 0.5 ne soient pas arrondis à zéro.

Arrondi stochastique

C’est le hasard (uniformément réparti) qui détermine si le nombre sera arrondi vers l’entier supérieur ou inférieur.

Comme pour l’arrondi au pair le plus proche, cette méthode élimine le biais d’arrondi, mais introduit une notion de hasard qui rend la reproduction de calculs impossible.

Arrondi alterné

L’arrondi est alternativement fait vers l’entier supérieur puis vers l’entier inférieur.

Résumé

nombre -2.6 -2.5 -2.4 -1.6 -1.5 -1.4 -0.6 -0.5 -0.4 0.4 0.5 0.6 1.4 1.5 1.6 2.4 2.5 2.6
vers +∞ -2 -2 -2 -1 -1 -1 0 0 0 1 1 1 2 2 2 3 3 3
vers -∞ -3 -3 -3 -2 -2 -2 -1 -1 -1 0 0 0 1 1 1 2 2 2
troncature -2 -2 -2 -1 -1 -1 0 0 0 0 0 0 1 1 1 2 2 2
vers les ∞ -3 -3 -3 -2 -2 -2 -1 -1 -1 1 1 1 2 2 2 3 3 3
au plus proche vers +∞ -3 -2 -2 -2 -1 -1 -1 0 0 0 1 1 1 2 2 2 3 3
vers -∞ -3 -3 -2 -2 -2 -1 -1 -1 0 0 0 1 1 1 2 2 2 3
vers zéro -3 -2 -2 -2 -1 -1 -1 0 0 0 0 1 1 1 2 2 2 3
vers les ∞ -3 -3 -2 -2 -2 -1 -1 -1 0 0 1 1 1 2 2 2 3 3
pair -3 -2 -2 -2 -2 -1 -1 0 0 0 0 1 1 2 2 2 2 3
impair -3 -3 -2 -2 -1 -1 -1 -1 0 0 1 1 1 1 2 2 3 3
stochastique -3 -3 ou -2 -2 -2 -2 ou -1 -1 -1 -1 ou 0 0 0 0 ou 1 1 1 1 ou 2 2 2 2 ou 3 3
alterné -3 -3 (-∞) -2 -2 -1 (+∞) -1 -1 -1 (-∞) 0 0 1 (+∞) 1 1 1 (-∞) 2 2 3 (+∞) 3

Note : lorsque un nombre négatif est arrondi à zéro, certaines implémentations préservent le signe devant le zéro : -0.5 ≈ -0, afin de distinguer un arrondi à zéro provenant d’une nombre négatif, d’un arrondi provenant d’un nombre positif.

Fonctions courantes d’arrondi

Chaque langage (et chaque bibliothèque de fonctions) met à disposition un certain nombre de fonctions d’arrondi.

J’ai tenté de réunir dans un tableau les différentes façons d’arrondir un nombre réel ainsi que les différentes fonctions proposées par un langage ou une bibliothèque particulière.

Je m’en suis tenu aux langages que j’utilise couramment : C++ (avec les bibliothèques standards), C++ avec la bibliothèque Qt, VBS et Java. J’y ai ajouté Excel (et donc Keynote, qui implémente les mêmes fonctions), que j’utilise également régulièrement.

méthode\langage VBScript C++ C++ et cmath C++ Qt Java et java.lang.math Excel
vers +∞ ceil() ceil()
vers -∞ Int floor() floor() INT() ENT()
vers zéro
(troncature)
Fix static_cast<int>() trunc() int() ROUNDDOWN() ARRONDI.INF()FLOOR() TRONQUE()
vers les ∞ ROUNDUP() ARRONDI.SUP()CEILING() PLAFOND()
au plus proche vers +∞ qRound round()
vers -∞
vers zéro
vers les ∞ FormatNumber1 round() ROUND() ARRONDI()
pair Round CByte CInt CLng rint() rint()
impair
stochastique
alterné

1Contrairement aux autres fonctions qui retournent un nombre, FormatNumber retourne une chaîne de caractères formatée selon certains paramètres donnés. Il reste néanmoins intéressant d’observer la méthode d’arrondi utilisé par cette fonction.

Ce tableau montre bien la confusion qui peut s’intaller : une fonction nommée Round va par exemple faire un arrondi au pair le plus proche en VBS, mais un arrondi arithmétique symétrique en C++ et avec Excel. La fonction équivalente en Java fera un arrondi arithmétique asymétrique, de même que la fonction qRound de Qt !


Sources :

Wikipedia : Rounding to integer

Wikipédia : Arrondi

Aide et support Microsoft : How To Implement Custom Rounding Procedures

La 3D

Thursday, October 7th, 2010

Préambule

Au cours de ma formation pédagogique, j’ai été amené à faire une présentation de 30 minutes sur un thème à choix.

Après de nombreuses hésitations et de multiples changement d’avis, j’ai choisi le thème à la mode de la 3D. Voici le document que j’ai écrit et qui a servi de base à ma présentation.

À noter également que bien que la plupart des images et illustrations qui jalonnent cet article soient de moi, j’en ai utilisé certaines sans l’autorisation de leurs auteurs. Pour certaines, je n’ai même pas retrouvé l’auteur.

Si une de vos images se retrouve sur cette page, n’hésitez pas à me contacter pour que je puisse la retirer.

Introduction

Depuis quelques mois, dans le domaine de l’image (particulièrement de l’image animée, c’est-à-dire du cinéma et du home-cinéma), le concept à la mode est la 3D, autrement dit la perception du relief et de la profondeur.

Il ne se passe pas une semaine sans qu’on annonce que l’avenir du cinéma sera 3D ou ne sera pas.

Il ne se passe pas une semaine sans qu’un nouveau tournage de film soit annoncé en 3D.

Il ne se passe pas une semaine sans qu’un fabriquant d’appareils domestiques n’annonce une prise en charge révolutionnaire de la 3D.

Mais, la 3D, c’est quoi ? Comment est-ce que ça fonctionne ? Qu’est-ce que ça apporte ?

Vision binoculaire

Nous percevons le relief grâce à nos deux yeux, qui nous offrent une vision binoculaire. Ceux-ci étant distants d’environ 65 mm, chacun ne voit pas exactement la même chose, en particulier pour les objets proches.

L’oeil gauche envoie donc au cerveau une image légèrement différente de celle envoyée par l’oeil droit. Le cerveau se charge alors de combiner ces deux images et de construire une représentation tri-dimensionnelle de ce que l’on voit.

Exercice :
Placer son index au bout de son nez, à une distance d’environ 10 centimètres, et cligner successivement des yeux : chaque oeil voit l’index différemment.

Cette vision tri-dimensionnelle nous permet de percevoir les reliefs et les distances. Les distances sont très précises (environ 10 centimètres de précision à une distance de 10 mètres) mais diminue fortement lorsque les distances augmentent.

Pathologies de la vision binoculaire

La vision binoculaire nécessite de faire travailler les deux yeux comme un seul, en parfaite coordination motrice et sensorielle.

Certains personnes auront des difficultés à avoir une vision binoculaire, par exemple à cause d’un strabisme ou d’autres problèmes liés à la vision.

La perte d’un oeil supprime toute possibilité de perception du relief par la vision binoculaire, rendant certains gestes de la vie de tous les jours plus difficiles à accomplir. Toutefois, les borgnes parviennent à appréhender l’espace.

Exercice :
Déboucher un stylo et le tenir d’une main à 20-30 cm devant soi.
Fermer un oeil et avec l’autre main, essayer de le reboucher.

Ceci est possible parce que le cerveau utilise d’autres informations que la vision binoculaire pour percevoir le relief.

Perception du relief

Avec une vision monoculaire

Même avec un seul oeil, notre cerveau est capable de percevoir la profondeur, en analysant ce qu’il voit et en tenant compte de ce qu’il connaît. Cette capacité lui permettra de reconstituer la profondeur.

D’ailleurs, la plupart de nos médias (livre, télévision, écran de cinéma, moniteur d’écran, photo) n’étant qu’une simple surface plane (donc sans profondeur), ils font abondamment usage de techniques de perception monoculaires donnant à notre cerveau l’illusion de profondeur.

Les illusions d’optique se basent sur cette même capacité du cerveau, mais en essayant de le duper.

Accommodation

L’effort musculaire nécessaire aux yeux pour observer un objet proche de façon nette (l’accommodation) donne au cerveau une information sur la distance de ce qu’il observe.

L’accommodation devient inopérante au-delà de 10 mètres.

De plus, lorsque l’oeil est focalisé sur un objet proche, l’arrière-plan est flou.

En photographie, l’espace dans lequel un objet sera perçu comme net est la profondeur de champ et permet à l’image de gagner en profondeur.

Perspective linéaire

La perspective linéaire est la convergence des lignes vers un (ou plusieurs) point de fuite.

C’est seulement vers le XVe siècle environ que la perspective est couramment utilisée pour proposer une représentation au plus proche de la réalité.

Superposition des contours

Les contours d’un objet éloigné sont éventuellement cachés partiellement par un objet rapproché. Ce principe est essentiel dans l’aide à une perception monoculaire.

On sait que les nuages dans le ciel sont plus proches de nous que la lune parce qu’ils peuvent la cacher.

Cet effet est souvent accentué en dessin en utilisant des traits plus épais pour les éléments proches et plus fins pour les éléments éloignés.

Plusieurs illusions d’optique se base sur ce phénomène pour perturber la perception de la profondeur de notre cerveau.

Ombrage

L’existence des zones ombrées et des zones éclairées facilite la représentation des formes à trois dimensions à partir d’une image plane.

Cet effet d’ombrage est un élément psychologique très important dans la perception de la profondeur et du relief. Comme on est habitué à voir la lumière venant d’en haut, un relief sera éclairé par le haut et son ombre sera projetée dans la zone inférieure.

Cette technique a été énormément utilisée en informatique pour donner une sensation de relief aux interfaces graphiques.

Taille relative d’objet connu

Souvent on a une connaissance assez précise de certains objets dans une scène. Ainsi, la taille d’un image nous permet d’apprécier la distance à l’objet (par exemple : taille d’un personnage).

Les objets apparaissent plus grands lorsqu’il sont près et la mémoire permet de juger de la distance vers des objets familiers.

Perspective de texture

La réduction progressive d’une texture dans une direction ou sa déformation provoque une perception de profondeur et de relief.

Perspective de surface (perspective atmosphérique)

La perspective de surface se forme par l’atténuation des contrastes des objets lointains due à la diffusion atmosphériques.

Dans la nature, les objets éloignés sont plus ou moins indistincts, et les objets rapprochés, au contraire, sont nets. Ceci donne avec le concours des phénomènes atmosphériques, une sensation de profondeur renforcée.

D’autre part, la densité de l’atmosphère aura tendance à donner une teinte bleutée aux objets éloignés.

Le parallaxe du mouvement

Lorsqu’on se déplace, les objets qui sont le plus près de nous sembleront se déplacer plus rapidement que les objets plus éloignés. Cette information est très importante dans la perception de la profondeur.

Ce phénomène est très facile à observer lorsqu’on est assis dans un train et que l’on regarde le paysage au travers de la fenêtre.

En résumé

La simple vision monoculaire peut nous donner une sensation du relief, puisqu’en regardant une image plane, on n’éprouve aucune difficulté à repérer ces objets les uns par rapport aux autres.

Mais cette vision de relief basée sur ces facteurs monoculaires, nous donne seulement une connaissance grossière du relief fin car l’information fournie par les facteurs monoculaires est une vue totale de l’espace. Pour obtenir une perception fine du relief, être capable de percevoir le géométrie locale est indispensable, ce qui n’est possible que dans la condition binoculaire, c’est-à-dire la vision stéréoscopique.

Avec une vision binoculaire

Pour reproduire le relief avec une vision binoculaire, il faut que chaque oeil perçoive une image différente.

Il y a principalement deux façons d’obtenir des images différentes pour chaque oeil : avec accessoire (généralement des lunettes) ou sans accessoire.

Avec accessoire

L’accessoire en question est toujours le même : une paire de lunettes. Le but de cette paire est de garantir que l’image vue par l’oeil gauche n’est pas la même que celle vue par l’oeil droit.

Lunettes à filtres polarisants

La lumière émise par le soleil ou par une ampoule se diffuse dans toutes les directions.

Le filtre polarisant se charge de ne laisser passer que les ondes lumineuses d’un sens donné.

Il est donc possible de projet deux images différentes, sur le même écran, en les polarisant différemment (décalage de 90 degrés entre elles).

Le premier projecteur diffuse sur l’écran une image polarisée verticalement.

Un deuxième projecteur diffuse sur le même écran une image polarisée horizontalement.

L’écran affiche donc deux images mélangées, l’une polarisée verticalement et l’autre polarisée horizontalement.

Il ne reste plus qu’à regarder l’écran au travers de lunettes elles-mêmes polarisées.

Ainsi, l’oeil de gauche ne percevra que l’image de gauche (polarisée horizontalement) et l’oeil droit ne percevra que l’image de droite (polarisée verticalement).

Projection alternée

Le principe ici est d’alterner vision gauche et vision droite d’une manière suffisamment rapide pour que le cerveau ne perçoive pas la différence (grâce à la persistance rétinienne).

Alternativement, c’est l’image pour l’oeil droit (A) qui est projetée, l’image de l’autre projecteur étant obturée.

Ensuite, c’est l’image pour l’oeil gauche (B) qui est projetée, l’autre projecteur étant à son tour obturé.

Ce système nécessites des lunettes à cristaux liquides, qui deviennent opaques (un oeil est bouché) alternativement, selon les images projetées à l’écran. La difficulté réside dans le fait de synchroniser les lunettes à l’écran, ce qui les rend un peu plus coûteuses et consommatrices d’énergie.

Projection d’anaglyphes

C’est la première technique qui a été inventée et c’est la plus simple à mettre en place. Elle se base sur l’utilisation de filtres de couleurs (différents pour chaque oeil) pour que chaque oeil perçoive une image différente.

Un anaglyphe est constitué de deux images superposées (appelées homologues) de couleurs complémentaires représentant la même scène mais vue de points légèrement décalés : le plus souvent la vue gauche en rouge et la vue droite en cyan.

On projette sur un écran les homologues. Dès lors, il ne reste plus qu’à regarder la projection à l’aide de lunettes teintées des deux couleurs complémentaires pour avoir l’impression de relief. Ces lunettes peuvent être fabriquées soi-même ou achetées toutes faites (pour ma part, je les ai commandées ici).

D’autres couleurs sont aussi possibles, comme le jaune et bleu, ou le rouge et bleu.

Le désavantage de ce procédé est que l’image retransmise de cette manière n’est jamais d’une qualité exceptionnelle, surtout pour ce qui concerne le rendu des couleurs. De plus, comme chaque œil envoie au cerveau une image de teinte différente, celui-ci doit faire un travail supplémentaire de reconstitution qui peut rapidement devenir source de maux de tête et de fatigue oculaire.

Pour créer un anaglyphe, il faut au départ deux images légèrement décalées (des images de synthèse ou des photographies).

vue de l’œil gauche vue de l’œil droit

Les couleurs produites par un ordinateur sont faites des composantes rouge, verte et bleue.

Le cyan s’obtient par l’addition des composantes bleue et verte.

Derrière le filtre rouge, l’œil gauche ne verra que la composante rouge. La composante cyan est enlevée. Comme le cyan est obtenu par la combinaison des couleurs de base verte et bleue, ces deux composantes sont enlevées.

Derrière le filtre cyan, l’œil droit ne verra que la composante cyan. La composante rouge est enlevée.

Il suffit ensuite de reconstruire une nouvelle image, qui fusionne la composante rouge de l’image destinée à l’œil gauche et les composantes verte et bleue de l’image destinée à l’œil droit.

Voici pour le plaisir, quelques anaglyphes supplémentaires :

(image tirée du site http://www.rickshel.net/)

(et encore un pour les plus de 18 ans, trouvé sur cette page).

Sans accessoire

Il est possible de voir une image en trois dimensions sans accessoires. On parle alors d’auto-stéréoscopie.

Strabisme convergent

L’idée est de croiser les images (l’image de gauche est mise à droite et celle de droite est mise à gauche) et de loucher. L’oeil gauche vise l’image de droite et l’oeil droit vise l’image de gauche.

Cette technique fonctionne, mais n’est pas facile à réaliser pour le spectateur. Elle est source de fatigue musculaire élevée et peut être sujette à maux de tête et nausée. Elle est rarement utilisée.

Strabisme divergent

Une autre technique est d’accommoder la vision derrière l’image. Elle demande également beaucoup d’entraînement mais est plus reposante pour les yeux. Toutefois, le résultat n’est pas vraiment exploitable pour des images réelles, chaque œil distinguant quand même en périphérie l’image destinée à l’autre œil.

Par contre, elle est couramment utilisée pour les fameux stéréogrammes.

À noter que la vision divergente, lorsqu’elle est maîtrisée, permet de repérer facilement les différences entre deux images (les différences ont tendance à clignoter).

Par exemple, sans la technique de vision divergente, il est très difficile de repérer les 7 différences entre les deux images ci-dessous, alors que l’exercice est plutôt simple avec la vision divergente (les différences semblent clignoter aux yeux).

Alioscopie

L’alioscopie consiste à diffuser des images en relief sans avoir besoin de lunettes 3D. L’impression de relief est obtenue grâce à un réseau de microlentilles placé à la surface de l’image, constituée d’images imbriquées représentant chacune un point de vue pris sous un angle différent. Ainsi, chaque oeil perçoit une image différente.

Holographie

L’holographie est une technique connue depuis les années 1950 et rendue possible dans les années soixante grâce à la mise au point des lasers.

Contrairement à la photographie classique qui n’enregistre sur la surface sensible que la luminosité, l’holographie permet d’enregistrer également la phase de la lumière ce qui permet d’enregistrer les informations nécessaires à la restitution du relief.

Pour que la restitution soit bonne, il faut que l’hologramme soit éclairé par une lumière cohérente.

Cette technique n’est pas encore applicable pour les systèmes grand public, mais reste la plus prometteuse.

Conclusion

On voit que même en cas d’une vision monoculaire, le cerveau dispose de nombreuses informations pour recréer le relief et la profondeur. Ces informations sont précieuses et nous permettent de réaliser un grand nombre de choses au quotidien.

Toutefois, la vision binoculaire nous offre une visualisation très fine du relief pour les objets à portée de bras, ce qui est primordial pour mener à bien des tâches nécessitant une appréciation fine de l’espace. Elle est particulièrement importante par exemple dans le domaine de la chirurgie. Dans un tel domaine, être capable de fournir au médecin une reproduction stéréoscopique devient un réel progrès.

Dans le domaine du divertissement au sens large, cette nouvelle technologie augure d’un avenir financier juteux car elle implique un renouvellement complet du matériel. Pour le consommateur et le spectateur en revanche, son intérêt reste à prouver. Au-delà de certaines images proprement ahurissantes, une partie non-négligeable des spectateurs souffre de nausée, de maux de tête, de fatigue oculaire ou n’est tout simplement pas prête à payer d’avantage pour une troisième dimension qui n’amène pas forcément quelque chose d’indispensable.

Encore trop souvent, la troisième dimension d’un film cache une mauvaise histoire.

Si tu n’arrives pas à le faire bien, fais le en 3D !