mardi 27 mai 2014

Cardioïde comme enveloppe des cercles + damier

Construire une cardioïde comme enveloppe des cercles est une chose facile à réaliser avec PSTriks. Par exemple, on se donne R le rayon du cercle des centres de la famille des cercles ainsi que le nombre de cercles. Les explications pour ce tracé et les suivants sont dans le document. Ceci est un bref résumé illustré avec les images du document situé dans ce répertoire :



Construire un damier sur cette figure est un peu plus compliqué. La commande \psDamierCardioid[options] est dédiée à ce tracé et comprend différentes options.



On peut dessiner uniquement les intersections des cercles en utilisant la commande \psCardioid, du document : fichiers (pst-intersection-v2.pdf et pst-intersection-v2.tex)  :


C'est un complément au document déjà publié dans ce blog :

http://pstricks.blogspot.fr/2011/11/coloriser-lintersection-de-deux.html



2 autres images de damiers :



mardi 13 mai 2014

Animation de la roue de Maxwell

La première animation a été réalisée avec le package animate d'Alexander Grahn. Pour obtenir une animation à peu près fluide il faut un grand nombre d'images, dans cet exemple 250 ! Le fichier pdf obtenu est assez lourd : 17 Mo.
 Fichier source roueMaxwell-animate.tex ) et (roueMaxwell-animate.pdf ) sont dans le répertoire :


La deuxième est un Gif animé obtenu avec 500 images calculées avec PSTricks. On ne peut éviter l'effet stroboscopique : le choix d'une roue avec de rayons n'était pas une bonne idée, même si les points de couleurs sur le pourtour de la roue peuvent limiter, dans le cas d'une vitesse faible, cet effet stroboscopique qui donne l'impression que la roue tourne à l'envers. C'est donc un Gif au ralenti que j'ai choisi d'afficher. Il faut attendre le temps nécessaire au chargement des 500 images pour visualiser l'animation correctement.

samedi 10 mai 2014

Étude théorique de la roue de Maxwell réalisée avec PSTricks, première partie.

Cette étude a été entièrement réalisée avec PSTricks, elle n'est certainement pas sans défauts ni erreurs. Elle constitue l'étude préparatoire à une animation.

Les fichiers sont dans le répertoire :


mercredi 7 mai 2014

Calculer et placer les zéros d'une fonction sur sa courbe représentative par Thomas Söll.

Une macro" \psZero" permettant de calculer et de placer les zéros d'une fonction sur sa courbe représentative. Elle utilise quelques options de pst-tools.

 
Fichiers (Nullstellen-Berechnung.pdf Nullstellen-Berechnung.tex) dans l'archive :

 Cette macro de Thomas complète cette ébauche que j'avais écrite ici :


mardi 6 mai 2014

Intersection de courbes avec pst-eucl

Je me permets de donner la réponse de Thomas Söll à une question posée par Scott Randy(qui a par ailleurs donné lui-même une solution à sa question) dans le forum dédié à PSTricks :

http://www.tug.org/pipermail/pstricks/2014/010333.html

Cette solution utilise une possibilité  avec la commande "\pstInterFF" de pst-eucl, le package de Dominique RODRIGUEZ dédié aux constructions géométriques dans le plan, qui est de pouvoir chercher les intersections de deux courbes quelconques --pourvu, bien sûr, qu'elles soient définies par une équation. L'algorithme de Newton est utilisé pour la recherche et celle-ci peut être limitée autour d'un extremum local proche du zéro cherché.




Voici le code envoyé par Thomas Söll :

http://www.tug.org/pipermail/pstricks/2014/010334.html

Que je recopie ci-dessous :

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot,pst-eucl}

\begin{document}

\begin{pspicture}[showgrid=false,saveNodeCoors](-1,-1)(10,6)
\psset{xunit=2 ,yunit=0.6}
\psset{algebraic,plotstyle=curve}
%
\def\xE{4}
%
\definecolor{SuperLightBlue}{cmyk}{0.2,0,0,0}
\pstInterFF[dotscale=0.6]{0.25*x^2+1}{0.5*(x-4)^2}{3}{S}
%
\pscustom[fillstyle=solid,fillcolor=SuperLightBlue,linestyle=none]{%
      \psplot{0}{N-S.x}{0.25*x^2+1}
      \psline(*{N-S.x} {0.25*x^2+1})(0,0|*{N-S.x} {0.25*x^2+1})
      \closepath
}
\pscustom[fillstyle=solid,fillcolor=green!10,linestyle=none]{%
      \psplot{0}{N-S.x}{0.5*(x-4)^2}
      \psline(*{N-S.x} {0.5*(x-4)^2})(0,0|*{N-S.x} {0.5*(x-4)^2})
      \closepath
}
\pscustom[fillstyle=solid,fillcolor=yellow!40,linestyle=none]{%
      \psplot{N-S.x}{4}{0.25*x^2+1}
      \lineto(*{\xE} {0.5*(x-4)^2})
      \psplot{\xE}{N-S.x}{0.5*(x-4)^2}
      \closepath
}
\pscustom[fillstyle=solid,fillcolor=orange!40,linestyle=none]{%
      \psplot{0}{N-S.x}{0.25*x^2+1}
      \psplot{N-S.x}{\xE}{0.5*(x-4)^2}
      \lineto(\xE,0)
      \lineto(0,0)
      \closepath
}
\pscustom[fillstyle=solid,fillcolor=magenta!10,linestyle=none]{%
      \psplot{0}{N-S.x}{0.5*(x-4)^2}
      \psplot{N-S.x}{\xE}{0.25*x^2+1}
      \lineto(\xE,0|*{0} {0.5*(x-4)^2})
      \closepath
}
%
\psaxes[labels=none, ticks=none, linewidth=0.25pt](0,0)(4.5,8.25)%
[\footnotesize $q$ \textsf{(quantity)},90]%
[\footnotesize $p$ \textsf{(price/unit)},90]
%
\psplot[linecolor=blue]{0}{4}{0.5*(x-4)^2}
\psplot[linecolor=blue]{0}{4}{0.25*x^2+1}
%
\psline[linestyle=dotted](2,0)(2,2)
\psline[linestyle=dotted](0,2)(2,2)
%
\rput(1.3,6.25){\rnode{A}{\footnotesize \textsf{Producer Surplus}}}
\pnode(0.5,1.35){B}
\nccurve[angleA=180, angleB=135]{->}{A}{B}
%
\rput[r](-0.05,1){\footnotesize $p_0$}
\rput[r](-0.05,2){\footnotesize $p*$}
\rput[r](-0.05,8){\footnotesize $p_1$}
\rput[t](2,-0.1){\footnotesize $q*$}
\rput[t](4,-0.1){\footnotesize $q_1$}
\rput(3.3,3){\footnotesize \textsf{Supply}}
\rput(1.5,4.25){\footnotesize\textsf{Demand}}
\end{pspicture}

\end{document}

vendredi 25 avril 2014

Thomas Söll : mise à jour de pst-perspective avec la projection d'un cylindre.

En voici 2 images extraites de la documentation :
 Le package est disponible sur le serveur du CTAN :

À toutes fins utiles, je rappelle l'adresse de Thomas : Thomas.Soell@onlinehome.de 

Thomas Söll propose 2 nouvelles macros pour pst-eucl

Pour le package pst-eucl de Dominique Rodriguez, Thomas Söll propose la possibilité d'afficher la distance entre 2 points ainsi que le marquage et la valeur d'un angle déterminé par 3 points. Le calcul est effectué par l'interpréteur postscript ainsi que l'affichage du résultat. Ce sont les macros :
\psSpaceV
\psAngleMark
Cette dernière ajoute donc l'option d'affichage de la valeur de l'angle à celles de la macro de pst-eucl : \pstMarkAngle.
Le listing ci-dessous à compiler : LaTeX->dvips->ps2pdf

\documentclass[border=10pt]{standalone}
\usepackage[distiller]{pstricks}
\usepackage{pst-eucl,pstricks-add}

\SpecialCoor%
\makeatletter
\pst@addfams{pst-eucl}
\define@key[psset]{pst-eucl}{DecimalN}{\def\psk@DecimalN{#1}}%
% Linecolor
\define@key[psset]{pst-eucl}{ArcColor}{\def\psk@ArcColor{#1}}%
% fillcolor for wedge
\define@key[psset]{pst-eucl}{WedgeColor}{\def\psk@WedgeColor{#1}}%
% fillcolor for wedge
\define@key[psset]{pst-eucl}{WedgeOpacity}{\def\psk@WedgeOpacity{#1}}%
% x Labelsep
\define@key[psset]{pst-eucl}{xLabelSep}{\def\psk@xLabelSep{#1}}%
% y Labelsep
\define@key[psset]{pst-eucl}{yLabelSep}{\def\psk@yLabelSep{#1}}%
% Fontsize Values
\define@key[psset]{pst-eucl}{FontSizeV}{\def\psk@FontSizeV{#1}}%
%----------------------------------------------------------------------
\define@boolkey[psset]{pst-eucl}[Pst@]{AngleValue}[false]{} % show angle value
\define@boolkey[psset]{pst-eucl}[Pst@]{AngleArc}[true]{} % show angle arcShowWedge
\define@boolkey[psset]{pst-eucl}[Pst@]{ShowWedge}[true]{} % show wedge
%---------------------------------------------------------------------
%   Default Parameter
\psset[pst-eucl]{%
DecimalN=2,ArcColor=black,WedgeColor=blue,WedgeOpacity=0.2,AngleValue=false,AngleArc=true,xLabelSep=0,yLabelSep=0,FontSizeV=8,ShowWedge=true
}
%------------- Distance of 2 points -----------------------
%---------------------------------------------------------------------
\def\psSpaceV{\pst@object{pstpsSpaceV}}%
\def\pstpsSpaceV@i(#1)(#2)#3#4{%
\begingroup%
\pst@killglue
\use@par
\pst@getcoor{#1}\pst@tempA
\pst@getcoor{#2}\pst@tempB
\pnode(! %
/Helvetica findfont \psk@FontSizeV\space scalefont setfont
/laenge {10 #4 exp mul round 10 #4 exp div 15 string cvs stringwidth } def
/Wert {10 #4 exp mul round 10 #4 exp div 15 string cvs dot2comma show } def
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempA /y3 ED /x3 ED
\pst@tempB /y4 ED /x4 ED
x3 x4 sub y3 y4 sub Pyth laenge /dx ED
x3 x4 add 2 div dx 2 div sub \psk@xLabelSep\space add y3 y4 add 2 div \psk@yLabelSep\space add
moveto %
x1 x2 sub y1 y2 sub Pyth Wert
x1 x2 add 2 div y1 y2 add 2 div){#3}
\endgroup
\ignorespaces
}
%--------------------------------------------------------------------
%------------- angle mark and calculate the value -----------
%---------------------------------------------------------------------
\def\psAngleMark{\@ifnextchar[\Pst@AngleMark{\Pst@AngleMark[]}}%
\def\Pst@AngleMark[#1](#2)(#3)(#4)#5{%
\def\pst@par{#1}%
\begingroup%
\pst@killglue
\use@par
\pst@getcoor{#2}\pst@tempA
\pst@getcoor{#3}\pst@tempB
\pst@getcoor{#4}\pst@tempC
\pst@Verb{%
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempC \tx@UserCoor /y3 ED /x3 ED
y1 y2 sub x1 x2 sub Atan neg /delta1 ED
y3 y2 sub x3 x2 sub Atan neg /delta2 ED
delta1 delta2 le {180 delta2 delta1 add 2 div neg add /WiM ED} {delta2 delta1 add 2 div neg /WiM ED} ifelse
}
\ifPst@ShowWedge
\pswedge[fillstyle=solid,fillcolor=\psk@WedgeColor,opacity=\psk@WedgeOpacity](#3){\psk@MarkAngleRadius}{! delta1}{! delta2}%
\else \fi
\ifPst@AngleArc
\psarc[linecolor=\psk@ArcColor](#3){\psk@MarkAngleRadius}{! delta1}{! delta2}%
\else \fi
%
\pnode(! %
/dec \psk@DecimalN\space def
/Helvetica findfont \psk@FontSizeV\space scalefont setfont
/s1 { /Symbol findfont \psk@FontSizeV\space scalefont setfont } bind def
/laenge {10 dec exp mul round 10 dec exp div 15 string cvs stringwidth } def
/WertZeigen {10 dec exp mul round 10 dec exp div 15 string cvs dot2comma show s1 (\string\260) show} def
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempC \tx@UserCoor /y3 ED /x3 ED
y1 y2 sub x1 x2 sub Atan neg /delta1 ED
y3 y2 sub x3 x2 sub Atan neg /delta2 ED
delta1 delta2 le {360 delta2 delta1 sub abs sub /WiWert ED} {delta2 delta1 sub abs /WiWert ED} ifelse
delta1 delta2 le {180 delta2 delta1 add 2 div neg add /WiM ED} {delta2 delta1 add 2 div neg /WiM ED} ifelse
\psk@MarkAngleRadius\space delta2 delta1 add 2 div PtoC \pst@tempB exch pop add /ym1 ED \pst@tempB pop add /xm1 ED
xm1 \psk@MarkAngleRadius\space WiM cos mul \pst@number\psxunit mul add \psk@xLabelSep\space add ym1 \psk@MarkAngleRadius\space WiM sin mul \pst@number\psxunit mul add \psk@yLabelSep\space add moveto %
\ifPst@AngleValue
WiWert WertZeigen
\else \fi
x2 0.8 WiM cos mul add y2 0.8 WiM sin mul add){#3-M}
\uput{\psk@LabelSep}[! WiM]{0}(#3){#5}
\endgroup
\ignorespaces
}
\makeatother

\begin{document}

\begin{pspicture}(-12,-8)(1,1)
\psgrid[gridlabels=0pt,subgriddiv=2,gridwidth=0.4pt,subgridwidth=0.2pt,gridcolor=black!60,subgridcolor=black!40]
\def\seitec{6}
\def\seitea{7}
\def\seiteb{8}
\psset{PointSymbol=none,linejoin=1,linewidth=0.4pt,PtNameMath=false,labelsep=0.07,MarkAngleRadius=1.1,DecimalN=1}
    \pstGeonode[PosAngle={90,90}](0,0){A}(6;190){B}
%    \pstGeonode[PosAngle={225,-75}](0,0){A}(\seitec;10){B}
    \psset{PointName=}
    \pstInterCC[RadiusA=\pstDistVal{\seiteb},RadiusB=\pstDistVal{\seitea},PosAngle=-90,PointNameA=C]{A}{}{B}{}{C}{C-}
    \pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{C}{}{A}{}{D-}{D}
    \pstInterLC[Radius=\pstDistAB{A}{C}]{C}{D}{C}{}{A'-}{A'}
    \pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{A'}{}{C}{}{B'}{B'-}
    \pstInterLL[PosAngle=90,PointName=default]{B'}{C}{A}{B}{E}
    \pspolygon(A)(B)(C)
    \pspolygon[fillstyle=solid,fillcolor=magenta,opacity=0.1](C)(E)(B)

\psAngleMark[ArcColor=blue,WedgeColor=blue!20,AngleValue=true,LabelSep=0.7,arrows=->](B)(A)(C){}
\psAngleMark[AngleValue=true,ArcColor=red,arrows=->,WedgeOpacity=0.6,WedgeColor=yellow,LabelSep=0.5](C)(B)(A){$\beta$}
\psAngleMark[LabelSep=0.7,WedgeColor=green,xLabelSep=-6,yLabelSep=-10](A)(C)(B){$\gamma$}
\psAngleMark[LabelSep=0.7,AngleArc=false,WedgeColor=green,arrows=->,xLabelSep=-15,yLabelSep=0](C)(E)(B){\color{green}$\gamma$}
\psAngleMark[AngleValue=true,MarkAngleRadius=1.0,LabelSep=0.5,ShowWedge=false,xLabelSep=-5,yLabelSep=7,arrows=->](E)(B)(C){}

\pcline[linestyle=none](A)(B)\nbput{\seitec}
\pcline[linestyle=none](C)(B)\naput{\seitea}
\psSpaceV[xLabelSep=-8,yLabelSep=4](B)(E){MW}{2}
\psSpaceV[FontSizeV=15,xLabelSep=-20](A)(C){MAC}{1}
\psSpaceV[xLabelSep=-17](E)(C){MEC}{1}
\end{pspicture}
\end{document}