src/grid.cpp

Thu, 29 Mar 2018 12:09:06 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 29 Mar 2018 12:09:06 +0300
changeset 1362
9a5da3e469e2
parent 1184
393babf1319d
child 1192
317f4ce38f3f
child 1323
05b3e173c900
permissions
-rw-r--r--

Branch close

1023
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 /*
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 * LDForge: LDraw parts authoring CAD
1072
9ce9496427f2 Happy new year 2017!
Teemu Piippo <teemu@hecknology.net>
parents: 1026
diff changeset
3 * Copyright (C) 2013 - 2017 Teemu Piippo
1023
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 *
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 * This program is free software: you can redistribute it and/or modify
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 * the Free Software Foundation, either version 3 of the License, or
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 * (at your option) any later version.
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 *
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 * GNU General Public License for more details.
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 *
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 */
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 #include "grid.h"
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 #include "configuration.h"
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 Grid::Grid(QObject* parent) :
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 HierarchyElement(parent) {}
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 qreal Grid::coordinateSnap() const
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28 switch (m_config->grid())
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 default:
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 case Grid::Coarse: return m_config->gridCoarseCoordinateSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 case Grid::Medium: return m_config->gridMediumCoordinateSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 case Grid::Fine: return m_config->gridFineCoordinateSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 qreal Grid::angleSnap() const
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 switch (m_config->grid())
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 default:
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 case Grid::Coarse: return m_config->gridCoarseAngleSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 case Grid::Medium: return m_config->gridMediumAngleSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 case Grid::Fine: return m_config->gridFineAngleSnap();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 qreal Grid::angleAsRadians() const
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 {
1026
fb320996cce0 Rename Pi to lowercase pi
Teemu Piippo <crimsondusk64@gmail.com>
parents: 1023
diff changeset
52 return (pi * angleSnap()) / 180;
1023
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56 int Grid::bezierCurveSegments() const
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 switch (m_config->grid())
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59 {
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 default:
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 case Grid::Coarse: return m_config->gridCoarseBezierCurveSegments();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 case Grid::Medium: return m_config->gridMediumBezierCurveSegments();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 case Grid::Fine: return m_config->gridFineBezierCurveSegments();
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 }
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67
1180
2005e4147ad6 Grid::snap now snaps points.
Teemu Piippo <teemu@hecknology.net>
parents: 1179
diff changeset
68 QPointF Grid::snap(QPointF point) const
1023
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 {
1184
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
70 switch (type())
1182
813d020f92d4 Added polar grid snapping code.
Teemu Piippo <teemu@hecknology.net>
parents: 1181
diff changeset
71 {
1184
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
72 default:
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
73 case Cartesian:
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
74 {
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
75 // For each co-ordinate, extract the amount of grid steps the value is away from zero, round that to remove the remainder,
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
76 // and multiply back by the the grid size.
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
77 double size = coordinateSnap();
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
78 return {round(point.x() / size) * size, round(point.y() / size) * size};
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
79 }
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
80
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
81 case Polar:
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
82 {
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
83 qreal radius = hypot(point.x() - pole().x(), point.y() - -pole().y());
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
84 qreal azimuth = atan2(point.y() - -pole().y(), point.x() - pole().x());
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
85 double size = coordinateSnap();
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
86 double angleStep = 2 * pi / polarDivisions();
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
87 radius = round(radius / size) * size;
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
88 azimuth = round(azimuth / angleStep) * angleStep;
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
89 return {pole().x() + cos(azimuth) * radius, -pole().y() + sin(azimuth) * radius};
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
90 }
1182
813d020f92d4 Added polar grid snapping code.
Teemu Piippo <teemu@hecknology.net>
parents: 1181
diff changeset
91 }
1023
9450ac3cd930 Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 }
1181
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
93
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
94 /*
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
95 * Returns the pole of the grid, in ideal X/Y co-ordinates. Z is left up for the caller to decide.
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
96 */
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
97 QPointF Grid::pole() const
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
98 {
1184
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
99 return {0, 0};
1181
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
100 }
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
101
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
102 /*
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
103 * Returns the amount of divisions (slices) to be used in the polar grid.
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
104 */
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
105 int Grid::polarDivisions() const
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
106 {
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
107 switch (m_config->grid())
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
108 {
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
109 default:
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
110 case Coarse:
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
111 case Medium:
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
112 return LowResolution;
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
113
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
114 case Fine:
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
115 return HighResolution;
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
116 }
ca6d0ef9aadb Added polar grid rendering (which is disabled for now).
Teemu Piippo <teemu@hecknology.net>
parents: 1180
diff changeset
117 }
1184
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
118
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
119 /*
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
120 * Returns whether to use a cartesian or polar grid.
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
121 */
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
122 Grid::Type Grid::type() const
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
123 {
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
124 return m_config->polarGrid() ? Polar : Cartesian;
393babf1319d Polar grid is now togglable.
Teemu Piippo <teemu@hecknology.net>
parents: 1182
diff changeset
125 }

mercurial