2012-05-23 10 views
5

Mam problem z aplikacją, nad którą pracuję. Załóżmy, że mam dwie ścieżki CGPath, które są dość złożone i dodaję je do CGMutablePath (łącząc je w ten sposób). Cóż, gdzie przecinają się dwie ścieżki, będą punkty wewnątrz siebie. Chcę wyeliminować te wewnętrzne punkty i zasadniczo narysować zewnętrzną stronę lub zarys ścieżki. Mam trudności z ustaleniem, jak to zrobić.Łączenie przecinających się stron CGPath na iOS

Edytuj: Oto przykład tego, o czym mówię. Niebieskie i czerwone pola oznaczają punkty wzdłuż ścieżek CGPath. Czerwone pola to punkty znajdujące się w obu ścieżkach. Chciałbym jakoś wyeliminować czerwone punkty i przerysować tylko zarys ścieżki.

enter image description here

+0

Masz na myśli, że chcesz obliczyć połączenie ścieżek? A może chcesz [różnicy symetrycznej] (http://en.wikipedia.org/wiki/Symmetric_difference) ścieżek? –

+0

@robmayoff Zmieniłem moje pytanie, aby miejmy nadzieję wyjaśnić, co próbuję zrobić. – daveMac

+0

@daveMac: Możesz polecić: - http://stackoverflow.com/questions/23497703/union-uibezierpaths-rather-than-apend-path/41179791#41179791 – Shrawan

Odpowiedz

1

klasyczny punkt problemu wielokąta. Usuń wszystkie punkty w każdym wielokącie, który zwraca 1, odwołując się do innego wielokąta:

Połącz dwie ścieżki z usuniętymi punktami.

Pseudo kod dla całej procedury:

define starPoly with 10 points 
define simplePoly with 7 points 

for each point in starPoly 
    if (pnpoly(7, simplePoly.Xs[], simplePoly.Ys[], point.x, point.y) == 0) 
     clipedStarPoly += point; 

for each point in simplePoly 
    if (pnpoly(10, starPoly.Xs[], starPoly.Ys[], point.x, point.y) == 0) 
     clipedSimplePoly += point; 

for each point in clipedStarPoly 
    solutionPoly += point; 

for each point in clipedSimplePoly 
    solutionPoly += point; 

solutionPoly += solutionPoly.point[0] 

Jeśli uważasz, że nie trzeba będzie grać z punktami końcowymi przyciętymi polys można po prostu zbudować bezpośrednio poli rozwiązanie z testów punktowych.

Możesz użyć ray tracing w punkcie poli testu, spróbuj poszukać w tym page

+0

Co powiesz na małe wyjaśnienie, jak dokładnie to wykorzystać, gdzie to wykorzystać i co robi. – daveMac

+0

Hej Dave, czy to wystarczające wytłumaczenie? – gjpc

+0

Myślę, że rozumiem całkiem dobrze. Wiem, że to tylko pseudo-kod, ale myślę, że naprawdę pomogłoby zobaczyć działający przykład używając CGPaths. – daveMac

3

To, co opisujesz, to połączenie wnętrz ścieżek.

Jeśli ścieżki zawierają krzywe, jest to trudny problem.

Jednak twój przykład pokazuje tylko odcinki proste, więc zakładam, że dbasz tylko o ścieżki, które zawierają wyłącznie odcinki proste.

W takim przypadku potrzebujesz funkcji łączenia wielokątów. Ten rodzaj algorytmu jest dość prosty w dziedzinie znanej jako "geometria obliczeniowa". Nie znam żadnej specyficznej dla Celu C implementacji unii wielokątów. Możesz znaleźć czystą bibliotekę C, ale dużo łatwiej jest znaleźć bibliotekę C++. Możesz użyć C++, jeśli zmienisz rozszerzenie pliku z .m na .mm. Oto kilka bibliotek C++, że może obliczyć unię wielokątów:

Należy pamiętać, że we wszystkich przypadkach do wyodrębnienia należy użyć CGPathApply wierzchołki twojej ścieżki, jeśli nie masz ich jeszcze w innym formacie.

0

Nie wystarczy złączyć dwa zestawy punktów.W celu określenia połączonych wielokątów należy wykonać następujące czynności. Przepraszam, mam tylko pseudokod, zacząłem tylko patrzeć na ten problem.

Rozważymy dwa wielokąty jako A i B. Nie ma znaczenia, które jest które.

  • Poruszanie wielokąta Patrząc na każdym punkcie, który nie jest wewnątrz wielokąta B.
  • Dodaj tego punktu do wielokąta.
  • Kontynuuj po wielokącie, testując i dodając każdy punkt po kolei.
  • Po znalezieniu punktu znajdującego się wewnątrz wieloboku B spójrz na linię między nim a poprzednim punktem.
  • Dowiedz się, która linia na wielokącie B przecina się z tą linią.
  • Określ punkt przecięcia tych dwóch linii i dodaj go do wielokąta.
  • Ustal, który z dwóch punktów definiujących linię przecinającą należącą do wieloboku B NIE jest wewnątrz wielokąta A i dodaj go do nowego wielokąta.
  • Ustal, który kierunek wokół wielokąta B musisz przejść, aby następny punkt NIE był tym, który znajduje się na drugim końcu linii przecięcia i dodaj go.
  • Powtórz od 3, z wyjątkiem użycia wielokąta B zamiast wielokąta A
  • Kontynuuj, dopóki nie osiągniesz punktu, od którego zacząłeś, w razie potrzeby przełączając się między wielokątami.

Należy zauważyć, że to rozwiązanie jest dopuszczalne wyłącznie w przypadku wielokątów o prostych bokach. Tam, gdzie chodzi o ścieżkę Beziera, obliczanie punktów przecięcia staje się o wiele trudniejsze, nie wspominając o złożoności łączenia gładkich narożników z ostrymi narożnikami lub krzywych z odcinkami prostymi.

Powiązane problemy