#!/usr/bin/env python
# -*- coding: ISO-8859-15 -*-
import sys
sys.path.insert(0, "..")
from math import *
from pyx import *
try:
from math import radians,degrees
except ImportError:
# fallback implementation for Python 2.1
def radians(x): return x*pi/180
def degrees(x): return x*180/pi
startbox = box.polygon(corners=[[0,-0.6], [0.5,0.1], [-0.25,0.1]])
endbox = box.polygon(corners=[[4.5,3.9], [5.5,4.0], [5.2,3.4]])
# the arc connector <<<
c1 = canvas.canvas()
for b in [startbox, endbox]:
c1.stroke(b.path(), [style.linewidth.Thick, style.linejoin.round])
c1.fill(path.circle_pt(b.center[0], b.center[1], 2))
absangle = degrees(atan2(endbox.center[1] - startbox.center[1], endbox.center[0] - startbox.center[0]))
relangle = 60
len = 2
# the direct connection
direct = path.line_pt(startbox.center[0], startbox.center[1], endbox.center[0], endbox.center[1])
c1.stroke(direct, [style.linestyle.dashed])
# the arc connector
l = connector.arc(startbox, endbox, relangle=relangle, boxdists=[0.0,0.0])
c1.stroke(l, [style.linewidth.Thick, color.rgb.red, deco.earrow.Large])
# the relangle parameter
comp1 = path.path(path.moveto(*direct.atbegin()),
path.rlineto(len*cos(radians(absangle + relangle)), len*sin(radians(absangle + relangle))))
c1.stroke(comp1)
ang = path.path(path.arc(direct.atbegin()[0], direct.atbegin()[1], 0.8*len, absangle, absangle+relangle))
c1.stroke(ang, [deco.earrow.large])
pos = ang.at(0.5*ang.arclen())
c1.text(pos[0], pos[1], r"~relangle", [text.halign.left])
# the bulge parameter
bulge = 0.5 * direct.arclen() * tan(0.5*radians(relangle))
bul = path.path(path.moveto(*direct.at(0.5*direct.arclen())),
path.rlineto(bulge * cos(radians(absangle+90)), bulge * sin(radians(absangle+90))))
c1.stroke(bul, [deco.earrow.large])
pos = bul.at(0.5*bul.arclen())
c1.text(pos[0], pos[1], r"~(rel)bulge", [text.halign.left])
# >>>
# the curve connector <<<
c2 = canvas.canvas()
for b in [startbox, endbox]:
c2.stroke(b.path(), [style.linewidth.Thick, style.linejoin.round])
c2.fill(path.circle_pt(b.center[0], b.center[1], 2))
absangle = degrees(atan2(endbox.center[1] - startbox.center[1], endbox.center[0] - startbox.center[0]))
relangle1 = 60
relangle2 = 30
absbulge = 0
relbulge = 0.5
len = 2
# the direct connection
direct = path.line_pt(startbox.center[0], startbox.center[1], endbox.center[0], endbox.center[1])
c2.stroke(direct, [style.linestyle.dashed])
# the arc connector
l = connector.curve(startbox, endbox, relangle1=relangle1, relangle2=relangle2, absbulge=absbulge, relbulge=relbulge, boxdists=[0.0,0.0])
#l = connector.curve(startbox, endbox, absangle1=absangle+relangle1, absangle2=absangle+relangle2, absbulge=absbulge, relbulge=relbulge, boxdists=[0.0,0.0])
c2.stroke(l, [style.linewidth.Thick, color.rgb.red, deco.earrow.Large])
# the relangle parameters
# relangle1
c2.stroke(path.path(path.moveto(*direct.atbegin()),
path.rlineto(len*cos(radians(absangle + relangle1)),
len*sin(radians(absangle + relangle1)))))
ang = path.path(path.arc(direct.atbegin()[0], direct.atbegin()[1], 0.8*len, absangle, absangle+relangle1))
c2.stroke(ang, [deco.earrow.large])
pos = ang.at(0.5*ang.arclen())
c2.text(pos[0], pos[1], r"~relangle1", [text.halign.left])
# absangle1
c2.stroke(path.path(path.moveto(*direct.atbegin()), path.rlineto(len, 0)))
ang = path.path(path.arc(direct.atbegin()[0], direct.atbegin()[1], 0.5*len, 0, absangle+relangle1))
c2.stroke(ang, [deco.earrow.large])
pos = ang.at(0.2*ang.arclen())
c2.text(pos[0], pos[1], r"~absangle1", [text.halign.left])
# relangle2
c2.stroke(path.path(path.moveto(*direct.atend()),
path.rlineto(len*cos(radians(absangle)),
len*sin(radians(absangle)))))
c2.stroke(path.path(path.moveto(*direct.atend()),
path.rlineto(len*cos(radians(absangle + relangle2)),
len*sin(radians(absangle + relangle2)))))
ang = path.path(path.arc(direct.atend()[0], direct.atend()[1],
0.8*len, absangle, absangle+relangle2))
c2.stroke(ang, [deco.earrow.large])
pos = ang.at(0.5*ang.arclen())
c2.text(pos[0], pos[1], r"~relangle2", [text.halign.left])
# the bulge parameter
bulge = absbulge + direct.arclen() * relbulge
bul = path.path(path.moveto(*direct.atbegin()),
path.rlineto(bulge * cos(radians(absangle+relangle1)), bulge * sin(radians(absangle+relangle1))))
c2.stroke(bul, [deco.earrow.large])
pos = bul.at(0.7*bul.arclen())
c2.text(pos[0], pos[1], r"~(rel)bulge", [text.halign.left])
bul = path.path(path.moveto(*direct.atend()),
path.rlineto(-bulge * cos(radians(absangle+relangle2)), -bulge * sin(radians(absangle+relangle2))))
c2.stroke(bul, [deco.earrow.large])
pos = bul.at(0.7*bul.arclen())
c2.text(pos[0], pos[1], r"~(rel)bulge", [text.halign.left, text.vshift(1)])
# >>>
# write everything
c1.insert(c2, [trafo.translate(6.5, 0)])
c1.writeEPSfile("connector", paperformat=document.paperformat.A4)
c1.writePDFfile("connector")
# vim:foldmethod=marker:foldmarker=<<<,>>>
|