Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
bb27f2be
Commit
bb27f2be
authored
Nov 09, 2017
by
DonLakeFlyer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix survey generation with respect to bounding rect
parent
48375968
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
64 deletions
+49
-64
SurveyMissionItem.cc
src/MissionManager/SurveyMissionItem.cc
+49
-64
No files found.
src/MissionManager/SurveyMissionItem.cc
View file @
bb27f2be
...
...
@@ -957,19 +957,9 @@ int SurveyMissionItem::_gridGenerator(const QList<QPointF>& polygonPoints, QLis
polygon
<<
polygonPoints
[
i
];
}
polygon
<<
polygonPoints
[
0
];
QRectF
smallBoundRect
=
polygon
.
boundingRect
();
QPointF
boundingCenter
=
smallBoundRect
.
center
();
qCDebug
(
SurveyMissionItemLog
)
<<
"Bounding rect"
<<
smallBoundRect
.
topLeft
().
x
()
<<
smallBoundRect
.
topLeft
().
y
()
<<
smallBoundRect
.
bottomRight
().
x
()
<<
smallBoundRect
.
bottomRight
().
y
();
// Rotate the bounding rect around it's center to generate the larger bounding rect
QPolygonF
boundPolygon
;
boundPolygon
<<
_rotatePoint
(
smallBoundRect
.
topLeft
(),
boundingCenter
,
gridAngle
);
boundPolygon
<<
_rotatePoint
(
smallBoundRect
.
topRight
(),
boundingCenter
,
gridAngle
);
boundPolygon
<<
_rotatePoint
(
smallBoundRect
.
bottomRight
(),
boundingCenter
,
gridAngle
);
boundPolygon
<<
_rotatePoint
(
smallBoundRect
.
bottomLeft
(),
boundingCenter
,
gridAngle
);
boundPolygon
<<
boundPolygon
[
0
];
QRectF
largeBoundRect
=
boundPolygon
.
boundingRect
();
qCDebug
(
SurveyMissionItemLog
)
<<
"Rotated bounding rect"
<<
largeBoundRect
.
topLeft
().
x
()
<<
largeBoundRect
.
topLeft
().
y
()
<<
largeBoundRect
.
bottomRight
().
x
()
<<
largeBoundRect
.
bottomRight
().
y
();
QRectF
boundingRect
=
polygon
.
boundingRect
();
QPointF
boundingCenter
=
boundingRect
.
center
();
qCDebug
(
SurveyMissionItemLog
)
<<
"Bounding rect"
<<
boundingRect
.
topLeft
().
x
()
<<
boundingRect
.
topLeft
().
y
()
<<
boundingRect
.
bottomRight
().
x
()
<<
boundingRect
.
bottomRight
().
y
();
// Create set of rotated parallel lines within the expanded bounding rect. Make the lines larger than the
// bounding box to guarantee intersection.
...
...
@@ -978,65 +968,60 @@ int SurveyMissionItem::_gridGenerator(const QList<QPointF>& polygonPoints, QLis
bool
northSouthTransects
=
_gridAngleIsNorthSouthTransects
();
int
entryLocation
=
_gridEntryLocationFact
.
rawValue
().
toInt
();
if
(
northSouthTransects
)
{
qCDebug
(
SurveyMissionItemLog
)
<<
"Clamped grid angle"
<<
gridAngle
;
if
(
entryLocation
==
EntryLocationTopLeft
||
entryLocation
==
EntryLocationBottomLeft
)
{
// Generate transects from left to right
qCDebug
(
SurveyMissionItemLog
)
<<
"Generate left to right"
;
float
x
=
largeBoundRect
.
topLeft
().
x
()
-
(
gridSpacing
/
2
);
while
(
x
<
largeBoundRect
.
bottomRight
().
x
())
{
float
yTop
=
largeBoundRect
.
topLeft
().
y
()
-
10000.0
;
float
yBottom
=
largeBoundRect
.
bottomRight
().
y
()
+
10000.0
;
// Transects are generated to be as long as the largest width/height of the bounding rect plus some fudge factor.
// This way they will always be guaranteed to intersect with a polyong edge no matter what angle they are rotated to.
// They are initially generated with the transects flowing from west to east and then points within the transect north to south.
double
maxWidth
=
qMax
(
boundingRect
.
width
(),
boundingRect
.
height
())
+
100.0
;
double
halfWidth
=
maxWidth
/
2.0
;
double
transectX
=
boundingCenter
.
x
()
-
halfWidth
;
double
transectXMax
=
transectX
+
maxWidth
;
while
(
transectX
<
transectXMax
)
{
double
transectYTop
=
boundingCenter
.
y
()
-
halfWidth
;
double
transectYBottom
=
boundingCenter
.
y
()
+
halfWidth
;
lineList
+=
QLineF
(
_rotatePoint
(
QPointF
(
x
,
yTop
),
boundingCenter
,
gridAngle
),
_rotatePoint
(
QPointF
(
x
,
yBottom
),
boundingCenter
,
gridAngle
));
qCDebug
(
SurveyMissionItemLog
)
<<
"line("
<<
lineList
.
last
().
x1
()
<<
", "
<<
lineList
.
last
().
y1
()
<<
")-("
<<
lineList
.
last
().
x2
()
<<
", "
<<
lineList
.
last
().
y2
()
<<
")"
;
lineList
+=
QLineF
(
_rotatePoint
(
QPointF
(
transectX
,
transectYTop
),
boundingCenter
,
gridAngle
),
_rotatePoint
(
QPointF
(
transectX
,
transectYBottom
),
boundingCenter
,
gridAngle
));
transectX
+=
gridSpacing
;
}
x
+=
gridSpacing
;
}
// Adjust the transects and points within transect according to the entry location
bool
reversePoints
=
false
;
bool
reverseTransects
=
false
;
if
(
northSouthTransects
)
{
// Transects start north and end south
// Internal transects points are generated north to south so they are correct
if
(
entryLocation
==
EntryLocationTopLeft
||
entryLocation
==
EntryLocationBottomLeft
)
{
// Transects lines start west and end east
// Nothing to do in this case since this is how they were initially generated
}
else
{
// Generate transects from right to left
qCDebug
(
SurveyMissionItemLog
)
<<
"Generate right to left"
;
float
x
=
largeBoundRect
.
topRight
().
x
()
+
(
gridSpacing
/
2
);
while
(
x
>
largeBoundRect
.
bottomLeft
().
x
())
{
float
yTop
=
largeBoundRect
.
topRight
().
y
()
-
10000.0
;
float
yBottom
=
largeBoundRect
.
bottomLeft
().
y
()
+
10000.0
;
lineList
+=
QLineF
(
_rotatePoint
(
QPointF
(
x
,
yTop
),
boundingCenter
,
gridAngle
),
_rotatePoint
(
QPointF
(
x
,
yBottom
),
boundingCenter
,
gridAngle
));
qCDebug
(
SurveyMissionItemLog
)
<<
"line("
<<
lineList
.
last
().
x1
()
<<
", "
<<
lineList
.
last
().
y1
()
<<
")-("
<<
lineList
.
last
().
x2
()
<<
", "
<<
lineList
.
last
().
y2
()
<<
")"
;
x
-=
gridSpacing
;
}
// Transects start east and end west
// Need to reverse order of transects
reverseTransects
=
true
;
}
}
else
{
gridAngle
=
_clampGridAngle90
(
gridAngle
-
90.0
);
qCDebug
(
SurveyMissionItemLog
)
<<
"Clamped grid angle"
<<
gridAngle
;
if
(
entryLocation
==
EntryLocationTopLeft
||
entryLocation
==
EntryLocationTopRight
)
{
// Generate transects from top to bottom
qCDebug
(
SurveyMissionItemLog
)
<<
"Generate top to bottom"
;
float
y
=
largeBoundRect
.
bottomLeft
().
y
()
+
(
gridSpacing
/
2
);
while
(
y
>
largeBoundRect
.
topRight
().
y
())
{
float
xLeft
=
largeBoundRect
.
bottomLeft
().
x
()
-
10000.0
;
float
xRight
=
largeBoundRect
.
topRight
().
x
()
+
10000.0
;
lineList
+=
QLineF
(
_rotatePoint
(
QPointF
(
xLeft
,
y
),
boundingCenter
,
gridAngle
),
_rotatePoint
(
QPointF
(
xRight
,
y
),
boundingCenter
,
gridAngle
));
qCDebug
(
SurveyMissionItemLog
)
<<
"y:xLeft:xRight"
<<
y
<<
xLeft
<<
xRight
<<
"line("
<<
lineList
.
last
().
x1
()
<<
", "
<<
lineList
.
last
().
y1
()
<<
")-("
<<
lineList
.
last
().
x2
()
<<
", "
<<
lineList
.
last
().
y2
()
<<
")"
;
y
-=
gridSpacing
;
}
// Transects start south and end north
// Need to reverse transects
reverseTransects
=
true
;
if
(
entryLocation
==
EntryLocationTopLeft
||
entryLocation
==
EntryLocationBottomLeft
)
{
// Transects start west and end east
// Nothing to do in this case since this is how they were initially generated
}
else
{
// Generate transects from bottom to top
qCDebug
(
SurveyMissionItemLog
)
<<
"Generate bottom to top"
;
float
y
=
largeBoundRect
.
topLeft
().
y
()
-
(
gridSpacing
/
2
);
while
(
y
<
largeBoundRect
.
bottomRight
().
y
())
{
float
xLeft
=
largeBoundRect
.
topLeft
().
x
()
-
10000.0
;
float
xRight
=
largeBoundRect
.
bottomRight
().
x
()
+
10000.0
;
lineList
+=
QLineF
(
_rotatePoint
(
QPointF
(
xLeft
,
y
),
boundingCenter
,
gridAngle
),
_rotatePoint
(
QPointF
(
xRight
,
y
),
boundingCenter
,
gridAngle
));
qCDebug
(
SurveyMissionItemLog
)
<<
"y:xLeft:xRight"
<<
y
<<
xLeft
<<
xRight
<<
"line("
<<
lineList
.
last
().
x1
()
<<
", "
<<
lineList
.
last
().
y1
()
<<
")-("
<<
lineList
.
last
().
x2
()
<<
", "
<<
lineList
.
last
().
y2
()
<<
")"
;
// Transects start east and end west
// Need to reverse order of transects
reverseTransects
=
true
;
}
}
y
+=
gridSpacing
;
}
if
(
reversePoints
)
{
for
(
int
i
=
0
;
i
<
lineList
.
count
();
i
++
)
{
lineList
[
i
]
=
QLineF
(
lineList
[
i
].
p2
(),
lineList
[
i
].
p1
());
}
}
if
(
reverseTransects
)
{
QList
<
QLineF
>
newLineList
;
for
(
int
i
=
0
;
i
<
lineList
.
count
();
i
++
)
{
newLineList
.
prepend
(
lineList
[
i
]);
}
lineList
=
newLineList
;
}
// Now intersect the lines with the polygon
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment