File: RotatedRectTest.swift

package info (click to toggle)
opencv 4.10.0%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 282,092 kB
  • sloc: cpp: 1,178,079; xml: 682,621; python: 49,092; lisp: 31,150; java: 25,469; ansic: 11,039; javascript: 6,085; sh: 1,214; cs: 601; perl: 494; objc: 210; makefile: 173
file content (174 lines) | stat: -rw-r--r-- 6,668 bytes parent folder | download | duplicates (3)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
//
//  RotatedRectTest.swift
//
//  Created by Giles Payne on 2020/01/31.
//

import XCTest
import OpenCV

class RotatedRectTest: OpenCVTestCase {

    let angle: Double = 40
    let center = Point2f(x: Float(OpenCVTestCase.matSize / 2), y: Float(OpenCVTestCase.matSize / 2))
    let size = Size2f(width: Float(OpenCVTestCase.matSize / 4), height: Float(OpenCVTestCase.matSize / 2))

    func testBoundingRect() {
        let size = Size2f(width: Float(OpenCVTestCase.matSize / 2), height: Float(OpenCVTestCase.matSize / 2));
        XCTAssertEqual(size.height, size.width);
        let length = size.height;

        let angle: Double = 45
        let rr = RotatedRect(center: center, size: size, angle: angle)

        let r = rr.boundingRect()
        let halfDiagonal = length * sqrt(2) / 2

        XCTAssert(Float(r.x) == floor(center.x - halfDiagonal) && Float(r.y) == floor(center.y - halfDiagonal))

        XCTAssert((r.br().x >= ceil(center.x + halfDiagonal)) && (r.br().y >= ceil(center.y + halfDiagonal)))

        XCTAssert((r.br().x - ceil(center.x + halfDiagonal)) <= 1 && (r.br().y - ceil(center.y + halfDiagonal)) <= 1)
    }

    func testClone() {
        let rrect = RotatedRect(center: center, size: size, angle: angle)
        let clone = rrect.clone();

        XCTAssertNotNil(clone)
        XCTAssert(rrect.center == clone.center)
        XCTAssert(rrect.size == clone.size)
        XCTAssert(rrect.angle == clone.angle)
    }

    func testEqualsObject() {
        let center2 = Point2f(x: Float(OpenCVTestCase.matSize / 3), y: Float(OpenCVTestCase.matSize) / 1.5)
        let size2 = Size2f(width: Float(OpenCVTestCase.matSize / 2), height: Float(OpenCVTestCase.matSize / 4))
        let angle2:Double = 0

        let rrect1 = RotatedRect(center: center, size: size, angle: angle)
        let rrect2 = RotatedRect(center: center2, size: size2, angle: angle2)
        let rrect3 = rrect1
        let clone1 = rrect1.clone()
        let clone2 = rrect2.clone()

        XCTAssert(rrect1 == rrect3)
        XCTAssertFalse(rrect1 == rrect2)

        XCTAssert(rrect2 == clone2)
        clone2.angle = 10
        XCTAssertFalse(rrect2 == clone2)

        XCTAssert(rrect1 == clone1)

        clone1.center.x += 1
        XCTAssertFalse(rrect1 == clone1)

        clone1.center.x -= 1
        XCTAssert(rrect1 == clone1)

        clone1.size.width += 1
        XCTAssertFalse(rrect1 == clone1)

        XCTAssertFalse(rrect1 == size)
    }

    func testHashCode() {
        let rr = RotatedRect(center: center, size: size, angle: angle)
        XCTAssertEqual(rr.hash(), rr.hash())
    }

    func testPoints() {
        let rrect = RotatedRect(center: center, size: size, angle: angle);

        let p = rrect.points()

        let is_p0_irrational = (100 * p[0].x != round(100 * p[0].x)) && (100 * p[0].y != round(100 * p[0].y))
        let is_p1_irrational = (100 * p[1].x != round(100 * p[1].x)) && (100 * p[1].y != round(100 * p[1].y));
        let is_p2_irrational = (100 * p[2].x != round(100 * p[2].x)) && (100 * p[2].y != round(100 * p[2].y));
        let is_p3_irrational = (100 * p[3].x != round(100 * p[3].x)) && (100 * p[3].y != round(100 * p[3].y));

        XCTAssert(is_p0_irrational && is_p1_irrational && is_p2_irrational && is_p3_irrational)

        XCTAssert(abs((p[0].x + p[2].x) / 2 - center.x) + abs((p[0].y + p[2].y) / 2 - center.y) < OpenCVTestCase.FEPS, "Symmetric points 0 and 2")

        XCTAssert(abs((p[1].x + p[3].x) / 2 - center.x) + abs((p[1].y + p[3].y) / 2 - center.y) < OpenCVTestCase.FEPS, "Symmetric points 1 and 3")

        XCTAssert(abs((p[1].x - p[0].x) * (p[2].x - p[1].x) +
            (p[1].y - p[0].y) * (p[2].y - p[1].y)) < OpenCVTestCase.FEPS, "Orthogonal vectors 01 and 12")

        XCTAssert(abs((p[2].x - p[1].x) * (p[3].x - p[2].x) +
            (p[2].y - p[1].y) * (p[3].y - p[2].y)) < OpenCVTestCase.FEPS, "Orthogonal vectors 12 and 23");

        XCTAssert(abs((p[3].x - p[2].x) * (p[0].x - p[3].x) +
            (p[3].y - p[2].y) * (p[0].y - p[3].y)) < OpenCVTestCase.FEPS, "Orthogonal vectors 23 and 30")

        XCTAssert(abs((p[0].x - p[3].x) * (p[1].x - p[0].x) +
            (p[0].y - p[3].y) * (p[1].y - p[0].y)) < OpenCVTestCase.FEPS, "Orthogonal vectors 30 and 01")

        XCTAssert(abs((p[1].x - p[0].x) * (p[1].x - p[0].x) +
            (p[1].y - p[0].y) * (p[1].y - p[0].y) - size.height * size.height) < OpenCVTestCase.FEPS, "Length of the vector 01")

        XCTAssert(abs((p[1].x - p[2].x) * (p[1].x - p[2].x) +
            (p[1].y - p[2].y) * (p[1].y - p[2].y) - size.width * size.width) < OpenCVTestCase.FEPS, "Length of the vector 21")

        XCTAssert(abs((p[2].x - p[1].x) / size.width - Float(cos(angle * Double.pi / 180))) < OpenCVTestCase.FEPS, "Angle of the vector 21 with the axes");
    }

    func testRotatedRect() {
        let rr = RotatedRect()

        XCTAssertNotNil(rr)
        XCTAssertNotNil(rr.center)
        XCTAssertNotNil(rr.size)
        XCTAssertEqual(0.0, rr.angle)
    }

    func testRotatedRectDoubleArray() {
        let vals = [1.5, 2.6, 3.7, 4.2, 5.1]
        let rr = RotatedRect(vals: vals as [NSNumber])

        XCTAssertNotNil(rr)
        XCTAssertEqual(1.5, rr.center.x)
        XCTAssertEqual(2.6, rr.center.y)
        XCTAssertEqual(3.7, rr.size.width)
        XCTAssertEqual(4.2, rr.size.height)
        XCTAssertEqual(5.1, rr.angle)
    }

    func testRotatedRectPointSizeDouble() {
        let rr = RotatedRect(center: center, size: size, angle: 40);

        XCTAssertNotNil(rr)
        XCTAssertNotNil(rr.center)
        XCTAssertNotNil(rr.size)
        XCTAssertEqual(40.0, rr.angle);
    }

    func testSet() {
        let vals1: [Double] = []
        let r1 = RotatedRect(center: center, size: size, angle: 40);

        r1.set(vals: vals1 as [NSNumber])

        XCTAssertEqual(0, r1.angle)
        assertPoint2fEquals(Point2f(x: 0, y: 0), r1.center, OpenCVTestCase.FEPS)
        assertSize2fEquals(Size2f(width: 0, height: 0), r1.size, OpenCVTestCase.FEPS)

        let vals2 = [1, 2, 3, 4, 5]
        let r2 = RotatedRect(center: center, size: size, angle: 40)

        r2.set(vals: vals2 as [NSNumber])

        XCTAssertEqual(5, r2.angle)
        assertPoint2fEquals(Point2f(x: 1, y: 2), r2.center, OpenCVTestCase.FEPS)
        assertSize2fEquals(Size2f(width: 3, height: 4), r2.size, OpenCVTestCase.FEPS)
    }

    func testToString() {
        let actual = "\(RotatedRect(center: Point2f(x:1, y:2), size: Size2f(width:10, height:12), angle:4.5))"
        let expected = "RotatedRect {Point2f {1.000000,2.000000},Size2f {10.000000,12.000000},4.500000}"
        XCTAssertEqual(expected, actual);
    }

}