| /********************************************************************** |
| * File: quspline.h (Formerly qspline.h) |
| * Description: Code for the QSPLINE class. |
| * Author: Ray Smith |
| * Created: Tue Oct 08 17:16:12 BST 1991 |
| * |
| * (C) Copyright 1991, Hewlett-Packard Ltd. |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| * |
| **********************************************************************/ |
| |
| #ifndef QUSPLINE_H |
| #define QUSPLINE_H |
| |
| #include "quadratc.h" |
| #include "serialis.h" |
| #include "memry.h" |
| #include "rect.h" |
| |
| class ROW; |
| |
| class QSPLINE |
| { |
| friend void make_first_baseline(TBOX *, |
| int, |
| int *, |
| int *, |
| QSPLINE *, |
| QSPLINE *, |
| float); |
| friend void make_holed_baseline(TBOX *, int, QSPLINE *, QSPLINE *, float); |
| friend void tweak_row_baseline(ROW *); |
| public: |
| QSPLINE() { //empty constructor |
| segments = 0; |
| xcoords = NULL; //everything empty |
| quadratics = NULL; |
| } |
| QSPLINE( //copy constructor |
| const QSPLINE &src); |
| QSPLINE( //constructor |
| inT32 count, //number of segments |
| inT32 *xstarts, //segment starts |
| double *coeffs); //coefficients |
| ~QSPLINE (); //destructor |
| QSPLINE ( //least squares fit |
| int xstarts[], //spline boundaries |
| int segcount, //no of segments |
| int xcoords[], //points to fit |
| int ycoords[], int blobcount,//no of coords |
| int degree); //function |
| |
| double step( //step change |
| double x1, //between coords |
| double x2); |
| double y( //evaluate |
| double x) const; //at x |
| |
| void move( // reposition spline |
| ICOORD vec); // by vector |
| BOOL8 overlap( //test overlap |
| QSPLINE *spline2, //2 cannot be smaller |
| double fraction); //by more than this |
| void extrapolate( //linear extrapolation |
| double gradient, //gradient to use |
| int left, //new left edge |
| int right); //new right edge |
| |
| #ifndef GRAPHICS_DISABLED |
| void plot( //draw it |
| ScrollView* window, //in window |
| ScrollView::Color colour) const; //in colour |
| #endif |
| |
| void prep_serialise() { //set ptrs to counts |
| } //not required |
| |
| void dump( //write external bits |
| FILE *f) { |
| serialise_bytes (f, (void *) xcoords, (segments + 1) * sizeof (inT32)); |
| serialise_bytes (f, (void *) quadratics, segments * sizeof (QUAD_COEFFS)); |
| } |
| |
| void de_dump( //read external bits |
| FILE *f) { |
| xcoords = (inT32 *) de_serialise_bytes (f, |
| (segments + 1) * sizeof (inT32)); |
| quadratics = (QUAD_COEFFS *) de_serialise_bytes (f, |
| segments * |
| sizeof (QUAD_COEFFS)); |
| } |
| |
| //assign copy |
| make_serialise (QSPLINE) QSPLINE & operator= ( |
| const QSPLINE & source); //from this |
| |
| private: |
| |
| inT32 spline_index( //binary search |
| double x) const; //for x |
| inT32 segments; //no of segments |
| inT32 *xcoords; //no of coords |
| QUAD_COEFFS *quadratics; //spline pieces |
| }; |
| #endif |