⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rect.h

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 H
字号:
/********************************************************************** * File:        rect.h  (Formerly box.h) * Description: Bounding box class definition. * Author:					Phil Cheatle * Created:					Wed Oct 16 15:18:45 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           RECT_H#define           RECT_H#include          <math.h>#include          "points.h"#include          "ndminx.h"#include          "grphics.h"#include          "tprintf.h"class DLLSYM BOX                 //bounding box{  public:    BOX ():                      //empty constructor    bot_left (MAX_INT16, MAX_INT16), top_right (-MAX_INT16, -MAX_INT16) {    }                            //null box    BOX(                    //constructor        const ICOORD pt1,   //one corner        const ICOORD pt2);  //the other corner    BOX(  //box around FCOORD        const FCOORD pt);    BOOL8 null_box() const {  //Is box null      return ((left () > right ()) || (top () < bottom ()));    }    INT16 top() const {  // coord of top      return top_right.y ();    }    INT16 bottom() const {  // coord of bottom      return bot_left.y ();    }    INT16 left() const {  // coord of left      return bot_left.x ();    }    INT16 right() const {  // coord of right      return top_right.x ();    }                                 //access function    const ICOORD &botleft() const {      return bot_left;    }    ICOORD botright() const {  // ~ access function      return ICOORD (top_right.x (), bot_left.y ());    }    ICOORD topleft() const {  // ~ access function      return ICOORD (bot_left.x (), top_right.y ());    }                                 //access function    const ICOORD &topright() const {      return top_right;    }    INT16 height() const {  //how high is it?      if (!null_box ())        return top_right.y () - bot_left.y ();      else        return 0;    }    INT16 width() const {  //how high is it?      if (!null_box ())        return top_right.x () - bot_left.x ();      else        return 0;    }    INT32 area() const {  //what is the area?      if (!null_box ())        return width () * height ();      else        return 0;    }    void move_bottom_edge(                  // move one edge                          const INT16 y) {  // by +/- y      bot_left += ICOORD (0, y);    }    void move_left_edge(                  // move one edge                        const INT16 x) {  // by +/- x      bot_left += ICOORD (x, 0);    }    void move_right_edge(                  // move one edge                         const INT16 x) {  // by +/- x      top_right += ICOORD (x, 0);    }    void move_top_edge(                  // move one edge                       const INT16 y) {  // by +/- y      top_right += ICOORD (0, y);    }    void move(                     // move box              const ICOORD vec) {  // by vector      bot_left += vec;      top_right += vec;    }    void move(                     // move box              const FCOORD vec) {  // by float vector      bot_left.set_x ((INT16) floor (bot_left.x () + vec.x ()));      //round left      bot_left.set_y ((INT16) floor (bot_left.y () + vec.y ()));      //round down      top_right.set_x ((INT16) ceil (top_right.x () + vec.x ()));      //round right      top_right.set_y ((INT16) ceil (top_right.y () + vec.y ()));      //round up    }    void scale(                  // scale box               const float f) {  // by multiplier                                 //round left      bot_left.set_x ((INT16) floor (bot_left.x () * f));                                 //round down      bot_left.set_y ((INT16) floor (bot_left.y () * f));      top_right.set_x ((INT16) ceil (top_right.x () * f));      //round right      top_right.set_y ((INT16) ceil (top_right.y () * f));      //round up    }    void scale(                     // scale box               const FCOORD vec) {  // by float vector      bot_left.set_x ((INT16) floor (bot_left.x () * vec.x ()));      bot_left.set_y ((INT16) floor (bot_left.y () * vec.y ()));      top_right.set_x ((INT16) ceil (top_right.x () * vec.x ()));      top_right.set_y ((INT16) ceil (top_right.y () * vec.y ()));    }    void rotate(                     //rotate coords                const FCOORD vec) {  //by vector      bot_left.rotate (vec);      top_right.rotate (vec);      *this = BOX (bot_left, top_right);    }    BOOL8 contains(  //is pt inside box                   const FCOORD pt) const;    BOOL8 contains(  //is box inside box                   const BOX &box) const;    BOOL8 overlap(  //do boxes overlap                  const BOX &box) const;    BOOL8 major_overlap(  // Do boxes overlap more than half.                        const BOX &box) const;    BOX intersection(  //shared area box                     const BOX &box) const;    BOX bounding_union(  //box enclosing both                       const BOX &box) const;    void print() {  //print      tprintf ("Bounding box=(%d,%d)->(%d,%d)\n",        left (), bottom (), right (), top ());    }#ifndef GRAPHICS_DISABLED    void plot(                    //use current settings              WINDOW fd) const {  //where to paint      rectangle (fd, bot_left.x (), bot_left.y (), top_right.x (),        top_right.y ());    }    void plot(                              //paint box              WINDOW fd,                    //where to paint              INT16 style,                  //display style              INT16 edged,                  //show border?              COLOUR fill_colour,           //colour for inside              COLOUR border_colour) const;  //colour for border#endif    friend DLLSYM BOX & operator+= (BOX &, const BOX &);    //in place union    friend DLLSYM BOX & operator-= (BOX &, const BOX &);    //in place intrsection    void serialise_asc(  //convert to ascii                       FILE *f);    void de_serialise_asc(  //convert from ascii                          FILE *f);  private:    ICOORD bot_left;             //bottom left corner    ICOORD top_right;            //top right corner};/********************************************************************** * BOX::BOX()  Constructor from 1 FCOORD * **********************************************************************/inline BOX::BOX(                 //construtor                const FCOORD pt  //floating centre               ) {  bot_left = ICOORD ((INT16) floor (pt.x ()), (INT16) floor (pt.y ()));  top_right = ICOORD ((INT16) ceil (pt.x ()), (INT16) ceil (pt.y ()));}/********************************************************************** * BOX::contains()  Is point within box * **********************************************************************/inline BOOL8 BOX::contains(const FCOORD pt) const {  return ((pt.x () >= bot_left.x ()) &&    (pt.x () <= top_right.x ()) &&    (pt.y () >= bot_left.y ()) && (pt.y () <= top_right.y ()));}/********************************************************************** * BOX::contains()  Is box within box * **********************************************************************/inline BOOL8 BOX::contains(const BOX &box) const {  return (contains (box.bot_left) && contains (box.top_right));}/********************************************************************** * BOX::overlap()  Do two boxes overlap? * **********************************************************************/inline BOOL8 BOX::overlap(  //do boxes overlap                          const BOX &box) const {  return ((box.bot_left.x () <= top_right.x ()) &&    (box.top_right.x () >= bot_left.x ()) &&    (box.bot_left.y () <= top_right.y ()) &&    (box.top_right.y () >= bot_left.y ()));}/********************************************************************** * BOX::major_overlap()  Do two boxes overlap by at least half of the smallest? * **********************************************************************/inline BOOL8 BOX::major_overlap(  // Do boxes overlap more that half.                                const BOX &box) const {  int overlap = MIN(box.top_right.x(), top_right.x());  overlap -= MAX(box.bot_left.x(), bot_left.x());  overlap += overlap;  if (overlap < MIN(box.width(), width()))    return false;  overlap = MIN(box.top_right.y(), top_right.y());  overlap -= MAX(box.bot_left.y(), bot_left.y());  overlap += overlap;  if (overlap < MIN(box.height(), height()))    return false;  return true;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -