Problème de coloriage de frites

N'oubliez pas de consulter les sujets avant de poser votre question, merci.

Problème de coloriage de frites

Messagepar Archibald » 29 Juil 2022 14:39

J'essaie de faire un dessin illustrant la formule des probabilités totales par un diagramme en patates. Pour ça, je voudrais découper la patate du gros ensemble en tranches (des frites quoi) coloriées de façon différente.

J'ai écrit un code qui marche très bien avec une seule frite (dans la boucle for, mettre la même valeur au from et au to), mais dès qu'il y en a 2, ça fait n'importe quoi :

Code: Tout sélectionner
view(-5.2, 4, -2.2, 4.2), size(6, 1),
A := set("{}", -1 + i, [scale := 0.9, rotation :=90]),
LabelDot(-5 + 4*i, "$\Omega$", "SE", 0),

for k from 3 to 4 do // "3 to 3" et "4 to 4" sont corrects
    L := [
      Get(Arc(k + 5 + i, k + 5, k + 5 - i, 10)),
      Get(Arc(k + 4 - i, k + 4, k + 4 + i, 10, 0))
    ],
    FillStyle := full, FillOpacity := .1,
    if mod(k, 2) = 0 then FillColor := red, else FillColor := blue, fi,
    Line(Clip2D(L, A, 1), 1),

    LabelDot(k - 6.25 + 1*i, ["$A_", k, "$"], "E", 0),
od,


Je fais donc un truc mal, mais quoi exactement ?
Archibald
 
Messages: 38
Inscription: 21 Fév 2010 09:18

Re: Problème de coloriage de frites

Messagepar P.Fradin » 29 Juil 2022 15:48

Bonjour Archibald,

Tu ne fais rien de mal, j'ai l'impression que la fonction Get ne restaure pas le contexte graphique comme il faut (bug ?)
Une parade :
Code: Tout sélectionner
[//command
 view(-5.2, 4, -2.2, 4.2), size(6, 1),
A := set("{}", -1 + i, [scale := 0.9, rotation :=90]),
LabelDot(-5 + 4*i, "$\Omega$", "SE", 0),
for k from 3 to 4 do // "3 to 3" et "4 to 4" sont corrects
    SaveAttr(), //sauvegarde du contexte
    L := [
      Get(Arc(k + 4 - i, k + 4, k + 4 + i, 10,-1),0),
      Get(Arc(k + 5 + i, k + 5, k + 5 - i, 10,1),0)
    ],
    FillStyle := full, FillOpacity := .1,
    if mod(k, 2) = 0 then FillColor := red, else FillColor := blue, fi,
    S := Clip2D(L, A, 1),
    Line(S,1),
    RestoreAttr(),//restitution du contexte
    LabelDot(k - 6.25 + 1*i, ["$A_", k, "$"], "E", 0),
od,
]

frites.png
frites.png (7.94 Kio) Consulté 25427 fois
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1903
Inscription: 29 Oct 2008 15:04

Re: Problème de coloriage de frites

Messagepar P.Fradin » 30 Juil 2022 09:47

Après une recherche plus poussée, ce n'est pas un bug. Cela vient de la variable FillStyle, au premier passage elle a la valeur none donc la fonction Get renvoie la liste des points correspondant exactement aux arcs, mais au deuxième passage dans la boucle, la variable FillStyle a la valeur full et donc la fonction Get renvoie la liste des points correspondant aux arcs refermés à cause du remplissage.
Il suffit donc de faire :
Code: Tout sélectionner
[//command
     view(-5.2, 4, -2.2, 4.2), size(6, 1),
    A := set("{}", -1 + i, [scale := 0.9, rotation :=90]),
    LabelDot(-5 + 4*i, "$\Omega$", "SE", 0),
    for k from 3 to 4 do // "3 to 3" et "4 to 4" sont corrects
        FillStyle:=none,
        L := [
          Get(Arc(k + 4 - i, k + 4, k + 4 + i, 10,-1),0),
          Get(Arc(k + 5 + i, k + 5, k + 5 - i, 10,1),0)
        ],
        FillStyle := full, FillOpacity := .1,
        if mod(k, 2) = 0 then FillColor := red, else FillColor := blue, fi,
        S := Clip2D(L, A, 1),
        Line(S,1),
        LabelDot(k - 6.25 + 1*i, ["$A_", k, "$"], "E", 0),
    od,
    ]
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1903
Inscription: 29 Oct 2008 15:04

Re: Problème de coloriage de frites

Messagepar Archibald » 30 Juil 2022 10:20

C'est fin, je mets ça de côté dans ma tête. Merci :)
Archibald
 
Messages: 38
Inscription: 21 Fév 2010 09:18


Revenir vers Questions - Réponses

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité

cron