2011-08-29 10 views
7

Rysuję ścieżkę do CGContext po zestaw punktów zebranych od użytkownika. Wydaje się, że występuje losowy jitter wejściowy powodujący, że niektóre krawędzie linii wyglądają na postrzępione. Myślę, że delikatne pióro rozwiązałoby ten problem. Gdybym używał OpenGL ES, po prostu przykładałbym piórko do duszka, z którym głaszczę ścieżkę; jednak ten projekt wymaga ode mnie pozostania w Quartz/CoreGraphics i nie mogę znaleźć podobnego rozwiązania.Kwerenda iOS Quartz/CoreGraphics rysowanie ptactwa pociągnięcia

Próbowałem rysować 5 linii z każdą linią nieco większą i bardziej przezroczystą, aby zbliżyć piórko. Powoduje to zły wynik i wyraźnie obniża wydajność.

Jest to kod rysunek linia:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

Czy próbowałeś funkcji CGContextSetShouldAntialias? – Davyd

+0

Miałem podobne problemy w przeszłości używając czterokrotnych krzywych lub krzywych z 2 punktami kontrolnymi. Prawdopodobnie mógłbym pomóc, gdybyś przysłał mi .svg tego, co chcesz narysować, lub przynajmniej trochę więcej informacji o piórku, które próbujesz narysować – GianPac

Odpowiedz

2

Zamierzam śmiało założyć, że CGContext jeszcze anty-aliasing włączona, ale jeśli nie, to jest oczywiste, najpierw pomyśleć, aby spróbować , jak sugeruje komentarz @ Davyd: CGContextSetShouldAntialias jest funkcją zainteresowania.

Zakładając, że to nie problem, a linia jest wygładzona przez kontekst, ale nadal chcesz coś "miękkiego". Mogę wymyślić kilka sposobów na zrobienie tego, co, mam nadzieję, powinno być szybsze niż gładzenie 5 razy.

Po pierwsze, możesz spróbować uzyskać obrysowaną ścieżkę (tj. Ścieżkę opisującą obrys obrysu aktualnej ścieżki) za pomocą CGContextReplacePathWithStrokedPath możesz wtedy wypełnić tę ścieżkę gradientem (lub dowolną inną techniką wypełniania, która daje pożądane wyniki .) Będzie to działać dobrze dla linii prostych, ale nie będzie proste dla zakrzywionych ścieżek (ponieważ gradient wypełnia obszar obrysowanej ścieżki i będzie albo liniowe, albo promieniowe).

Inna opcja może mniej oczywiste , może nadużywać rysunku cienia CG do tego celu. Funkcja chcesz patrzeć to: CGContextSetShadowWithColor Oto sposób:

  • Zapisz GState: CGContextSaveGState
  • Get obwiednię oryginalnej ścieżki
  • Copy ścieżka, przekładając go z dala od siebie o 2,0 * bbox.width użyciu CGPathCreateCopyByTransformingPath (uwaga: używać tylko kierunek X, w ten sposób nie trzeba się martwić o koziołki w kontekście)
  • Klip kontekst do oryginalnego bbox wykorzystaniem CGContextClipToRect
  • Ustaw cień na kontekst wi th CGContextSetShadowWithColor:
    • Niektóre minimalne rozmycie (Zacznij od 0,5 i przejdź dalej. Parametr rozmycia jest nieliniowy, a IME to rodzaj operacji odgadnięcia i sprawdzenia)
    • Przesunięcie równe -2,0 * szerokości boksa i 0.0 wysokości, skalowane do przestrzeni bazowej. (Uwaga: te przesunięcia znajdują się w przestrzeni podstawowej. To będzie denerwujące, ale zakładając, że nie dodajesz własnych przekształceń skali, współczynnik skali będzie wynosił 1,0 lub 2,0, więc praktycznie mówiąc, ustawisz offset.width -2,0 * bbox.width lub -4.0 * bbox.width)
    • Kolor twojego wyboru.
  • Skok przetłumaczonej ścieżki.
  • Pop GState CGContextRestoreGState

ten powinien zostawić z „tylko” cieniem, który może mieć nadzieję dostrojenia do uzyskania pożądanych wyników.

Wszystko to powiedziawszy, wydajność rysowania CG w cieniu jest, IME, mniejsza niż całkowicie niesamowita, i mniej niż całkowicie deterministyczna. Spodziewałbym się, że będzie to szybsze niż obrysowywanie ścieżki 5 razy z 5 różnymi uderzeniami, ale nie przytłaczająco.

Sprowadzi się do tego, jak wiele warta jest dla ciebie ta skuteczność.