Fix segment small offset with thickness

This commit is contained in:
2024-06-21 00:28:06 +02:00
parent 584bfacb4a
commit 92569d8815
4 changed files with 66 additions and 35 deletions

View File

@@ -140,8 +140,9 @@ class Polyline:
# Get segments between arcs
for i in range(2, self.length_polyline - 1):
self.segments[i] = Segment2D(Point2D(self.acrs_intersections[i][0].x, self.acrs_intersections[i][0].y), Point2D(
self.acrs_intersections[i-1][-1].x, self.acrs_intersections[i-1][-1].y))
self.segments[i] = Segment2D(Point2D(
self.acrs_intersections[i-1][2].x, self.acrs_intersections[i-1][2].y), Point2D(self.acrs_intersections[i][0].x, self.acrs_intersections[i][0].y))
print(self.segments[i], i)
# Why -3?
# For n points, there are n-1 segments.
@@ -162,7 +163,8 @@ class Polyline:
alpha_b = min(
self.lengths[start_index] - self.alpha_radii[start_index], self.lengths[start_index + 1])
current_radius = max(self.tangente[start_index] * self.alpha_radii[start_index],
self.tangente[start_index + 1] * alpha_b) # Radius at initial segment
# Radius at initial segment
self.tangente[start_index + 1] * alpha_b)
if current_radius < minimum_radius:
minimum_radius, minimum_index = current_radius, start_index
@@ -180,7 +182,8 @@ class Polyline:
self.lengths[end_index-2], self.lengths[end_index-1]-self.alpha_radii[end_index])
current_radius = max(self.tangente[end_index-1]*alpha_a, self.tangente[end_index]
* self.alpha_radii[end_index]) # Radius at final segment
# Radius at final segment
* self.alpha_radii[end_index])
if current_radius < minimum_radius:
minimum_radius, minimum_index = current_radius, end_index - 1

View File

@@ -21,7 +21,7 @@ class Segment2D:
def __repr__(self):
return str(f"Segment2D(start: {self.start}, end: {self.end}, points: {self.points})")
def segment(self, start: Point2D = None, end: Point2D = None, overlap: LINE_OVERLAP = LINE_OVERLAP.NONE, _is_computing_thickness: int = 0) -> Union[List[Point2D], None]:
def segment(self, start: Point2D = None, end: Point2D = None, overlap: LINE_OVERLAP = LINE_OVERLAP.NONE, _is_computing_thickness: int = -1) -> Union[List[Point2D], None]:
"""Modified Bresenham draw (line) with optional overlap.
From: https://github.com/ArminJo/Arduino-BlueDisplay/blob/master/src/LocalGUI/ThickLine.hpp
@@ -98,7 +98,7 @@ class Segment2D:
self._add_points(
start, _is_computing_thickness, LINE_OVERLAP.NONE)
if not _is_computing_thickness:
if _is_computing_thickness < 0:
return self.points
return None
@@ -166,7 +166,7 @@ class Segment2D:
start.y -= step_y
end.y -= step_y
error -= delta_2x
error += delta_2x
error += delta_2y
if not swap:
self.segment(
@@ -240,6 +240,16 @@ class Segment2D:
reel_distance = self.points_thick_by_line[0][0].distance(
self.points_thick_by_line[-1][0])
delta_correction = round(reel_distance - thickness)
if delta_correction > 0:
for i in range(delta_correction):
if (-1) ** i == 1:
index = -1
else:
index = 0
print(i)
del self.points_thick_by_line[index]
del self.gaps[index]
return self.points_thick

View File

@@ -8,7 +8,7 @@ from networks.geometry.Segment2D import Segment2D
from networks.geometry.Segment3D import Segment3D
from networks.geometry.Circle import Circle
from utils.Enums import LINE_THICKNESS_MODE
from gdpc import Block, Editor
from gdpc import Block, Editor, geometry
class Road:
@@ -92,13 +92,13 @@ class Road:
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")))
(Point3D.insert_3d([self.polyline.segments[i].gaps[k][m]], 'y', [self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("black_concrete")))
for i in range(1, len(self.polyline.centers)-1):
# Circle
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)))
(self.polyline.radii[i]-self.width/2))+1, 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(
@@ -106,6 +106,17 @@ 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])))
editor = Editor(buffering=True)
editor.placeBlock(Point3D.insert_3d(
[self.polyline.acrs_intersections[i][0]], 'y', [230])[0].coordinates, Block("purple_concrete"))
editor.placeBlock(Point3D.insert_3d(
[self.polyline.acrs_intersections[i][2]], 'y', [230])[0].coordinates, Block("pink_concrete"))
geometry.placeLine(editor, Point3D.insert_3d([double_point_a], 'y', [250])[
0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [250])[0].coordinates, Block("blue_concrete"))
geometry.placeLine(editor, Point3D.insert_3d([double_point_b], 'y', [250])[
0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [250])[0].coordinates, Block("red_concrete"))
for j in range(len(circle)):
for k in range(len(circle[j])):
jj = j % 7
@@ -176,7 +187,7 @@ class Road:
self.segment_total_line_output[i].x, reference[self.segment_total_line_output[i].nearest(Point3D.to_2d(reference, 'y'), True)[0]].y, self.segment_total_line_output[i].y), Block("black_concrete")))
def place(self):
editor = Editor(buffering=False)
editor = Editor(buffering=True)
for i in range(len(self.output_block)):
editor.placeBlock(self.output_block[i][0],
self.output_block[i][1])