File: rect.h

package info (click to toggle)
kig 4%3A25.08.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,716 kB
  • sloc: cpp: 41,465; xml: 851; python: 486; perl: 23; sh: 17; makefile: 3
file content (142 lines) | stat: -rw-r--r-- 3,602 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
    This file is part of Kig, a KDE program for Interactive Geometry.
    SPDX-FileCopyrightText: 2002 Dominique Devriese <devriese@kde.org>

    SPDX-License-Identifier: GPL-2.0-or-later
*/

#pragma once

#include "coordinate.h"

#include <QDebug>
#include <QRect>

/**
 * like Coordinate is a QPoint replacement with doubles, this is a
 * QRect replacement with doubles...
 */
class Rect
{
public:
    /**
     * constructors...
     */
    Rect(const Coordinate &bottomLeft, const Coordinate &topRight);
    Rect(const Coordinate &bottomLeft, const double width, const double height);
    Rect(double xa, double ya, double width, double height);
    Rect(const Rect &r);
    Rect();
    static Rect invalidRect();

    bool valid();

    void setBottomLeft(const Coordinate &p);
    void setTopLeft(const Coordinate &p);
    void setTopRight(const Coordinate &p);
    void setBottomRight(const Coordinate &p);
    void setCenter(const Coordinate &p);
    void setLeft(const double p);
    void setRight(const double p);
    void setTop(const double p);
    void setBottom(const double p);
    void setWidth(const double w);
    void setHeight(const double h);
    /**
     * this makes sure width and height are > 0 ...
     */
    void normalize();
    /**
     * this makes sure p is in the rect, extending it if necessary...
     */
    void setContains(const Coordinate &p);
    /**
     * Assignment operator.
     */
    Rect &operator=(const Rect &other);
    /**
     * moves the rect while keeping the size constant...
     */
    void moveBy(const Coordinate &p);
    /**
     * synonym for moveBy...
     */
    Rect &operator+=(const Coordinate &p)
    {
        moveBy(p);
        return *this;
    }
    /**
     * scale: only the size changes, topLeft is kept where it is...
     */
    void scale(const double r);
    /**
     * synonym for scale...
     */
    Rect &operator*=(const double r)
    {
        scale(r);
        return *this;
    }
    Rect &operator/=(const double r)
    {
        scale(1 / r);
        return *this;
    }

    /**
     * This expands the rect so that it contains r.  It has friends
     * '|=' and '|' below...
     */
    void eat(const Rect &r);

    /**
     * synonym for eat.
     */
    Rect &operator|=(const Rect &rhs)
    {
        eat(rhs);
        return *this;
    }

    /**
     * return a rect which is a copy of this rect, but has an aspect
     * ratio equal to rhs's one. If \p shrink is true, the rect will be
     * shrunk, otherwise extended. The center of the new rect is the
     * same as this rect's center.
     */
    Rect matchShape(const Rect &rhs, bool shrink = false) const;

    QRect toQRect() const;
    Coordinate bottomLeft() const;
    Coordinate bottomRight() const;
    Coordinate topLeft() const;
    Coordinate topRight() const;
    Coordinate center() const;
    double left() const;
    double right() const;
    double bottom() const;
    double top() const;
    double width() const;
    double height() const;
    bool contains(const Coordinate &p) const;
    bool contains(const Coordinate &p, double allowed_miss) const;
    bool intersects(const Rect &p) const;
    Rect normalized() const;
    friend QDebug &operator<<(QDebug &s, const Rect &t);

    static Rect fromQRect(const QRect &);

protected:
    Coordinate mBottomLeft;
    double mwidth;
    double mheight;
};

bool operator==(const Rect &r, const Rect &s);
QDebug &operator<<(QDebug &s, const Rect &t);
/**
 * this operator returns a Rect that contains both the given
 * rects.
 */
Rect operator|(const Rect &lhs, const Rect &rhs);