W naszym systemie są wymagania, aby przenieść niektóre linie źródłowe (o niskiej precyzji) do linii odniesienia (o wysokiej precyzji). Poniższe zdjęcia przedstawiają normalne przypadki użycia. Czerwona to linia źródłowa, a niebieska to linia odniesienia.
W tym przypadku linia źródłowa zostałaby częściowo przesunięta, a wynik byłby taki, jak pokazuje zielona linia:
Są sytuacje, że linia źródłowa musi zostać całkowicie przeniesiona.
Wynik:
Obecnie naszym rozwiązaniem jest rzutowanie punktu początkowego / końcowego linii źródłowej na linię odniesienia i odwrotnie, a następnie znalezienie rzutowanych punktów na linii źródłowej i linii odniesienia. Za pomocą tych rzutowanych punktów możemy wyodrębnić potrzebną część źródła i linii odniesienia, a następnie połączyć je w nową.
Działa to w większości przypadków, ale zdarzają się przypadki, że ta metoda nie działa. W szczególności, gdy jedna z linii ma kształt litery „C” lub punkt wierzchołkowy znajduje się bardzo blisko punktu końcowego. Następne dwa zdjęcia przedstawiają scenariusz.
Stosując mój algorytm, otrzymujemy wynik:
W pewnym sensie jest to zrozumiałe, ponieważ obecny algorytm po prostu wyszukuje rzutowane punkty i wydobywa linie.
Oczekiwaliśmy czegoś takiego:
Potrzebuję więc bardziej niezawodnego algorytmu, aby to zrobić, aby mógł on również obsługiwać specjalne przypadki, takie jak poprzedni. Próbowałem rzutować wszystkie punkty z linii na drugą i znaleźć dwa rzutowane punkty, które są najbliżej punktu początkowego / końcowego rzutowanej linii, ale nie miałem szczęścia. Nadal mogę znaleźć przypadki, które dają nieoczekiwane wyniki.
Czy ktoś wcześniej spotkał podobne problemy? Byłoby również świetnie, gdyby oprogramowanie lub biblioteka mogła wykonywać podobne zadania. Każda odpowiedź będzie mile widziana.