Gestrichelte Linien


%!PS-Adobe-1.0
%%Creator: Holger Gehringer
%%Title: Beispiel fuer gestrichelte Linien
%%CreationDate: Mo, 23.11.1998
%%DocumentMedia: A4 595 842 0 () ()
%%Orientation: Portrait
%%Pages: (atend)
%%DocumentFonts: Times-Roman Helvetica
%%EndComments

% Dieses Programm zeigt, wie mit Hilfe des setdash-Operators eine gestrichelte
% Linie entlang eines beliebigen Pfades gezeichnet werden kann. Das Strichmus-
% ter wird so zentriert, dass die Striche am Anfang und Ende des Pfades die
% gleiche Laenge haben. Der beschriebene Algorithmus funktioniert nur, wenn der
% Pfad zusammenhaengend ist und das Strichmuster symmetrisch ist (das Array
% nicht mehr als ein Element enthaelt). Das Programm enthaelt eine sehr nuetz-
% liche Proz. 'Pathlength', die die Laenge eines beliebigen Pfades ermittelt.
         
/Centerdash                      % Die Prozedur Centerdash zentriert ein Strich-
                                 % muster auf dem aktuellen Pfad, so dass die
                                 % Striche am Anfang und Ende des Pfades die
                                 % gleiche Laenge haben.
{ /Pattern exch def              % Sie braucht ein Array mit dem Strichmuster
                                 % als Argument.
  /Pathlen Pathlength def        % Zum Zentr. des Musters werden die Pfadlaenge
  /Patternlen Pattern 0 get def  % und die Laenge des Strichmusters benoetigt

  /tmp Pathlen Patternlen sub def   % Wird zur Berechnung des offsets gebraucht,
  /divisor Patternlen 2 mul def  % gebraucht, da keine mod-Rechnung bei Gleit-
  { /tmp tmp divisor sub def     % da keine mod-Rechnung bei reellen Zahlen 
    tmp 0 lt { exit } if         % moeglich ist.
  } loop                         % 
  /Offset Patternlen             % (fuer setdash-Befehl) Berechnung wie folgt:
  tmp divisor add 2 div sub def  % Patternlen - [ (Pathlen - Patternlen) mod
                                 %                (2 * Patternlen) ] / 2
  
  Pattern Offset setdash         % Aufruf von setdash mit dem berechneten Offset
} def

/Pathlength                      % Diese Prozedur berechnet die Laenge eines
                                 % eines beliebigen Pfades.
{ flattenpath                    % Zuerst wird der Pfad geglaettet; flattenpath
                                 % wandelt alle curveto- und arc-Segmente des
                                 % Pfades in lineto-Abschnitte. Dann werden mit
                                 % Hilfe von pathforall alle Pfadsegmente abge-
                                 % arbeitet und ihre Laenge berechnet.
  /Dist 0 def                    % Dist enthaelt am Ende die Gesamtlaenge
  
  { /YFirst exch def             % Diese Prozedur wird von pathforall bei
    /XFirst exch def             % moveto-Segmenten aufgerufen.
    /YMoveto YFirst def          % Die Position des moveto wird notiert, damit
    /XMoveto XFirst def          % spaeter die Laenge des closepath berechnet
  }                              % werden kann.

  { /YNext exch def              % Diese Prozedur wird von pathforall bei
    /XNext exch def              % lineto-Segmenten aufgerufen
    /Dist                        % Berechnung der Laenge nach Pythagoras
    Dist YNext YFirst sub
    dup mul
    XNext XFirst sub
    dup mul
    add sqrt add def
    /YFirst YNext def
    /XFirst XNext def
  }

  {}                             % Diese Prozedur wird von pathforall bei
                                 % curveto-Segmenten aufgerufen. Sie ist leer,
                                 % da der Pfad nach flattenpath keine curveto-
                                 % Segmente mehr enthaelt.
            
  { /YNext YMoveto def           % Diese Prozedur wird von pathforall bei
    /XNext XMoveto def           % closepath-Segmenten aufgerufen.
    /Dist
    Dist YNext YFirst sub
    dup mul
    XNext XFirst sub
    dup mul
    add sqrt add def
    /YFirst YNext def
    /XFirst XNext def
  } pathforall
  Dist                           % Als Ergebnis bleibt die Gesamtlaenge auf dem
} def                            % Stack zurueck.

%%EndProlog

%%Page: 1 1
5 setlinewidth

gsave 300 400 translate
160 40 400                       % Teste Centerdash an geraden Pfaden verschie-
{ dup 2 div 0 moveto             % dener Laenge
  neg 0 rlineto
  [20] Centerdash stroke
  0 40 translate
} for

grestore 300 500 translate
160 40 400                       % Teste Centerdash an Kreispfaden verschiedener
{ 0 0 3 -1 roll 236 304 arc      % Laenge
  [23] Centerdash stroke
} for

showpage

%%Trailer
%%Pages: 1


Vorschau:

Download PostScript-File

© Holger Gehringer, Dezember 1998