Сначала перенумеруйте все точки. Для этого заведите ассоциативный массив/сет/словарь, который по координатам возвращает номер точки. Пройдитесь по всем концам отрезков и добавляйте их туда с новым номером, если их там еще нет.
Дальше постройте граф. Вершины - все уникальные точки из словаря. Добавьте ребра между концами всех отрезков. Далее, я так понял, что если конец отрезка лежит на другом отрезке, то тут можно перескочить туда или обратно. В этом случае вам надо перебрать все отрезки и все точки и, если точка лежит внутри отрезка, то добавить ребра между ней и концами отрезка.
Для проверки принадлежности точки отрезку можно воспользоваться свойствами векторов. Точка C лежит на отрезке AB, если
1) векторное произведение <AB,AC> = 0
2) Скалярное произведение (AB,AC) > 0
3) Скалярное произведение (AB,AC) < |AB|^2
(длина отрезка в квадрате).
Дальше, вот вы построили граф. Запускайте в нем любой алгоритм поиска путей от начальной точки. Если длина пути считается как физическая длина отрезков, то нужен алгоритм Дейкстры (и, когда добавляете ребра - считайте их длины, как расстояния между точками). Если длина у вас - количество пройденных отрезков, то подойдет и поиск в ширину.
UPD, ах да... забыл про переходы внутри одного отрезка. Когда добавляете точки на отрезке, запоминайте все точки на нем. Потом добавьте ребра между каждой парой.