summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profcollege/latex/PfCDiagrammeRadar.tex
blob: cbed30414d5b85bc29b3c16181cb9ba4cf1d1970 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
%%%
% Radar
%%%
\setKVdefault[ClesRadar]{Rayon=3cm,Reference=20,MoyenneClasse=false,Disciplines=false,Pas=5}

\newtoks\toklisteradara%pour la moyenne de l'\'el\`eve
\newtoks\toklisteradarb%pour la discipline
\newtoks\toklisteradarc%pour la moyenne de classe

\def\UpdateRadara#1/#2/#3\nil{\addtotok\toklisteradara{#1,}}
\def\UpdateRadarb#1/#2/#3\nil{\addtotok\toklisteradarb{"#2",}}
\def\UpdateRadarc#1/#2/#3\nil{\addtotok\toklisteradarc{#3,}}

\newcommand\MPRadar[6]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair O;
    O=(0,0);
    path cc;
    cc=cercles(O,#1);
    %%etiquettage des disciplines
    n:=0;%compter le nombre de disciplines
    for p_=#2:
    n:=n+1;
    endfor;
    for k=1 upto n:
    N[k]=k*(360/n);
    trace segment(O,pointarc(cc,N[k]));% dashed evenly;
    endfor;
    p:=0;
    for p_=#2:
    p:=p+1;
    if (N[p]<90) or (N[p]=90):
    label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if ((N[p]>90) and (N[p]<180)) or (N[p]=180):
    label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>180) and (N[p]<270):
    label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>270) or (N[p]=270):
    label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    endfor;
    % trac\'e des pas:
    pas=#4/#3;
    for k=1 upto pas-1:
    trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor
    --cycle dashed evenly withcolor 0.5white;
    endfor;
    trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor
    --cycle;
    % etiquettage des pas
    dotlabel.urt(TEX("\tiny"&decimal(#4)),pointarc(cc,0));
    dotlabel.urt(TEX("\tiny"&decimal(#3)),(1/pas)[O,pointarc(cc,0)]);
    % trac\'e des r\'esultats \'el\`eves
    pair El[];
    el=0;
    for p_=#5:
    el:=el+1;
    El[el]=(p_/#4)[O,pointarc(cc,N[el])];
    endfor;
    trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen
    pencircle scaled 1.5 withcolor blue;
    % trac\'e des r\'esultats classe
    pair Cl[];
    cl=0;
    for p_=#6:
    cl:=cl+1;
    Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])];
    endfor;
    trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge;
  \end{mplibcode}
  \else
  \begin{mpost}
    pair O;
    O=(0,0);
    path cc;
    cc=cercles(O,#1);
    %%etiquettage des disciplines
    n:=0;%compter le nombre de disciplines
    for p_=#2:
    n:=n+1;
    endfor;
    for k=1 upto n:
    N[k]=k*(360/n);
    trace segment(O,pointarc(cc,N[k]));% dashed evenly;
    endfor;
    p:=0;
    for p_=#2:
    p:=p+1;
    if (N[p]<90) or (N[p]=90):
    label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if ((N[p]>90) and (N[p]<180)) or (N[p]=180):
    label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>180) and (N[p]<270):
    label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>270) or (N[p]=270):
    label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    endfor;
    % trac\'e des pas:
    pas=#4/#3;
    for k=1 upto pas-1:
    trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor
    --cycle dashed evenly withcolor 0.5white;
    endfor;
    trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor
    --cycle;
    % etiquettage des pas
    dotlabel.top(LATEX("\noexpand\tiny"&decimal(#4)&"") rotated -90,pointarc(cc,0));
    dotlabel.urt(LATEX("\noexpand\tiny"&decimal(#3)&""),(1/pas)[O,pointarc(cc,0)]);
    % trac\'e des r\'esultats \'el\`eves
    pair El[];
    el=0;
    for p_=#5:
    el:=el+1;
    El[el]=(p_/#4)[O,pointarc(cc,N[el])];
    endfor;
    trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen
    pencircle scaled 1.5 withcolor blue;
    % trac\'e des r\'esultats classe
    pair Cl[];
    cl=0;
    for p_=#6:
    cl:=cl+1;
    Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])];
    endfor;
    trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge;
  \end{mpost}
  \fi
}

\newcommand\Radar[2][]{%
  % 1 les param\`etres
  % 2 la r\'epartition des notes
  \useKVdefault[ClesRadar]%
  \setKV[ClesRadar]{#1}%
  \ignoreemptyitems%
  \setsepchar[*]{,}%
  \readlist*\ListeRadar{#2}%
  \toklisteradara{}%
  \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadara\compteur\nil}%
  \ifboolKV[ClesRadar]{Disciplines}{}{%
    \toklisteradarb{}%
    \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarb\compteur\nil}%
  }%
  \ifboolKV[ClesRadar]{MoyenneClasse}{}{%
    \toklisteradarc{}%
    \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarc\compteur\nil}%
  }%
  \MPRadar{\useKV[ClesRadar]{Rayon}}{\the\toklisteradarb}{\useKV[ClesRadar]{Pas}}{\useKV[ClesRadar]{Reference}}{\the\toklisteradara}{\the\toklisteradarc}%
}%