123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /* This file is part of the GNU plotutils package. Copyright (C) 1995,
- 1996, 1997, 1998, 1999, 2000, 2005, 2008, Free Software Foundation, Inc.
- The GNU plotutils package is free software. You may redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software foundation; either version 2, or (at your
- option) any later version.
- The GNU plotutils package is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License along
- with the GNU plotutils package; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin St., Fifth Floor,
- Boston, MA 02110-1301, USA. */
- /* Lookup table listing relative chordal deviation, i.e. the factor
- (chordal deviation)/(chord length), for binary subdivisions of the arc
- sizes we support.
- The symbolic names for these arc sizes, e.g. QUARTER_ARC and
- THREE_QUARTER_ARC, are defined in extern.h. The constant
- MAX_ARC_SUBDIVISIONS, which can in principle be device dependent, is
- also defined there. It should be no greater than
- TABULATED_ARC_SUBDIVISIONS, the length of each entry in the lookup
- table.
- The formula
- relative_deviation = (1 - cos (theta/2)) / (2 * sin (theta/2)),
- where theta = subtended angle, was used to compute the numbers in the
- lookup tables. The formula is justified as follows. Let
- s = chordal deviation / radius (so that 0 <= s <= 2)
- h = half chord length / radius.
- Then by elementary trigonometry, s = 1 - cos(theta/2) and
- h = sin(theta/2), where theta = angle subtended by the chord. Since
- the relative chordal deviation is s/2h, this justifies the formula.
- Incidentally, h = sqrt(s * (2-s))), irrespective of theta.
- There is an alternative derivation of the numbers in these tables,
- tail-recursive and elegant, which uses only sqrt(). Let s' and h' be
- the values of s and h when the arc is bisected, i.e. theta is divided by
- two. Using half-angle formulae it is easy to check that
- s' = 1 - sqrt (1 - s / 2)
- h' = h / 2 (1 - s')
- (The first of these formulae is well-known; see the article of Ken
- Turkowski <turk@apple.com> in Graphics Gems V, where he approximates the
- right-hand side by s/4.) So the pair (s',h') may be computed from the
- pair (s,h). By updating (s,h) with every bisection, one can generate a
- table of successive values of the quotient s/2h, i.e. the relative
- chordal deviation.
- */
- /* Maximum number of times a circular or elliptic arc is recursively
- subdivided, when it is being approximated by an inscribed polyline. The
- polyline will contain no more than 2**MAX_ARC_SUBDIVISIONS line
- segments. MAX_ARC_SUBDIVISIONS must be no larger than
- TABULATED_ARC_SUBDIVISIONS below (the size of the tables in g_arc.h). */
- #define MAX_ARC_SUBDIVISIONS 5 /* to avoid buffer overflow on HP7550[A|B] */
- #define TABULATED_ARC_SUBDIVISIONS 15 /* length of each table entry */
- /* Types of circular/elliptic arc. These index into the doubly indexed
- table of `relative chordal deviations' below. */
- #define NUM_ARC_TYPES 3
- #define QUARTER_ARC 0
- #define HALF_ARC 1
- #define THREE_QUARTER_ARC 2
- #define USER_DEFINED_ARC -1 /* does not index into table */
- static const double _chord_table[NUM_ARC_TYPES][TABULATED_ARC_SUBDIVISIONS] =
- {
- { /* Quarter Arc */
- 0.20710678, /* for arc subtending 90 degrees */
- 0.099456184, /* for arc subtending 45 degrees */
- 0.049245702, /* for arc subtending 22.5 degrees */
- 0.024563425, /* for arc subtending 11.25 degrees */
- 0.012274311, /* etc. */
- 0.0061362312,
- 0.0030680001,
- 0.0015339856,
- 0.000766991,
- 0.00038349527,
- 0.00019174761,
- 9.58738e-05,
- 4.79369e-05,
- 2.396845e-05,
- 1.1984225e-05
- },
- { /* Half Arc */
- 0.5, /* for arc subtending 180 degrees */
- 0.20710678, /* for arc subtending 90 degrees */
- 0.099456184, /* for arc subtending 45 degrees */
- 0.049245702, /* for arc subtending 22.5 degrees */
- 0.024563425, /* for arc subtending 11.25 degrees */
- 0.012274311, /* etc. */
- 0.0061362312,
- 0.0030680001,
- 0.0015339856,
- 0.000766991,
- 0.00038349527,
- 0.00019174761,
- 9.58738e-05,
- 4.79369e-05,
- 2.396845e-05
- },
- { /* Three Quarter Arc */
- 1.2071068, /* for arc subtending 270 degrees */
- 0.33408932, /* for arc subtending 135 degrees */
- 0.15167334, /* for arc subtending 67.5 degrees */
- 0.074167994, /* for arc subtending 33.75 degrees */
- 0.036882216, /* etc. */
- 0.01841609,
- 0.0092049244,
- 0.0046020723,
- 0.0023009874,
- 0.0011504876,
- 0.00057524305,
- 0.00028762143,
- 0.0001438107,
- 7.190535e-05,
- 3.5952675e-05
- }
- };
|