diff options
author | cel 🌸 <cel@blos.sm> | 2023-07-09 16:30:40 +0100 |
---|---|---|
committer | cel 🌸 <cel@blos.sm> | 2023-07-09 16:30:40 +0100 |
commit | fd37d1030f79705fc7a2498bcd356ebc86462544 (patch) | |
tree | 2bb3212f8ea9864b6c7fd43dc36499d1c3757db7 /Scripts | |
parent | 12c65d9ed4447a60b26b952fdfc397f45be2ca72 (diff) | |
parent | b384856adeed758ce3fe395f6b973639f21fc4d8 (diff) | |
download | 2023-fd37d1030f79705fc7a2498bcd356ebc86462544.tar.gz 2023-fd37d1030f79705fc7a2498bcd356ebc86462544.tar.bz2 2023-fd37d1030f79705fc7a2498bcd356ebc86462544.zip |
merge branch 'curve-smoothing'
Diffstat (limited to 'Scripts')
-rw-r--r-- | Scripts/Road.gd | 82 | ||||
-rw-r--r-- | Scripts/drawing.gd | 6 |
2 files changed, 87 insertions, 1 deletions
diff --git a/Scripts/Road.gd b/Scripts/Road.gd new file mode 100644 index 0000000..4b19c70 --- /dev/null +++ b/Scripts/Road.gd @@ -0,0 +1,82 @@ +extends Line2D + +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, epsilon) + +func simplify_rec(pointArray: PackedVector2Array, epsilon: float): + var dmax = 0 + var index = -1 + if pointArray.size() < 3: + return pointArray + var end = pointArray.size() - 1 + for i in range(1, end-1): + var d = find_perpendicular_distance(pointArray[i], pointArray[0], pointArray[end]) + if d > dmax: + index = i + dmax = d + + if dmax > epsilon: + var recResults1 = simplify_rec(pointArray.slice(0, index), epsilon) + var recResults2 = simplify_rec(pointArray.slice(index, end), epsilon) + recResults1.append_array(recResults2) + return recResults1 + else: + return [pointArray[0], pointArray[end]] + +func find_perpendicular_distance(p: Vector2, p1: Vector2, p2: Vector2): + var result + var slope + var intercept + if p1.x == p2.x: + result = p.x - p1.x + else: + slope = (p2.y - p1.y) / (p2.x - p1.x) + intercept = p1.y - (slope * p1.x) + 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 832c42d..6b94f6e 100644 --- a/Scripts/drawing.gd +++ b/Scripts/drawing.gd @@ -2,7 +2,7 @@ extends Node var drawing = false -@onready var line: Line2D = $TrackLine +@onready var line = $Road @onready var path: Path2D = $TrackPath func _ready(): @@ -16,6 +16,10 @@ 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) |