aboutsummaryrefslogtreecommitdiffstats
path: root/Scripts
diff options
context:
space:
mode:
Diffstat (limited to 'Scripts')
-rw-r--r--Scripts/Road.gd40
-rw-r--r--Scripts/drawing.gd4
2 files changed, 40 insertions, 4 deletions
diff --git a/Scripts/Road.gd b/Scripts/Road.gd
index e0b69a1..4b19c70 100644
--- a/Scripts/Road.gd
+++ b/Scripts/Road.gd
@@ -1,18 +1,20 @@
extends Line2D
-var epsilon = 20
+var epsilon = 2
+
+@onready var leftBorder = $LeftBorder
+@onready var rightBorder = $RightBorder
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
-
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass
func simplify():
- points = simplify_rec(points, 5)
+ points = simplify_rec(points, epsilon)
func simplify_rec(pointArray: PackedVector2Array, epsilon: float):
var dmax = 0
@@ -46,3 +48,35 @@ func find_perpendicular_distance(p: Vector2, p1: Vector2, p2: Vector2):
result = abs(slope * p.x - p.y + intercept) / sqrt(pow(slope, 2) + 1)
return result
+
+func get_bisector(left_side: bool, p2: Vector2, p1: Vector2 = p2, p3: Vector2 = p2):
+ var v1 = (p2 - p1).normalized()
+ var v2 = (p2 - p3).normalized()
+ var normal
+ if v1 == -v2:
+ normal = v2.rotated(-PI/2)
+ else:
+ normal = (v1 + v2).normalized()
+ if v2.rotated(-PI/2).dot(v1) < 0:
+ normal = -normal
+
+ if left_side:
+ normal = -normal
+ return normal
+
+
+func draw_borders():
+ for pointIndex in range(0, points.size() - 1):
+ var normal
+ if pointIndex == 0:
+ continue
+ elif pointIndex == points.size() -1:
+ continue
+ #normal = Vector2.ZERO
+ else:
+ normal = get_bisector(true, points[pointIndex], points[pointIndex-1], points[pointIndex+1])
+
+ var point = points[pointIndex] + (normal*50)
+ leftBorder.add_point(point)
+ point = points[pointIndex] - (normal*50)
+ rightBorder.add_point(point)
diff --git a/Scripts/drawing.gd b/Scripts/drawing.gd
index c45196b..a8068a2 100644
--- a/Scripts/drawing.gd
+++ b/Scripts/drawing.gd
@@ -17,13 +17,15 @@ func start_drawing():
func _end_drawing():
drawing = false
line.simplify()
+ line.draw_borders()
+ for point in line.points:
+ path.curve.add_point(point)
owner.set_driving(true)
func _input(event):
if drawing and event is InputEventMouseMotion:
line.add_point(event.position)
- path.curve.add_point(event.position)
func reset():