Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1c5868b
Add intersects util
seadowg Nov 10, 2025
fd4a6a1
Add intersects function handler
seadowg Nov 11, 2025
ab235b8
Use prototypes to get already evaluated args
seadowg Nov 11, 2025
4fb7739
Add test for non geotrace/shape strings
seadowg Nov 17, 2025
3419811
Add test cases for repeated segments and closed traced intersection
seadowg Nov 17, 2025
9641e08
Add intersects function handler to Collect
seadowg Nov 17, 2025
b2f3cc7
Move parseGeometry and parseGeometryPoint tests to geo
seadowg Nov 17, 2025
a11a20d
Convert GeoUtils to Kotlin
seadowg Nov 17, 2025
7508fe8
Move parseGeometryPoint to GeoUtils
seadowg Nov 17, 2025
17e52e8
Fix import in test
seadowg Nov 18, 2025
83a60e2
Throw exception for non-geotrace inputs
seadowg Nov 18, 2025
281fd94
Improve converted code
seadowg Nov 18, 2025
d21470c
Use zipWithNext to simplify creating segments
seadowg Nov 18, 2025
7256252
Add test to check arg length is enforced
seadowg Nov 18, 2025
77bec29
Switch test to Hamcrest
seadowg Nov 18, 2025
2a3cd02
Remove unused imports
seadowg Nov 19, 2025
da8e9a7
Add another test case to make sure we check intersections from both s…
seadowg Nov 19, 2025
d853d05
Add failing tests for non crossing intersections
seadowg Nov 20, 2025
292b7be
Rename method
seadowg Nov 20, 2025
e074729
Fix origin of one segment touching another case
seadowg Nov 20, 2025
7055bdc
Correct test
seadowg Nov 20, 2025
527ae8e
Fix line moving back on itself case
seadowg Nov 20, 2025
e7a8662
Add test for shape that closes outside the origin
seadowg Nov 20, 2025
0800a0e
Simplify non-origin vertex closing
seadowg Nov 21, 2025
602fee7
Use bounding box check based on orientation to solve right angled tri…
seadowg Nov 21, 2025
ad81da9
Fix special case with two segmnt intersection
seadowg Nov 21, 2025
69d4c8a
Pull out specific 2D geometry code
seadowg Nov 21, 2025
8860a4a
Make sure checking instersection between segments is exhaustive
seadowg Nov 21, 2025
e7b2a71
Remove unneeded return
seadowg Nov 25, 2025
30dbba2
Correct bounding box check direction
seadowg Nov 25, 2025
8822207
Add additional (failing) test for 2 segment self intersection
seadowg Nov 26, 2025
8e0e0c7
Account for case where first endpoint intersects with second segment …
seadowg Nov 26, 2025
970b508
Filter out zero length segments in traces
seadowg Nov 26, 2025
1d1a320
Remove unneeded return
seadowg Nov 26, 2025
bba4264
Fix reversed line with 3 points case
seadowg Nov 27, 2025
2fb19f8
Add basic metamorphic test for intersects
seadowg Nov 27, 2025
9f596bc
Improve adding intersecting segment using interpolation
seadowg Nov 27, 2025
29936a8
Add epsilon to colinearity check to prevent precision errors
seadowg Nov 27, 2025
08c5997
Fix accidental map
seadowg Nov 27, 2025
c6aa7c0
Add docs for interpolate
seadowg Nov 27, 2025
6a0e2e0
Increase the number of possible random intersection points in test
seadowg Nov 28, 2025
ac13533
Add tests for LineSegment#interpolate
seadowg Nov 28, 2025
d88de71
Add quickCheck helper
seadowg Nov 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Improve adding intersecting segment using interpolation
  • Loading branch information
seadowg committed Nov 27, 2025
commit 9f596bce785445ce667316796beab299a8f02447
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,12 @@ fun LineSegment.intersects(other: LineSegment, allowConnection: Boolean = false)
}
}

fun LineSegment.interpolate(position: Double): Point {
val x = start.x + position * (end.x - start.x)
val y = start.y + position * (end.y - start.y)
return Point(x, y)
}

/**
* Calculate the "orientation" (or "direction") of three points using the cross product of the
* vectors of the pairs of points (see
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,27 +214,34 @@ class GeometryTest {

// Check intersects is consistent when trace is reversed
val reversedTrace = Trace(trace.points.reversed())
assertThat(reversedTrace.intersects(), equalTo(intersects))
assertThat(
"Expected intersects=$intersects:\n$reversedTrace",
reversedTrace.intersects(),
equalTo(intersects)
)

// Check intersects is consistent when trace is scaled
val scaleFactor = Random.nextDouble(0.1, 10.0)
val scaledTrace = Trace(trace.points.map {
Point(it.x * scaleFactor, it.y * scaleFactor)
})
assertThat(scaledTrace.intersects(), equalTo(intersects))
assertThat(
"Expected intersects=$intersects:\n$scaledTrace",
scaledTrace.intersects(),
equalTo(intersects)
)

// Check adding an intersection makes intersects true
if (!intersects) {
val randomSegment = if (trace.segments().size > 1) {
trace.segments().drop(1).random()
} else {
trace.segments().first()
}

val intersectionPoint = randomSegment.start
val intersectPosition = Random.nextDouble(0.0, 1.0)
val intersectionPoint = trace.segments().first().interpolate(intersectPosition)
val intersectingTrace =
Trace(trace.points + listOf(trace.points.last(), intersectionPoint))
assertThat(intersectingTrace.intersects(), equalTo(true))
assertThat(
"Expected intersect=true:\n$intersectingTrace",
intersectingTrace.intersects(),
equalTo(true)
)
}
}
}
Expand Down