[BACK]Return to compact.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/compact.c, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * $Id: $
                      3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - compact.c */
                      7:
                      8: /* contains routines to compress a vector stream without modifying it */
                      9:
                     10: /*[
                     11:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
                     12:  *
                     13:  * Permission to use, copy, and distribute this software and its
                     14:  * documentation for any purpose with or without fee is hereby granted,
                     15:  * provided that the above copyright notice appear in all copies and
                     16:  * that both that copyright notice and this permission notice appear
                     17:  * in supporting documentation.
                     18:  *
                     19:  * Permission to modify the software is granted, but not the right to
                     20:  * distribute the complete modified source code.  Modifications are to
                     21:  * be distributed as patches to the released version.  Permission to
                     22:  * distribute binaries produced by compiling modified sources is granted,
                     23:  * provided you
                     24:  *   1. distribute the corresponding source modifications from the
                     25:  *    released version in the form of a patch file along with the binaries,
                     26:  *   2. add special version identification to distinguish your version
                     27:  *    in addition to the base release version number,
                     28:  *   3. provide your name and address as the primary contact for the
                     29:  *    support of your modified version, and
                     30:  *   4. retain our contact information in regard to use of the base
                     31:  *    software.
                     32:  * Permission to distribute the released version of the source code along
                     33:  * with corresponding source modifications in the form of a patch file is
                     34:  * granted with same provisions 2 through 4 for binary distributions.
                     35:  *
                     36:  * This software is provided "as is" without express or implied warranty
                     37:  * to the extent permitted by applicable law.
                     38: ]*/
                     39:
                     40: #ifndef COMPACT
                     41:
                     42: /* replaces runs of constant slope in the buffer with single vectors
                     43:    returns the number of points eliminated */
                     44: int compact_slope(xp, yp, isa_move, sz, delta)
                     45: int xp[], yp[], isa_move[];
                     46: int *sz;
                     47: double delta;
                     48: {
                     49:     int dx, dy, old_size, new_index, i, start;
                     50:     float slope, old_slope;
                     51:
                     52:     old_size = *sz;
                     53:     new_index = 0;
                     54:     start = 0;
                     55:     if (xp[1] != xp[0])
                     56:        old_slope = (float) (yp[1] - yp[0]) / (float) (xp[1] - xp[0]);
                     57:     else
                     58:        old_slope = (float) (yp[1] - yp[0]) / (float) (0.00001 + xp[1] - xp[0]);
                     59:     for (i = 2; i < old_size; i++) {
                     60:        dx = xp[i] - xp[i - 1];
                     61:        dy = yp[i] - yp[i - 1];
                     62:        if (dx != 0)
                     63:            slope = (float) dy / (float) dx;
                     64:        else
                     65:            slope = (float) dy / ((float) dx + 0.00001);
                     66:        if ((ABS(slope - old_slope) > delta) || (isa_move[i])) {
                     67:            xp[new_index] = xp[start];
                     68:            yp[new_index] = yp[start];
                     69:            isa_move[new_index] = isa_move[start];
                     70:            new_index++;
                     71:            if (start != i - 1) {
                     72:                xp[new_index] = xp[i - 1];
                     73:                yp[new_index] = yp[i - 1];
                     74:                isa_move[new_index] = isa_move[i - 1];
                     75:                new_index++;
                     76:            }
                     77:            start = i;
                     78:            /* this is the slope for the new run */
                     79:            old_slope = slope;
                     80:        }
                     81:     }
                     82:     /* copy the last point into the new array */
                     83:     xp[new_index] = xp[old_size - 1];
                     84:     yp[new_index] = yp[old_size - 1];
                     85:     isa_move[new_index] = isa_move[old_size - 1];
                     86:     new_index++;
                     87:     *sz = new_index;
                     88:     return (old_size - *sz);
                     89: }
                     90:
                     91: /* compacts the vector list by compressing runs of constant
                     92:    dx&dy into one vector
                     93:    use this if floating point is too expensive!
                     94:    more naive than compact_slope; doesn't compact as much as possible
                     95:    returns the number of points eliminated */
                     96: int compact_int(xp, yp, isa_move, size)
                     97: int xp[], yp[], isa_move[], *size;
                     98: {
                     99:     int dx, dy, old_dx, old_dy, start, index, i, old_size;
                    100:
                    101:     start = index = 0;
                    102:     old_dx = xp[1] - xp[0];
                    103:     old_dy = yp[1] - yp[0];
                    104:     for (i = 2; i < *size; i++) {
                    105:        dx = xp[i] - xp[i - 1];
                    106:        dy = yp[i] - yp[i - 1];
                    107:        if ((ABS(dx - old_dx) + ABS(dy - old_dy) != 0) || (isa_move[i])) {
                    108:            /*  we've reached the end of a run */
                    109:            xp[index] = xp[start];
                    110:            yp[index] = yp[start];
                    111:            isa_move[index] = isa_move[start];
                    112:            index++;
                    113:            if (start != i - 1) {
                    114:                xp[index] = xp[i - 1];
                    115:                yp[index] = yp[i - 1];
                    116:                isa_move[index] = isa_move[i - 1];
                    117:                index++;
                    118:            }
                    119:            start = i;
                    120:            old_dx = dx;
                    121:            old_dy = dy;
                    122:        }
                    123:     }                          /* end for */
                    124:     /* include the last point */
                    125:     xp[index] = xp[*size - 1];
                    126:     yp[index] = yp[*size - 1];
                    127:     isa_move[index] = isa_move[*size - 1];
                    128:     index++;
                    129:     old_size = *size;
                    130:     *size = index;
                    131:     return (old_size - *size);
                    132: }
                    133: #endif
                    134:
                    135: #define COMPACT

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>