Going off of the ideas of treating this as a Graph and the geometric intersections Daniel and Sanders proposed above respectively. I use the same setup as the initial question by the user in the attachment, I just change n to 250 (to get percolation in both x and y directions from edge nodes).
We find the intersections of line segments explicitly by modifying the determinants method, (as given by the Mathworld page).
given both in uncompiled and compiled versions for comparison:
lineIntersections[{a_, b_}, {c_, d_}] :=
Block[{detBottom = Det[{a - b, c - d}], pt},
If[Chop[detBottom] == 0, Infinity,
pt = ((Det[{a, b}] (c - d) - Det[{c, d}] (a - b))/detBottom);
If[Sign[b - a] == Sign[b - pt] && Sign[a - b] == Sign[a - pt] &&
Sign[d - c] == Sign[d - pt] && Sign[c - d] == Sign[c - pt], pt,
0]]]
lineIntComp = Compile[{{u, _Real, 2}, {v, _Real, 2}},
Block[{a = u[[1]], b = u[[2]], c = v[[1]], d = v[[2]], pt,
detBottom},
detBottom =
u[[2, 2]] (v[[1, 1]] - v[[2, 1]]) +
u[[1, 2]] (-v[[1, 1]] + v[[2, 1]]) + (u[[1, 1]] -
u[[2, 1]]) (v[[1, 2]] - v[[2, 2]]);
If[Chop[detBottom] == 0, {10^6, 10^6},
pt = ({(-u[[1, 2]] u[[2, 1]] + u[[1, 1]] u[[2, 2]]) (v[[1, 1]] -
v[[2, 1]]) + (u[[1, 1]] -
u[[2, 1]]) (v[[1, 2]] v[[2, 1]] -
v[[1, 1]] v[[2, 2]]), (-u[[1, 2]] u[[2, 1]] +
u[[1, 1]] u[[2, 2]]) (v[[1, 2]] -
v[[2, 2]]) + (u[[1, 2]] -
u[[2, 2]]) (v[[1, 2]] v[[2, 1]] - v[[1, 1]] v[[2, 2]])}/
detBottom);
If[Sign[b - a] == Sign[b - pt] && Sign[a - b] == Sign[a - pt] &&
Sign[d - c] == Sign[d - pt] && Sign[c - d] == Sign[c - pt],
pt, {10^6, 10^6}]]
]];
We can then apply this on all pairs using Outer (definitely inefficient but perhaps sufficient, or user can apply earlier suggestions on scaling?)
full = Sort /@ Transpose[{stickend1, stickend2}];
mat = Outer[lineIntersections, full, full, 1]; // Timing
(*Out[16]= {1.98438,Null}*)
matComp = Outer[lineIntComp, full, full, 1]; // Timing
(*Out[17]= {0.21875,Null}*)
One can then create an Adjacency Matrix, connecting only intersecting nodes (sticks) and generate the graph whereby VertexCoordinates can be specified as the lines defined earlier by the user.
linked[mat_] := Map[Boole[VectorQ[#]] &, mat, {2}]
linkedComp[mat_] := Map[Boole[# != {1. 10^6, 1. 10^6}] &, mat, {2}]
linkedComp[matComp] == linked[mat]
ag = AdjacencyGraph[linked[mat], VertexCoordinates -> centers,
EdgeStyle -> White,
VertexShape ->
Thread[Range[n] -> (Graphics[{Opacity[.5], #}] & /@ lines)],
VertexSize -> 250]
Now we can use various graph functionality to evaluate things like percolation.
Here, I just define some extreme points for visualization purposes:
bottomMost = First@Ordering[centers[[All, 2]], 1]
topMost = First@Ordering[centers[[All, 2]], -1]
leftMost = First@Ordering[centers[[All, 1]], 1]
rightMost = First@Ordering[centers[[All, 1]], -1]
Vertical percolation:
With[{vert = FindShortestPath[ag, bottomMost, topMost]},
HighlightGraph[ag, vert, ImageSize -> 700,
VertexShape ->
Thread[vert -> (Graphics[{Red, Thick, #}] & /@ lines[[vert]])]]]

Horizontal percolation:
With[{vert = FindShortestPath[ag, leftMost, rightMost]},
HighlightGraph[ag, vert, ImageSize -> 700,
VertexShape ->
Thread[vert -> (Graphics[{Red, Thick, #}] & /@ lines[[vert]])]]]

all connected components to bottomMost stick:
With[{vert =
Reap[BreadthFirstScan[ag, bottomMost, {"PrevisitVertex" -> Sow}]][[
2, 1]]},
HighlightGraph[ag, vert, ImageSize -> 700,
VertexShape ->
Thread[vert -> (Graphics[{Red, Thick, #}] & /@ lines[[vert]])]]]

Hope this helps.
Best,
George