reportlab/pdfgen/pdfgeom.py
author rgbecker
Wed, 25 Oct 2000 08:57:46 +0000
changeset 494 54257447cfe9
parent 47 0505ed9b16d9
child 562 6c9408ec3302
permissions -rwxr-xr-x
Changed to indirect copyright
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
494
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 47
diff changeset
     1
#copyright ReportLab Inc. 2000
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 47
diff changeset
     2
#see license.txt for license details
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 47
diff changeset
     3
#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/pdfgeom.py?cvsroot=reportlab
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 47
diff changeset
     4
#$Header: /tmp/reportlab/reportlab/pdfgen/pdfgeom.py,v 1.6 2000/10/25 08:57:45 rgbecker Exp $
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 47
diff changeset
     5
__version__=''' $Id: pdfgeom.py,v 1.6 2000/10/25 08:57:45 rgbecker Exp $ '''
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 7
diff changeset
     6
__doc__="""
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
     7
This module includes any mathematical methods needed for PIDDLE.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
     8
It should have no dependencies beyond the Python library.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
     9
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    10
So far, just Robert Kern's bezierArc.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    11
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    12
"""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    13
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    14
from math import sin, cos, pi, ceil
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    15
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    16
def bezierArc(x1,y1, x2,y2, startAng=0, extent=90):
47
0505ed9b16d9 8bit character fixes
rgbecker
parents: 16
diff changeset
    17
    """bezierArc(x1,y1, x2,y2, startAng=0, extent=90) --> List of Bezier
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    18
curve control points.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    19
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    20
(x1, y1) and (x2, y2) are the corners of the enclosing rectangle.  The
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    21
coordinate system has coordinates that increase to the right and down.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    22
Angles, measured in degress, start with 0 to the right (the positive X
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    23
axis) and increase counter-clockwise.  The arc extends from startAng
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    24
to startAng+extent.  I.e. startAng=0 and extent=180 yields an openside-down
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    25
semi-circle.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    26
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    27
The resulting coordinates are of the form (x1,y1, x2,y2, x3,y3, x4,y4)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    28
such that the curve goes from (x1, y1) to (x4, y4) with (x2, y2) and
47
0505ed9b16d9 8bit character fixes
rgbecker
parents: 16
diff changeset
    29
(x3, y3) as their respective Bezier control points."""
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    30
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    31
    x1,y1, x2,y2 = min(x1,x2), max(y1,y2), max(x1,x2), min(y1,y2)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    32
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    33
    if abs(extent) <= 90:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    34
        arcList = [startAng]
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    35
        fragAngle = float(extent)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    36
        Nfrag = 1
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    37
    else:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    38
        arcList = []
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    39
        Nfrag = int(ceil(abs(extent)/90.))
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    40
        fragAngle = float(extent) / Nfrag
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    41
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    42
    x_cen = (x1+x2)/2.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    43
    y_cen = (y1+y2)/2.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    44
    rx = (x2-x1)/2.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    45
    ry = (y2-y1)/2.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    46
    halfAng = fragAngle * pi / 360.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    47
    kappa = abs(4. / 3. * (1. - cos(halfAng)) / sin(halfAng))
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    48
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    49
    if fragAngle < 0:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    50
        sign = -1
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    51
    else:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    52
        sign = 1
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    53
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    54
    pointList = []
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    55
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    56
    for i in range(Nfrag):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    57
        theta0 = (startAng + i*fragAngle) * pi / 180.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    58
        theta1 = (startAng + (i+1)*fragAngle) *pi / 180.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    59
        if fragAngle > 0:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    60
            pointList.append((x_cen + rx * cos(theta0),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    61
                              y_cen - ry * sin(theta0),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    62
                              x_cen + rx * (cos(theta0) - kappa * sin(theta0)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    63
                              y_cen - ry * (sin(theta0) + kappa * cos(theta0)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    64
                              x_cen + rx * (cos(theta1) + kappa * sin(theta1)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    65
                              y_cen - ry * (sin(theta1) - kappa * cos(theta1)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    66
                              x_cen + rx * cos(theta1),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    67
                              y_cen - ry * sin(theta1)))
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    68
        else:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    69
            pointList.append((x_cen + rx * cos(theta0),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    70
                              y_cen - ry * sin(theta0),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    71
                              x_cen + rx * (cos(theta0) + kappa * sin(theta0)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    72
                              y_cen - ry * (sin(theta0) - kappa * cos(theta0)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    73
                              x_cen + rx * (cos(theta1) - kappa * sin(theta1)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    74
                              y_cen - ry * (sin(theta1) + kappa * cos(theta1)),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    75
                              x_cen + rx * cos(theta1),
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    76
                              y_cen - ry * sin(theta1)))
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    77
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    78
    return pointList