Linia Znormalizowana 2D

Funkcja LineNormals2D oblicza normalne do punktów linii, wykorzystując sąsiednie punkty każdego punktu konturu oraz różnice w przód i w tył na końcach.

Wejście i wyjście:

Fragment kodu przyjmuje listę punktów/wierzchołków V o wymiarach 2 x M jako dane wejściowe. Opcjonalnie można podać listę odcinków Lines, która jest listą N x 2 zawierającą indeksy wierzchołków definiujących poszczególne odcinki linii (jeśli nie jest podana, zakłada się, że Lines=[1 2; 2 3 ; ... ; M-1 M]). Jako wynik zwraca normalne do wierzchołków N o wymiarach 2 x M.

  • V = Lista punktów/wierzchołków w postaci macierzy 2 x M.
  • Lines (opcjonalny) = Lista o wymiarach N x 2 zawierająca odcinki linii, wyrażone przez indeksy wierzchołków (jeśli nie jest podana, zakładamy, że Lines=[1 2; 2 3 ; ... ; M-1 M]).
  • N = Normalne do wierzchołków w postaci macierzy 2 x M.

Przykład:

Ten fragment kodu to przykładowe użycie funkcji LineNormals2D w celu obliczenia normalnych do linii na płaszczyźnie 2D. Dane wejściowe są wczytywane z pliku testowego (testdata). Następnie funkcja LineNormals2D jest wywoływana, aby obliczyć normalne do linii na podstawie podanych wierzchołków (Vertices) i odcinków (Lines). Otrzymane normalne są następnie wykorzystywane do wygenerowania wykresu, który przedstawia oryginalne linie oraz normalne do tych linii, przedstawione jako linie przechodzące przez wierzchołki i skierowane w kierunku normalnej zwiększonej dziesięciokrotnie.

  • testdata = nazwa pliku testowego.

FUNKCJA:

Funkcja napisana przez D. Kroona z Uniwersytetu w Twente (sierpień 2011)

Początek kodu odpowiada za ustalenie listy odcinków linii w przypadku, gdy nie są podane indeksy linii. Lista zmiennych:

  • nargin = Liczba argumentów wejściowych funkcji.
  • Lines = Lista odcinków linii, gdzie każdy odcinek jest połączeniem kolejnych punktów. Jeśli nie są podane indeksy linii, ta lista jest automatycznie generowana.

Obliczanie wektorów stycznych do krzywej poprzez różnicę pomiędzy współrzędnymi punktów końcowych i początkowych odcinków linii.

  • Lines(:,1) = indeksy początkowych punktów odcinków linii.
  • Lines(:,2) = indeksy końcowych punktów odcinków linii.
  • Vertices(Lines(:,1),:) = współrzędne początkowych punktów odcinków linii.
  • Vertices(Lines(:,2),:) = współrzędne końcowych punktów odcinków linii.

Wpływ wektorów stycznych na odległość dla każdego punktu/wierzchołka krzywej:

  • LL: Obliczana jest długość wektorów stycznych DT za pomocą funkcji sqrt(DT(:,1).^2+DT(:,2).^2).

  • DT(:,1)=DT(:,1)./max(LL.^2,eps): Normalizowane są współrzędne x wektorów stycznych przez kwadrat długości wektora (LL), z tym że minimalna wartość to eps (najmniejsza wartość reprezentowalna w danej precyzji arytmetyki).

  • DT(:,2)=DT(:,2)./max(LL.^2,eps): Normalizowane są współrzędne y wektorów stycznych przez kwadrat długości wektora (LL), z tym że minimalna wartość to eps.

  • D1=zeros(size(Vertices)); D1(Lines(:,1),:)=DT;: Tworzona jest macierz zerowa D1 o takim samym rozmiarze jak lista punktów/wierzchołków. Następnie wiersze odpowiadające początkowym punktom odcinków linii otrzymują wartości wektorów stycznych DT.

  • D2=zeros(size(Vertices)); D2(Lines(:,2),:)=DT;: Tworzona jest macierz zerowa D2 o takim samym rozmiarze jak lista punktów/wierzchołków. Następnie wiersze odpowiadające końcowym punktom odcinków linii otrzymują wartości wektorów stycznych DT.

  • D=D1+D2;: Sumowane są macierze D1 i D2, uzyskując macierz D, która zawiera wpływ wektorów stycznych na odległość dla każdego punktu/wierzchołka krzywej.

Normalizowanie wektorów normalnych:

  • LL: Obliczana jest długość wektorów normalnych D za pomocą funkcji sqrt(D(:,1).^2+D(:,2).^2).

  • N(:,1)=-D(:,2)./LL: Współrzędna x normalizowanego wektora normalnego jest ujemnym ilorazem współrzędnej y wektora normalnego przez długość LL.

  • N(:,2)= D(:,1)./LL: Współrzędna y normalizowanego wektora normalnego jest ilorazem współrzędnej x wektora normalnego przez długość LL.

Ostatecznie macierz N zawiera znormalizowane wektory normalne.