summaryrefslogtreecommitdiff
path: root/graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp')
-rw-r--r--graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp318
1 files changed, 318 insertions, 0 deletions
diff --git a/graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp b/graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp
new file mode 100644
index 0000000000..135a071df1
--- /dev/null
+++ b/graphics/metapost/contrib/macros/mpkiviat/metapost/mpkiviat.mp
@@ -0,0 +1,318 @@
+% mpkiviat.mp v0.1
+% @Author: Maxime Chupin
+% @Date: 22 may 2024
+% @License: LATEX Project Public License 1.3c.
+
+if not known mplib: input latexmp fi;
+pair _axis[];
+
+numeric _axis_number;
+numeric _kiviat_unit;
+
+numeric _lattice_unit,_lattice_max,_value_max,_unit_value;
+_lattice_unit := 1;
+_lattice_max :=10;
+_value_max := 10;
+_unit_value := 1;
+_kiviat_unit:=0.3cm;
+
+
+pair _kiviat_lines[][];
+path _kiviat_path[];
+color _kiviat_lines_color[];
+numeric _line_nbr;
+_line_nbr:=0;
+
+def set_lattice_grid(expr u,m)=
+ save _nbr;
+ _nbr := (m/u);
+ _value_max := m;
+ _unit_value := u;
+ _lattice_max := floor(_nbr);
+enddef;
+
+
+string _axis_names[];
+
+color _kiviat_lattice_color, _kiviat_axis_color;
+_kiviat_axis_color:= black;
+_kiviat_lattice_color:= 0.8*white;
+
+vardef set_axis_color(expr c)=
+ _kiviat_axis_color:= c;
+enddef;
+
+def set_kiviat_unit(expr u)=
+ _kiviat_unit:=u;
+enddef;
+
+vardef set_lattice_color(expr c)=
+ _kiviat_lattice_color:= c;
+enddef;
+
+vardef set_axis(text t)=
+ _line_nbr:=0;
+ save _st,_i;
+ _axis_number:=0;
+ for _st=t:
+ _axis_number:= _axis_number+1;
+ _axis_names[_axis_number]:=_st;
+ endfor
+ for i:=1 upto _axis_number:
+ _axis[i]:=(cosd(i/_axis_number*360)*_lattice_max*_kiviat_unit,sind(i/_axis_number*360)*_lattice_max*_kiviat_unit);
+ endfor
+enddef;
+
+
+
+
+
+boolean _legend;
+_legend:=true;
+
+% function to determine the point of the bb that intersect the line
+% determined by the angle of the corresponding axis
+vardef _pointbb (expr p, a)=
+ save _bb,_d,_point;
+ path _bb,_d;
+ pair _point;
+ _bb := bbox p;
+ _d := (0,0)--(3000*cosd(a),3000*sind(a));
+ _point := _bb intersectionpoint _d;
+ _point
+enddef;
+
+% set legends true/false
+vardef set_axis_legends(expr b)=
+ _legend:=b;
+enddef;
+
+def draw_axis =
+ save _plabel;
+ picture _plabel;
+ for i:=_lattice_unit step _lattice_unit until _lattice_max :
+ draw for j:=1 upto _axis_number: (i/_lattice_max)*_axis[j]--endfor cycle withcolor
+ _kiviat_lattice_color;
+ endfor
+ for i:=1 upto _axis_number:
+ drawarrow (0,0)--1.2*_axis[i] withcolor _kiviat_axis_color;
+ endfor
+ if(_legend):
+ for i:=1 upto _axis_number:
+ _plabel := image(label(textext(_axis_names[i]),origin)); % passage
+ % par image et label pour centrer la bbox
+ draw _plabel
+ shifted (1.2*_axis[i]+labeloffset*(cosd(angle _axis[i]),sind(angle
+ _axis[i]))+_pointbb(_plabel,angle _axis[i])) ;
+ endfor;
+ fi
+enddef;
+
+def draw_grad(expr p,s)(expr j)=
+ for i:=1 upto _lattice_max:
+ unfill bbox (textext(p&decimal(i*_unit_value)&s) shifted (i/_lattice_max*_axis[j]));
+ draw textext(p&decimal(i*_unit_value)&s) shifted (i/_lattice_max*_axis[j]);
+ endfor
+enddef;
+
+
+
+vardef _build_line(text t)=
+ save _values,_i;
+ _line_nbr:=_line_nbr+1;
+ _i:=0;
+ for _values=t:
+ _i:=_i+1;
+ _kiviat_lines[_line_nbr][_i]:=(_values/_value_max)*_axis[_i];
+ if(_i=1):
+ _kiviat_path[_line_nbr]:=_kiviat_lines[_line_nbr][_i];
+ else:
+ _kiviat_path[_line_nbr]:=_kiviat_path[_line_nbr]--_kiviat_lines[_line_nbr][_i];
+ fi
+ endfor
+ _kiviat_path[_line_nbr]:=_kiviat_path[_line_nbr]--cycle;
+enddef;
+
+
+boolean _line_mark_b;
+_line_mark_b:=true;
+numeric _line_mark_scale;
+_line_mark_scale:=1;
+
+def set_line_mark_scale(expr n)=
+ _line_mark_scale:=n;
+enddef;
+
+def set_line_mark(expr b)=
+ _line_mark_b:=b;
+enddef;
+
+def line_mark_square(expr p)=
+ ((((-1,-1)--(1,-1)--(1,1)--(-1,1)--cycle) scaled _line_mark_scale) shifted p)
+enddef;
+
+def line_mark_circle(expr p)=
+ ((fullcircle scaled 2.5 scaled _line_mark_scale) shifted p)
+enddef;
+
+string _mark_type;
+_mark_type := "square";
+string _save_type[];
+boolean _save_mark_b[];
+numeric _save_scale[];
+
+def set_line_mark_type(expr s)=
+ _mark_type:=s;
+enddef;
+
+def _mark_line(expr c)=
+ _save_type[_line_nbr]:=_mark_type;
+ _save_scale[_line_nbr]:=_line_mark_scale;
+ for i:=1 upto _axis_number:
+ fill
+ if(_mark_type="square"):
+ line_mark_square
+ elseif(_mark_type="circle"):
+ line_mark_circle
+ elseif(_mark_type="custom"):
+ line_mark_custom
+ fi
+ (_kiviat_lines[_line_nbr][i]) withcolor c;
+ endfor;
+enddef;
+
+vardef draw_line(text t)(expr c)=
+ _build_line(t);
+ _kiviat_lines_color[_line_nbr]:=c;
+ draw _kiviat_path[_line_nbr] withcolor c;
+ _save_mark_b[_line_nbr]:=_line_mark_b;
+ if(_line_mark_b):
+ _mark_line(c);
+ fi;
+enddef;
+
+
+vardef filldraw_line(text t)(expr c)=
+ _build_line(t);
+ _kiviat_lines_color[_line_nbr]:=c;
+ alphafill(_kiviat_path[_line_nbr],c,0.1);
+ draw _kiviat_path[_line_nbr] withcolor c;
+ _save_mark_b[_line_nbr]:=_line_mark_b;
+ if(_line_mark_b):
+ _mark_line(c);
+ fi;
+enddef;
+
+vardef _anchor@# (expr p)=
+ if(str @# = "top"):
+ (1/2*(urcorner p)+1/2*(ulcorner p))
+ elseif(str @# = "bot"):
+ (1/2*(lrcorner p)+1/2*(llcorner p))
+ elseif(str @# = "lft"):
+ (1/2*(llcorner p)+1/2*(ulcorner p))
+ elseif(str @# = "rt" ):
+ (1/2*(lrcorner p)+1/2*(urcorner p))
+ elseif(str @# = "urt"):
+ (urcorner p)
+ elseif(str @# = "ulft"):
+ (ulcorner p)
+ elseif(str @# = "lrt"):
+ (lrcorner p)
+ elseif(str @# = "llft"):
+ (llcorner p)
+ elseif(str @# = "c"):
+ (1/4*(lrcorner p)+1/4*(urcorner p)+1/4*(llcorner p)+1/4*(ulcorner p))
+ else:
+ (1/4*(lrcorner p)+1/4*(urcorner p)+1/4*(llcorner p)+1/4*(ulcorner p))
+ fi
+
+enddef;
+
+vardef draw_legends@# (text l) =
+ save _mypic,i,_s_scale;
+ _s_scale := _line_mark_scale;
+ picture _mypic;
+ _mypic = image(
+ i:=0;
+ for s=l:
+ i:=i+1;
+ draw ((0,0)--(0.7*_kiviat_unit,0)) shifted (0,i*(_kiviat_unit)) withcolor
+ _kiviat_lines_color[i];
+ if(_save_mark_b[i]):
+ _line_mark_scale:=_save_scale[i];
+ fill
+ if(_save_type[i]="square"):
+ line_mark_square
+ elseif(_save_type[i]="circle"):
+ line_mark_circle
+ elseif(_save_type[i]="custom"):
+ line_mark_custom
+ fi
+ (0.5[(0,0),(0.7*_kiviat_unit,0)] )shifted (0,i*(_kiviat_unit))
+ withcolor _kiviat_lines_color[i];
+ fi
+ label.rt(textext(s),(0.7*_kiviat_unit,0) shifted (0,i*(_kiviat_unit)));
+ endfor
+ draw bbox currentpicture;
+ _line_mark_scale := _s_scale ;
+ );
+ draw _mypic
+ if(str @# = "top"):
+ shifted (_anchor.top(currentpicture)-_anchor.bot(_mypic))
+ elseif(str @# = "bot"):
+ shifted (_anchor.bot(currentpicture)-_anchor.top(_mypic))
+ elseif(str @# = "lft"):
+ shifted (_anchor.lft(currentpicture)-_anchor.rt(_mypic))
+ elseif(str @# = "rt" ):
+ shifted (_anchor.rt(currentpicture)-_anchor.lft(_mypic))
+ elseif(str @# = "urt"):
+ shifted (_anchor.urt(currentpicture)-_anchor.ulft(_mypic))
+ elseif(str @# = "ulft"):
+ shifted (_anchor.ulft(currentpicture)-_anchor.urt(_mypic))
+ elseif(str @# = "lrt"):
+ shifted (_anchor.lrt(currentpicture)-_anchor.llft(_mypic))
+ elseif(str @# = "llft"):
+ shifted (_anchor.llft(currentpicture)-_anchor.lrt(_mypic))
+ else:
+ shifted (_anchor.rt(currentpicture)-_anchor.lft(_mypic))
+ fi
+ ;
+enddef;
+% transparency Phan : http://www-math.univ-poitiers.fr/~phan/metalpha.html
+% revisité par Jean-Michel Sarlat
+color _tc;
+numeric _ta;
+picture _ap;
+
+def _AlphaFill expr c =
+ _ap := nullpicture;
+ _AlphaPicture(currentpicture,c);
+ addto currentpicture also _ap;
+enddef;
+
+vardef _AlphaPicture(expr p,c) =
+ save p_; picture p_;
+ p_ := nullpicture;
+ addto p_ contour c withcolor _ta[background,_tc];
+ for p__ within p:
+ if (not clipped p__) and (not bounded p__):
+ addto p_ also p__ withcolor
+ _ta[(redpart p__,greenpart p__,bluepart p__), _tc];
+ else:
+ begingroup save _ap;
+ picture _ap; _ap = nullpicture;
+ _AlphaPicture(p__,pathpart p__);
+ addto p_ also _ap;
+ endgroup;
+ fi
+ endfor;
+ clip p_ to c;
+ addto _ap also p_;
+enddef;
+
+vardef alphafill(expr p,c,a) =
+ _tc := c; _ta := a;
+ _AlphaFill p
+enddef;
+
+endinput; \ No newline at end of file