| /********************************************************************** |
| * File: linlsq.h (Formerly llsq.h) |
| * Description: Linear Least squares fitting code. |
| * Author: Ray Smith |
| * Created: Thu Sep 12 08:44:51 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 LINLSQ_H |
| #define LINLSQ_H |
| |
| #include "points.h" |
| #include "mod128.h" |
| #include "varable.h" |
| |
| class LLSQ |
| { |
| friend class PDLSQ; //pos & direction |
| |
| public: |
| LLSQ() { //constructor |
| clear(); //set to zeros |
| } |
| void clear(); //initialize |
| |
| void add( //add element |
| double x, //coords to add |
| double y); |
| void remove( //delete element |
| double x, //coords to delete |
| double y); |
| inT32 count() { //no of elements |
| return n; |
| } |
| |
| double m(); //get gradient |
| double c( //get constant |
| double m); //gradient |
| double rms( //get error |
| double m, //gradient |
| double c); //constant |
| double spearman(); //get error |
| |
| private: |
| inT32 n; //no of elements |
| double sigx; //sum of x |
| double sigy; //sum of y |
| double sigxx; //sum x squared |
| double sigxy; //sum of xy |
| double sigyy; //sum y squared |
| }; |
| |
| class PDLSQ |
| { |
| public: |
| PDLSQ() { //constructor |
| clear(); //set to zeros |
| } |
| void clear() { //initialize |
| pos.clear (); //clear both |
| dir.clear (); |
| } |
| |
| void add( //add element |
| const ICOORD &addpos, //position of pt |
| const ICOORD &adddir) { //dir of pt |
| pos.add (addpos.x (), addpos.y ()); |
| dir.add (adddir.x (), adddir.y ()); |
| } |
| void remove( //remove element |
| const ICOORD &removepos, //position of pt |
| const ICOORD &removedir) { //dir of pt |
| pos.remove (removepos.x (), removepos.y ()); |
| dir.remove (removedir.x (), removedir.y ()); |
| } |
| inT32 count() { //no of elements |
| return pos.count (); |
| } |
| |
| float fit( //get fit parameters |
| DIR128 &ang, //output angle |
| float &sin_ang, //output components |
| float &cos_ang, |
| float &r); |
| |
| private: |
| LLSQ pos; //position |
| LLSQ dir; //directions |
| }; |
| extern double_VAR_H (pdlsq_posdir_ratio, 0.4e-6, "Mult of dir to cf pos"); |
| #endif |