/linearc 0 def
/Ligne {
gsave
newpath
smoveto
count 2 idiv {slineto} repeat
stroke
grestore
} def
%% syntaxe~: [x1 y1 ... xn yn] ligne_brisee_
/ligne_brisee_ {
reversep
aload length 2 idiv
% 3 copy pop
% smoveto
{
slineto
} repeat
} def
%% syntaxe~: [x1 y1 ... xn yn] ligne_brisee
/ligne_brisee {
gsave
newpath
dup 0 getp smoveto
ligne_brisee_
starfill
newarrowpath
stroke
grestore
} def
%% syntaxe~: [x1 y1 ... xn yn] ligne
/ligne_coudee_ {
dup length 4 le
{ligne_brisee_}
{
3 dict begin
/les_points exch def
les_points 0 getp
les_points 1 getp
les_points 2 getp
portion_ligne_coudee_
les_points cdr cdr
/nouveaux_points exch def
/C' defpoint
nouveaux_points 0 C' putp
nouveaux_points
end
ligne_coudee_
}
ifelse
} def
%% syntaxe~: [x1 y1 ... xn yn] ligne
/ligne_coudee_ {
3 dict begin
/les_points exch def
/n les_points length 2 idiv 1 sub def
n 1 le
{les_points ligne_brisee_}
{
/i 0 def
les_points 0 getp
n 1 sub {
les_points i 1 add getp
les_points i 2 add getp
portion_ligne_coudee_
/i i 1 add store
} repeat
pop pop
les_points n getp slineto
}
ifelse
end
} def
%% syntaxe~: [x1 y1 ... xn yn] ligne_coudee
/ligne_coudee {
gsave
newpath
dup 0 getp smoveto
ligne_coudee_
starfill
newarrowpath
stroke
grestore
} def
/ligne {
gsave
3 dict begin
dup isstring
{
/option exch def
/liste exch def
/n liste length 2 idiv 1 sub def
liste
}
if
linearc 0 eq
{ligne_brisee}
{ligne_coudee}
ifelse
currentdict /option known
{
liste 1 getp
liste 0 getp
arrowpath0
liste n 1 sub getp
liste n getp
arrowpath1
option
gere_arrowhead
}
if
end
grestore
} def
%% ligne_ doit etre appele sans option
/ligne_ {
linearc 0 eq
{ligne_brisee_}
{ligne_coudee_}
ifelse
} def
%% syntaxe : A B C portion_ligne_coudee --> dessine la ligne coudee
%% A B C' et depose C' sur la pile
/portion_ligne_coudee_ {
9 dict begin
/C defpoint
/B defpoint
/A defpoint
/alpha
B C vecteur
B A vecteur
divc
arg
.5 mul
def
alpha 0 eq
alpha abs 90 eq or
{
[A B C milieu] ligne_
B C milieu
}
{
/rapport1
1
linearc
alpha tan div
A B distance div
abs
sub
def
/rapport2
1
linearc
alpha tan div
C B distance div
abs
sub
def
rapport1 A B ABpoint /A' defpoint
rapport2 C B ABpoint /C' defpoint
A B C bissectrice
A B A' perp
interdroite
/I defpoint
A slineto
A' slineto
I A' C'
alpha 0 ge
{arcnp_}
{arcp_}
ifelse
C'
}
ifelse
end
} def
/portion_ligne_coudee {
gsave
newpath
6 copy pop pop pop pop smoveto
portion_ligne_coudee_
stroke
grestore
} def
|