La question traitée ici concerne le mapping de données dans un espace cyclique. Le traitement d'angle est le premier qui me vient en tête.

remapping angles

related repository: RemappingRadians - processing

base

  1. |--------*-----------------*-----------*--------------*--------|
  2. 0 a b c d 2PI

l´idée est d´écarter 2 valeurs consécutives, b et c par ex, et de rediffuser les 2 autres, a et d, de manière proportionnelle

pour ce faire > calcul du point médian x

  1. |--------*-----------------*-----!-----*--------------*--------|
  2. 0 a b x c d 2PI

distance bx = (c-b) x = b + bx/2

le remap spécifie les nouvelles valeurs de b et de c

  1. |--------*--------<--------*-----!-----*-------->------*--------|
  2. 0 a b´ b x c c´ d 2PI

distance b´x = (c´-b´) x = b + bx/2

on a donc perdu (b´x - bx) radians

  1. |----*---------|----*---------|----*---------|
  2. -2PI a´ 0 a 2PI a´´ 4PI

ce qu´il ne faut pas oublier: l´espace est cyclique > a´ ~ a ~ a´´

on peut descendre en négatif et passer 2PI sans que ça pose de réel problème

  1. |---!--------*-----------*-----*----------*-----|---!--------*
  2. 0 x´ a b c d 2PI x a´
  3. 3 11 22 27 37 42 45 53

l´angle entre d et a est à plusieurs positions simultanément pour son calcul: ( d + a ) / 2 - ( 37 + 11 ) -> 48!!!!, divisé par 2, on arrive à 24, donc pas du tout où il faut! il faut ajouter 42 à a => 53, et là: (37+57)/2, 90/2 => 45 paf! si a < d,

  1. a += 2PI

center = (d+a)/2

remap method()

dans le remap, je demande un recalcul de b dans les bornes d > a vers d-5, a + 5

  1. a, in, out, in_to, out_to
  2. b, 11, 37, 16, 32
  1. |-----------*--->--*---*---*----------*---<--*-----|
  2. 0 | | | | | | 2PI
  3. a | c b | d
  4. 11 | 19 22 | 37
  5. 0 | | |
  6. | \ | |
  7. a´ c´ b´ d´
  8. 16 20.9 22.8 32

? b´

distance_b distance_init distance_new percent_b out_b si b < d:

  1. distance_b = b - a => 11
  2. distance_init = d - a => 26
  3. distance_new = d´ - a´ => 16
  4. percent_b = distance_b / distance_init = > 0.423076923
  5. out_b = a´ + percent_b * distance_new (6.769230769) => 22.769230769

return out_b

pour c´ si c < d:

  1. distance_c = b - a => 8
  2. distance_init = d - a => 26
  3. distance_new = d´ - a´ => 16
  4. percent_b = distance_c / distance_init = > 0.307692308
  5. out_b = a´ + percent_b * distance_new (4.923076923) => 20.923076923

return out_b

le process semble ok pour les angles compris entre a et d

javascript (p5.js)

online identity ∋ [ social ∋ [mastodon♥, twitter®, facebook®, diaspora, linkedin®] ∥ repos ∋ [github®, gitlab♥, bitbucket®, sourceforge] ∥ media ∋ [itch.io®, vimeo®, peertube♥, twitch.tv®, tumblr®] ∥ communities ∋ [godotengine♥, openprocessing, stackoverflow, threejs]]