Segment error detection

This commit is contained in:
2024-06-19 15:17:03 +02:00
parent f301f46f91
commit 627bec0324
3 changed files with 84 additions and 72 deletions

View File

@@ -12,7 +12,10 @@ class Segment2D:
self.end = end
self.points: List[Point2D] = []
self.points_thick: List[Point2D] = []
self.points_thick_by_line: List[Union[Point2D, int]] = []
self.points_thick_by_line: List[List[Point2D]] = []
self.gaps: List[List[Point2D]] = []
self.thickness = None
def __repr__(self):
@@ -58,7 +61,7 @@ class Segment2D:
delta_2x = 2*delta_x
delta_2y = 2*delta_y
self._add_points(start, _is_computing_thickness)
self._add_points(start, _is_computing_thickness, LINE_OVERLAP.NONE)
if (delta_x > delta_y):
error = delta_2y - delta_x
@@ -66,30 +69,34 @@ class Segment2D:
start.x += step_x
if (error >= 0):
if (overlap == LINE_OVERLAP.MAJOR):
self._add_points(start, _is_computing_thickness)
self._add_points(
start, _is_computing_thickness, overlap)
start.y += step_y
if (overlap == LINE_OVERLAP.MINOR):
self._add_points(
Point2D(start.copy().x - step_x, start.copy().y), _is_computing_thickness)
Point2D(start.copy().x - step_x, start.copy().y), _is_computing_thickness, overlap)
error -= delta_2x
error += delta_2y
self._add_points(start, _is_computing_thickness)
self._add_points(
start, _is_computing_thickness, LINE_OVERLAP.NONE)
else:
error = delta_2x - delta_y
while (start.y != end.y):
start.y += step_y
if (error >= 0):
if (overlap == LINE_OVERLAP.MAJOR):
self._add_points(start, _is_computing_thickness)
self._add_points(
start, _is_computing_thickness, overlap)
start.x += step_x
if (overlap == LINE_OVERLAP.MINOR):
self._add_points(
Point2D(start.copy().x, start.copy().y - step_y), _is_computing_thickness)
Point2D(start.copy().x, start.copy().y - step_y), _is_computing_thickness, overlap)
error -= delta_2y
error += delta_2x
self._add_points(start, _is_computing_thickness)
self._add_points(
start, _is_computing_thickness, LINE_OVERLAP.NONE)
if not _is_computing_thickness:
return self.points
@@ -110,6 +117,7 @@ class Segment2D:
>>> self.compute_thick_segment(self.start, self.end, self.thickness, self.thickness_mode)
"""
self.points_thick_by_line = [[] for _ in range(thickness+1)]
self.gaps = [[] for _ in range(thickness+1)]
start = self.start.copy()
end = self.end.copy()
@@ -243,10 +251,14 @@ class Segment2D:
np.round((self.start.y + self.end.y) / 2.0).astype(int),
)
def _add_points(self, points, is_computing_thickness):
def _add_points(self, points, is_computing_thickness, overlap):
if is_computing_thickness > 0:
self.points_thick.append(points.copy())
self.points_thick_by_line[is_computing_thickness].append(
(points.copy()))
if overlap == LINE_OVERLAP.NONE:
self.points_thick_by_line[is_computing_thickness].append(
(points.copy()))
else:
self.gaps[is_computing_thickness].append(
(points.copy()))
else:
self.points.append(points.copy())

View File

@@ -65,9 +65,10 @@ class Road:
# self.output_block.append(
# (Point3D.insert_3d([self.polyline.segments[i].points_thick[j]], 'y', [self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("stone")))
for k in range(len(self.polyline.segments[i].points_thick_by_line)):
match k:
kk = k % 7
match kk:
case 0:
blob = 'black_concrete'
blob = 'pink_concrete'
case 1:
blob = 'red_concrete'
case 2:
@@ -87,12 +88,17 @@ class Road:
self.output_block.append(
(Point3D.insert_3d([self.polyline.segments[i].points_thick_by_line[k][m]], 'y', [self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block(blob)))
for m in range(len(self.polyline.segments[i].gaps[k])):
nearest = self.polyline.segments[i].gaps[k][m].nearest(
Point3D.to_2d(self.polyline_total_line_output, removed_axis='y'), True)
self.output_block.append(
(Point3D.insert_3d([self.polyline.segments[i].gaps[k][m]], 'y', [self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("white_concrete")))
for i in range(1, len(self.polyline.centers)-1):
# Circle
circle = Circle(self.polyline.centers[i])
circle.circle_thick(int(
(self.polyline.radii[i]-self.width/2)), int((self.polyline.radii[i]+self.width/2)-1))
circle, gaps = Circle(self.polyline.centers[i]).circle_thick_by_line(int(
(self.polyline.radii[i]-self.width/2)), int((self.polyline.radii[i]+self.width/2)+1))
# Better to do here than drawing circle arc inside big triangle!
double_point_a = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][0]) + 5 * (Point2D.to_arrays(
@@ -100,13 +106,39 @@ class Road:
double_point_b = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][2]) + 5 * (Point2D.to_arrays(
self.polyline.acrs_intersections[i][2]) - Point2D.to_arrays(self.polyline.centers[i])))
for j in range(len(circle.points_thick)):
if circle.points_thick[j].is_in_triangle(double_point_a, self.polyline.centers[i], double_point_b):
nearest = circle.points_thick[j].nearest(
Point3D.to_2d(self.polyline_total_line_output, removed_axis='y'), True)
self.output_block.append(
(Point3D.insert_3d([circle.points_thick[j]], 'y', [
self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("white_concrete")))
for j in range(len(circle)):
for k in range(len(circle[j])):
jj = j % 7
match jj:
case 0:
blob = 'pink_concrete'
case 1:
blob = 'red_concrete'
case 2:
blob = 'orange_concrete'
case 3:
blob = 'yellow_concrete'
case 4:
blob = 'green_concrete'
case 5:
blob = 'blue_concrete'
case 6:
blob = 'purple_concrete'
if circle[j][k].is_in_triangle(double_point_a, self.polyline.centers[i], double_point_b):
nearest = circle[j][k].nearest(
Point3D.to_2d(self.polyline_total_line_output, removed_axis='y'), True)
self.output_block.append(
(Point3D.insert_3d([circle[j][k]], 'y', [
self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block(blob)))
for j in range(len(gaps)):
for k in range(len(gaps[j])):
if gaps[j][k].is_in_triangle(double_point_a, self.polyline.centers[i], double_point_b):
nearest = gaps[j][k].nearest(
Point3D.to_2d(self.polyline_total_line_output, removed_axis='y'), True)
self.output_block.append(
(Point3D.insert_3d([gaps[j][k]], 'y', [
self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("white_concrete")))
def _projection_polyline(self):
nearest_points_to_reference = []