Interpolations linéaire et cosinus appliquées à une face du cube

a marqué ce sujet comme résolu.

Hello !

C’est encore moi et mon cube !

J’ai presque fini ce que je veux faire (implémenter un bruit de Perlin sur un objet 3D). Pour le moment, j’ai réussi à faire mon projecteur (à cause de deux grosses erreurs d’étourderie, j’ai accumulé beaucoup de retard), ma fonction qui interpole entre N points fonctionne normalement bien, ma fonction qui teste toutes les combinaisons possibles entre K points aussi, j’ai par ailleurs implémenté des interpolations linéaire et cosinus.

Résultats

Uniquement les sommets du cube + la face du bas

Interpolation linéaire
Image utilisateur
Interpolation cosinus
Image utilisateur

Uniquement les arêtes + sommets du cube

Linéaire
Image utilisateur
Cosinus
Image utilisateur

Remarques

Alors j’ai bien compris qu’il existe différent types d’interpolations (linéaire, cosinus, quadratique, cubique, etc.), j’ai bien compris le principe également (une interpolation entre deux points, c’est construire au moins un point dont les coordonnées sont égales à un peu du premier point et un peu de l’autre, aux maxima on a tout de l’un et rien de l’autre, etc.).

Mes interpolations se font normalement bien entre 2, 3, 4, … etc. points, je ne pense pas m’être trompé dans la généralisation.

Ma question

Mon interpolation cosinus me semble un peu cheloue. J’avoue que je m’attendais plutôt à avoir à peu près le même résultat que pour mon interpolation linéaire, mais plus arrondie sur les bords. C’est ma perception, j’avoue que je n’ai pas géométriquement/mathématiquement réfléchi à ça.

Je suis ainsi très supris de voir mes points s’envoler en haut. On dirait qu’ils fuient la surface de ma face.

Est-ce normal ?

+0 -0

Bein chaque point appartient à la face du bas et donc l’ensemble auquel ils appartiennent est la face.

Pour l’interpolation linéaire ça se voit mais je suis d’accord que ça devient étrange pour la cosinus. Du coup je crois que je me suis trompé…?

Du coup je crois que je me suis trompé…?

Si tu voulais que ces points appartiennent à la face, alors oui clairement tu t’es gouré.

En même temps, un carré peut être écrit comme un ensemble de combinaisons linéaires entre les sommets, mais pas comme un ensemble de combinaisons sinusoïdales… Si les points sont issues d’une interpolation entre les sommets (ce que ton poste ne précise pas, d’où mes interrogations…), le résultat que tu obtiens avec l’interpolation sinusoidale parait plutôt bon. Ça n’a aucune raison de donner un plan, ça va forcément donner une sinusoïde. C’est un peu bizarre que ta cloche penche sur un côté par contre, mais c’est peut être juste une impression à cause de la représentation.

+0 -0

C’est très bizarre.

Le dessin ’interpolation linéaire’ n’est pas clair du tout. On sait que tu veux représenter un carré en perspective, ok. Ca donne un losange, ok. Mais les points dans le losange, ils sont aléatoires, ils représentent des lignes ? Pas simple du tout de deviner ce que tu veux mettre dans ce losange. Si au lieu de dessiner une grille de 10x10, tu dessinais une grille de 5x5, peut-être que ce serait plus clair ?

Et du coup, même pour l’autre dessin, ce serait peut-être plus clair avec moins de lignes dans chacune des 2 dimensions.

Peut-être même (en fait j’en suis sûr), ça aiderait beaucoup que tu dessines uniquement les 12 arêtes de ton cube. Pas indispensable pour le premier dessin, mais certainement très utile pour le 2ème dessin.

Pour le coup, c’est très étrange, ton interpolation cosinus me paraît bien erroné.

Si tu interpoles entres deux points, tu ne peux pas les dépasser (avec cette interpolation). Tu es censé avoir une phase d’accélération jusqu’à ce qu’alpha vaille 0.5 puis une décélération. Mais en aucun cas il ne doit aller en deçà ou au delà de 0 et 1. Assures-toi que ça respecte bien cela dans un premier temps.

C’est très bizarre.

Le dessin ’interpolation linéaire’ n’est pas clair du tout. On sait que tu veux représenter un carré en perspective, ok. Ca donne un losange, ok. Mais les points dans le losange, ils sont aléatoires, ils représentent des lignes ? Pas simple du tout de deviner ce que tu veux mettre dans ce losange. Si au lieu de dessiner une grille de 10x10, tu dessinais une grille de 5x5, peut-être que ce serait plus clair ?

Et du coup, même pour l’autre dessin, ce serait peut-être plus clair avec moins de lignes dans chacune des 2 dimensions.

Peut-être même (en fait j’en suis sûr), ça aiderait beaucoup que tu dessines uniquement les 12 arêtes de ton cube. Pas indispensable pour le premier dessin, mais certainement très utile pour le 2ème dessin.

elegance

Je dessine juste les faces, et pour ce faire j’interpole entre ses 4 sommets. Je vais faire ça pour les arêtes :)

Pour le coup, c’est très étrange, ton interpolation cosinus me paraît bien erroné.

Si tu interpoles entres deux points, tu ne peux pas les dépasser (avec cette interpolation). Tu es censé avoir une phase d’accélération jusqu’à ce qu’alpha vaille 0.5 puis une décélération. Mais en aucun cas il ne doit aller en deçà ou au delà de 0 et 1. Assures-toi que ça respecte bien cela dans un premier temps.

JuDePom

Je confirme que mes poids d’interpolation, tous sommés, valent bien 1 et que chacun d’eux est >= 0 et <= 1.

+0 -0

Ton interpolation cosinus est bonne pour les arrêtes. Donc je ne vois pas pourquoi ça n’a pas l’air de correspondre pour la surface.

Peux-tu envoyer l’interpolation des deux diagonales de la face du bas ?

JuDePom

Tu veux dire des 4 sommets de la face du bas non ? Tu veux le code ? (je dois m’absenter jusqu’à ce soir, à tout à l’heure ! Je répondrai aussitôt que possible:))

Banni

Est-ce que dans ce que tu fais, une interpolation linéaire est un cas particulier d’interpolation sinusoïdale avec coefficient de « hauteur » nul ?

edit Enfin bon je ne comprends pas comment tu as fait une interpolation sinusoïdale à partir de deux points. Il y a une infinité d’interpolations possibles qui passent exactement pas les deux points.

+0 -0

On est d’accord que du coup, tu ne fais pas des simples interpolations linéaires / cosinus pour tes faces (ce qui serait étrange), mais des interpolations bilinéaires et "bicosinus"(jamais vu ça ^^).

La première question qui me vient, c’est pourquoi la bicosinus ?


Concernant ton problème, il s’agit sûrement d’une petite erreur, tes 4 points sont sur un même plan, il ne peut donc y avoir des variations que dans deux dimensions (à un changement de repère près). Si cela marche pour la bilinéaire, il ne devrait pas y avoir de grosses différences pour la bicosinus, vu que seule la fonction qui calcule la valeur devrait différer.


@blo yhg en fait, il peut faire une interpolation cosinus, c’est juste le nom (car ça inclus un cosinus). C’est comme l’interpolation bilinéaire, qui n’a de linéaire que le nom. La fonction d’interpolation cosinus est:

$x = x1 * (1 - \frac{1-cos(\alpha*\pi)}{2}) + x2*\frac{1-cos(\alpha*\pi)}{2}$

avec $0 \leq \alpha \leq 1$

+0 -0
Banni

C’est comme l’interpolation bilinéaire, qui n’a de linéaire que le nom.

D’après ce que je vois, l’interpolation bilinéaire se fait par une fonction bilinéaire, donc ça n’a pas de bilinéaire que le nom.

La fonction d’interpolation cosinus est:

$x = x1 * (1 - \frac{1-cos(\alpha*\pi)}{2}) + x2*\frac{1-cos(\alpha*\pi)}{2}$

avec $0 \leq \alpha \leq 1$

Ok merci. Je m’imaginais que l’interpolation était invariante par changement de coordonnées isométriquement.

Hello tout le monde, je suis de retour. :)

Je vois que vous vous interrogez sur ma façon de dessiner les points entre 2 points, puis les points entre 4 points. Le premier cas, c’est l’interpolation entre les deux points d’une arête du cube. Le second, c’est l’interpolation entre les quatre sommets d’une face.

Chacune de ces interpolations est soit linéaire, soit cosinus (c’est moi qui décide, en fonction de… de ce que je veux tester, voir, comprendre, bref).

Interpolations linéaires et cosinus de deux points d’une arête du cube

Interpolation linéaire

La fonction d’interpolation linéaire des deux points est : $wA + (1-w)B$.

Je réalise récursivement des incrémentations sur $w$ avec un pas que je choisi de façon à avoir un nombre de points qui me satisfait. Par exemple, avec un pas $0.5$, mon programme trouvera les points suivants :

$0A + 0B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 0

$0A + 0.5B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 0.5

$0A + 1B$

$0.5A + 0B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 0.5

$0.5A + 0.5B$

$0.5A + 1B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 1.5

$1A + 0B$

$1A + 0.5B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 1.5

$1A + 1B$, qui cependant n’est pas dessiné car la somme des poids, devant valoir 1, vaut 2

Avec un pas $<0.5$, je trouverais davantage de points non-dessinés et davantage de points dessinés.

Cette façon de calculer tous les points par interpolation est la même que l’interpolation soit linéaire ou cosinus.

Interpolation cosinus

La fonction est : $w'A + (1-w')B$, avec $w'=(1 - cos(w * \pi)) * 0.5$. Comment ai-je trouvé cette égalité ? L’idée est que j’utilise $cos$ définie sur $[0;\pi]$, qui donne des images comprises dans $[-1;1]$. Je dois transformer $w$ de façon à ce qu’il soit compris entre $[0;\pi]$, c’est-à-dire le multiplier par $\pi$, puis transformer $cos(w*\pi)$ de façon à avoir un $w'$ compris entre $[0;1]$, c’est-à-dire d’abord ajouter $1$ (obtenant ainsi l’intervalle $[0; 2]$) puis diviser par $0.5$, obtenant : $[0;1]$.

Interpolations linéaires et cosinus des 4 points d’une face du cube

Cette fois-ci, il y a 4 points : $A, B, C, D$. Mais l’idée demeure identique : l’interpolation est définie par 4 poids multipliés chacun par son point correspondant, au lieu d’être définie par 2 poids multipliés chacun par son point correspondant. Soit :

$aA + bB + cC + dD$ (vous noterez que j’aurais pu utiliser cette notation dans la partie "Interpolations linéaires et cosinus de deux points d’une arête du cube" au lieu d’écrire par exemple $(1-w)$).

Donc toujours pareil, je fais récursivement des itérations sur les points $a,b,c,d$, je teste toutes les combinaisons possibles comme je vous l’ai montrée plus haut. Je ne dessine que les points qui ont une somme des poids $= 1$.

Les poids sont définis par les fonctions d’interpolation linéaire OU BIEN, selon mon gré, d’interpolation cosinus. J’ai donné les définitions de ces fonctions en haut.

Voilà voilà… j’espère que ce que j’ai fait est plus clair et que ça peut vous aider à m’aider :p

@blo yhg, une fonction bilinéaire n’a de linéaire que le nom, car c’est une fonction quadratique (donc non linéaire).

Je suis un peu fatigué pour être sûr de ne pas dire de bêtises je ne dirais pas grand chose et je terminerais demain. Mais à l’heure où j’écris, il ne me semble pas possible d’interpoler comme tu le fais (cosinus entre 4 points, ça me dit moyen). Je regarde ça demain matin ! Avec une feuille et pas juste un smartphone.

Déjà, un point de méthode pour le cas le plus simple : interpolation linéaire à partir de 2 points.

Tu cherches les couples (a,b), tels que a+b=1 et avec un pas de 0.5 par exemple. Tu peux faire un truc du genre :

1
2
3
4
5
6
a=0
while a <= 1
  b = 1-a
  // Calcul du point à partir de a et b
  a += 0.5
end

Si tu as un pas de 0.1, c’est tout simplement 10 fois plus rapide que ta méthode.

Ensuite, le cas avec 4 points. Ca va être un peu pareil

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
a=0
while a <= 1
  b=0 
  while a+b <= 1 
    c=0
    while a+b+c <= 1 
       d = 1-a-b-c
       // Calcul du point à partir de a,b,c et d 
       c+= 0.5
    end
    b+= 0.5
  end
  a+= 0.5
end

Là, avec un pas de 0.1, ça va être à peu près 80 fois plus rapide, si je compte bien.

Ceci dit, je ne suis pas convaincu par cette méthode. Par exemple, pour un carré ABCD dans cet ordre (AC et BD sont les diagonales), les 2 jeux de coefficients (0.5, 0, 0.5, 0) et (0, 0.5, 0, 0.5) vont conduire au même point, et ça, ce n’est pas très propre. Je ne prend que cet exemple, mais tu vas avoir plein de points en doublon de ce type.

Donc même coté interpolation ’linéaire’, il y a des trucs pas nets dans ce que tu fais. Il faudrait déjà clarifier cela avant d’attaquer un autre type d’interpolation.

Banni

@blo yhg, une fonction bilinéaire n’a de linéaire que le nom, car c’est une fonction quadratique (donc non linéaire).

Ah mais ce n’est pas « linéaire » le nom, c’est bilinéaire, donc c’est bon ça correspond bien : on interpole par une fonction bilinéaire (linéaire en ses deux variables, ou plutôt affine mais voilà).

Un truc m’échappe toujours dans ce que tu essayes de faire.

Ce n’est pas de l’interpolation au sens "approximer la valeur d’une variable à partir d’un nombre finie d’échantillon dans l’espace independent". Tu connais déjà parfaitement la forme de ce que tu veux (une arête, une face ou un cube) et tu construits plutôt un repère sur cette forme.

Dans tous les cas, tu peux décrire une droite de façon simple comme une combinaison linéaire de ses extrémités ou une face comme une combinaison bilinéaire de ses sommets ou encore un volume comme une combinaison trilinéaire de ses sommets. Typiquement, une arrête sera décrite comme $ax_1+bx_2$. Ensuite, si j’ai bien compris ce que tu essayes de faire, c’est de paramétriser $a$ et $b$ avec une fonction cosinus d’une variable indépendante quelconque. Tu peux toujours l’écrire, mais là où je coince c’est de comprendre pourquoi tu veux le faire. Fondamentalement, tu vas toujours d’écrire une arrête, pourquoi s’embêter avec un cosinus alors qu’il n’y en a pas besoin ?

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte