| /********************************************************************** |
| * File: rect.c (Formerly box.c) |
| * 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. |
| * |
| **********************************************************************/ |
| |
| #include "mfcpch.h" //precompiled headers |
| #include "rect.h" |
| |
| /********************************************************************** |
| * TBOX::TBOX() Constructor from 2 ICOORDS |
| * |
| **********************************************************************/ |
| |
| TBOX::TBOX( //construtor |
| const ICOORD pt1, //one corner |
| const ICOORD pt2 //the other corner |
| ) { |
| if (pt1.x () <= pt2.x ()) { |
| if (pt1.y () <= pt2.y ()) { |
| bot_left = pt1; |
| top_right = pt2; |
| } |
| else { |
| bot_left = ICOORD (pt1.x (), pt2.y ()); |
| top_right = ICOORD (pt2.x (), pt1.y ()); |
| } |
| } |
| else { |
| if (pt1.y () <= pt2.y ()) { |
| bot_left = ICOORD (pt2.x (), pt1.y ()); |
| top_right = ICOORD (pt1.x (), pt2.y ()); |
| } |
| else { |
| bot_left = pt2; |
| top_right = pt1; |
| } |
| } |
| } |
| |
| |
| /********************************************************************** |
| * TBOX::intersection() Build the largest box contained in both boxes |
| * |
| **********************************************************************/ |
| |
| TBOX TBOX::intersection( //shared area box |
| const TBOX &box) const { |
| ICOORD bl; //bottom left |
| ICOORD tr; //top right |
| |
| if (overlap (box)) { |
| if (box.bot_left.x () > bot_left.x ()) |
| bl.set_x (box.bot_left.x ()); |
| else |
| bl.set_x (bot_left.x ()); |
| |
| if (box.top_right.x () < top_right.x ()) |
| tr.set_x (box.top_right.x ()); |
| else |
| tr.set_x (top_right.x ()); |
| |
| if (box.bot_left.y () > bot_left.y ()) |
| bl.set_y (box.bot_left.y ()); |
| else |
| bl.set_y (bot_left.y ()); |
| |
| if (box.top_right.y () < top_right.y ()) |
| tr.set_y (box.top_right.y ()); |
| else |
| tr.set_y (top_right.y ()); |
| } |
| else { |
| bl.set_x (MAX_INT16); |
| bl.set_y (MAX_INT16); |
| tr.set_x (-MAX_INT16); |
| tr.set_y (-MAX_INT16); |
| } |
| return TBOX (bl, tr); |
| } |
| |
| |
| /********************************************************************** |
| * TBOX::bounding_union() Build the smallest box containing both boxes |
| * |
| **********************************************************************/ |
| |
| TBOX TBOX::bounding_union( //box enclosing both |
| const TBOX &box) const { |
| ICOORD bl; //bottom left |
| ICOORD tr; //top right |
| |
| if (box.bot_left.x () < bot_left.x ()) |
| bl.set_x (box.bot_left.x ()); |
| else |
| bl.set_x (bot_left.x ()); |
| |
| if (box.top_right.x () > top_right.x ()) |
| tr.set_x (box.top_right.x ()); |
| else |
| tr.set_x (top_right.x ()); |
| |
| if (box.bot_left.y () < bot_left.y ()) |
| bl.set_y (box.bot_left.y ()); |
| else |
| bl.set_y (bot_left.y ()); |
| |
| if (box.top_right.y () > top_right.y ()) |
| tr.set_y (box.top_right.y ()); |
| else |
| tr.set_y (top_right.y ()); |
| return TBOX (bl, tr); |
| } |
| |
| |
| /********************************************************************** |
| * TBOX::plot() Paint a box using specified settings |
| * |
| **********************************************************************/ |
| |
| #ifndef GRAPHICS_DISABLED |
| void TBOX::plot( //paint box |
| ScrollView* fd, //where to paint |
| ScrollView::Color fill_colour, //colour for inside |
| ScrollView::Color border_colour //colour for border |
| ) const { |
| fd->Brush(fill_colour); |
| fd->Pen(border_colour); |
| plot(fd); |
| } |
| #endif |
| |
| |
| /********************************************************************** |
| * operator+= |
| * |
| * Extend one box to include the other (In place union) |
| **********************************************************************/ |
| |
| DLLSYM TBOX & |
| operator+= ( //bounding bounding bx |
| TBOX & op1, //operands |
| const TBOX & op2) { |
| if (op2.bot_left.x () < op1.bot_left.x ()) |
| op1.bot_left.set_x (op2.bot_left.x ()); |
| |
| if (op2.top_right.x () > op1.top_right.x ()) |
| op1.top_right.set_x (op2.top_right.x ()); |
| |
| if (op2.bot_left.y () < op1.bot_left.y ()) |
| op1.bot_left.set_y (op2.bot_left.y ()); |
| |
| if (op2.top_right.y () > op1.top_right.y ()) |
| op1.top_right.set_y (op2.top_right.y ()); |
| |
| return op1; |
| } |
| |
| |
| /********************************************************************** |
| * operator-= |
| * |
| * Reduce one box to intersection with the other (In place intersection) |
| **********************************************************************/ |
| |
| DLLSYM TBOX & |
| operator-= ( //inplace intersection |
| TBOX & op1, //operands |
| const TBOX & op2) { |
| if (op1.overlap (op2)) { |
| if (op2.bot_left.x () > op1.bot_left.x ()) |
| op1.bot_left.set_x (op2.bot_left.x ()); |
| |
| if (op2.top_right.x () < op1.top_right.x ()) |
| op1.top_right.set_x (op2.top_right.x ()); |
| |
| if (op2.bot_left.y () > op1.bot_left.y ()) |
| op1.bot_left.set_y (op2.bot_left.y ()); |
| |
| if (op2.top_right.y () < op1.top_right.y ()) |
| op1.top_right.set_y (op2.top_right.y ()); |
| } |
| else { |
| op1.bot_left.set_x (MAX_INT16); |
| op1.bot_left.set_y (MAX_INT16); |
| op1.top_right.set_x (-MAX_INT16); |
| op1.top_right.set_y (-MAX_INT16); |
| } |
| return op1; |
| } |
| |
| |
| /********************************************************************** |
| * TBOX::serialise_asc() Convert to ascii file. |
| * |
| **********************************************************************/ |
| |
| void TBOX::serialise_asc( //convert to ascii |
| FILE *f //file to use |
| ) { |
| bot_left.serialise_asc (f); |
| top_right.serialise_asc (f); |
| } |
| |
| |
| /********************************************************************** |
| * TBOX::de_serialise_asc() Convert from ascii file. |
| * |
| **********************************************************************/ |
| |
| void TBOX::de_serialise_asc( //convert from ascii |
| FILE *f //file to use |
| ) { |
| bot_left.de_serialise_asc (f); |
| top_right.de_serialise_asc (f); |
| } |