/* * GraphApp - Cross-Platform Graphics Programming Library. * * File: arith.c -- point and rectangle arithmetic. * Platform: Neutral Version: 2.40 Date: 1998/05/05 * * Version: 1.00 Changes: Original version by Lachlan Patrick. * Version: 1.04 Changes: Put the rcanon function back in. * Version: 1.50 Changes: Change to rect structure & functions. * Version: 2.40 Changes: Fix for rinr and clipr by Angus North. */ /* Copyright (C) 1993-1998 Lachlan Patrick This file is part of GraphApp, a cross-platform C graphics library. GraphApp is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License. GraphApp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. See the file COPYLIB.TXT for details. */ #include "graphapp.h" point newpoint(int x, int y) { point p; p.x = x; p.y = y; return p; } rect newrect(int x, int y, int width, int height) { rect r; r.x = x; r.y = y; r.width = width; r.height = height; return r; } rect rpt(point min, point max) { rect r; r.x = min.x; r.y = min.y; r.width = max.x - min.x; r.height = max.y - min.y; return r; } point topleft(rect r) { point p; p.x = r.x; p.y = r.y; return p; } point topright(rect r) { point p; p.x = r.x + r.width - 1; p.y = r.y; return p; } point bottomright(rect r) { point p; p.x = r.x + r.width - 1; p.y = r.y + r.height - 1; return p; } point bottomleft(rect r) { point p; p.x = r.x; p.y = r.y + r.height - 1; return p; } point addpt(point p1, point p2) { p1.x += p2.x; p1.y += p2.y; return p1; } point subpt(point p1, point p2) { p1.x -= p2.x; p1.y -= p2.y; return p1; } point midpt(point p1, point p2) { point p; p.x = (p1.x + p2.x)/2; p.y = (p1.y + p2.y)/2; return p; } point mulpt(point p, int i) { p.x *= i; p.y *= i; return p; } point divpt(point p, int i) { p.x /= i; p.y /= i; return p; } rect rmove(rect r, point p) { r.x = p.x; r.y = p.y; return r; } rect raddpt(rect r, point p) { r.x += p.x; r.y += p.y; return r; } rect rsubpt(rect r, point p) { r.x -= p.x; r.y -= p.y; return r; } rect rmul(rect r, int i) { if (i != 1) { r.x *= i; r.y *= i; r.width *= i; r.height *= i; } return r; } rect rdiv(rect r, int i) { if (i != 1) { r.x /= i; r.y /= i; r.width /= i; r.height /= i; } return r; } rect growr(rect r, int w, int h) { r.x -= w; r.y -= h; r.width += 2*w; r.height += 2*h; return r; } rect insetr(rect r, int i) { r.x += i; r.y += i; r.width -= 2*i; r.height -= 2*i; return r; } rect rcenter(rect r1, rect r2) /* center r1 on r2 */ { rect r; r.x = r2.x + (r2.width-r1.width)/2; r.y = r2.y + (r2.height-r1.height)/2; r.width = r1.width; r.height = r1.height; return r; } int ptinr(point p, rect r) { if ((p.x>=r.x) && (p.x=r.y) && (p.y=r2.x) && (r1.y>=r2.y) && (r1.x+r1.width<=r2.x+r2.width) && (r1.y+r1.height<=r2.y+r2.height)) return 1; else return 0; } int rxr(rect r1, rect r2) { if ((r1.x r2.x + r2.width) r1.width = r2.x + r2.width - r1.x; if (r1.y + r1.height > r2.y + r2.height) r1.height = r2.y + r2.height - r1.y; return r1; /* they do overlap */ } rect rcanon(rect r) { if (r.width < 0) { r.x += r.width; r.width = -r.width; } if (r.height < 0) { r.y += r.height; r.height = -r.height; } return r; }