2010-03-04 7 views
6

Chcę móc rysować za pomocą tego jako mój obrys. Jak zrobić to tak wydajnie, jak to możliwe, a na rysunku w locie, myślałem CGPatternRef, ale naprawdę nie wiem jak to zrobić.Jak narysować coś takiego w Core Graphics

Edytuj: Nie musi przeskakiwać na ścieżkę. Po prostu nie mogłem naprawić tego problemu w Illustratorze. alt text

+3

Nikt nie może zobaczyć tego obrazu bez zalogowania się na forach programistów Apple. Opublikuj go na http://imgur.com/ lub podobnej usłudze i edytuj pytanie, aby zamiast tego osadzić obraz. –

+0

Nie pomaga fakt, że w chwili pisania tego artykułu witryna Apple Dev jest w trybie offline w trybie konserwacji. – TechZen

Odpowiedz

0

Wygląda to na pracę dla OpenGL. CoreGraphics nie oferuje żadnego prostego sposobu, który znam, aby wypaczać gwiazdy zgodnie z ich bliskością do ścieżki.

+0

Nie muszę wypaczać gwiazd na ścieżce, którą rysuję. – Jaba

2

Będziesz musiał przejść ścieżkę i obliczyć współrzędne krzywej w równych odległościach (wzdłuż ścieżki). Jest to niedrogie. Obrót staje się trochę włochaty (obraca się wokół stycznej), ale ogólnie rzecz biorąc, jest to podstawowy problem z bézier curve. Po prostu rozwiąż równanie krzywej i wyrenderuj gwiazdę na każdym wierzchołku.

Nie ma nic wbudowanego, który wykona to wszystko. Można wyszukiwać punkty dla przecięcia, ale tylko renderowanie rozwiązuje krzywą. Jest to zawarte w CoreGraphics, więc nie możesz tego wyciągnąć ani wykorzystać tego, co już mają.

To jest coś, co powinieneś wziąć pod uwagę przy pisaniu. To nie jest trudne; szczery. Wymagane jest tylko podstawowe zrozumienie rachunku różniczkowego ... jeśli w ogóle. Jeśli napiszesz to sam, możesz nawet dodać efekty wypaczenia, jeśli chcesz.

3

Czy pomoc Apple doc pomaga?

Zobacz w sekcji w Quartz 2D Programming Guide, How Patterns Work lub ogólnie w wzorach.

Oto jak narysować początek (od powyższych docs), PSIZE jest wielkość gwiazda:

static void MyDrawStencilStar (void *info, CGContextRef myContext) 
{ 
    int k; 
    double r, theta; 

    r = 0.8 * PSIZE/2; 
    theta = 2 * M_PI * (2.0/5.0); // 144 degrees 

    CGContextTranslateCTM (myContext, PSIZE/2, PSIZE/2); 

    CGContextMoveToPoint(myContext, 0, r); 
    for (k = 1; k < 5; k++) { 
     CGContextAddLineToPoint (myContext, 
        r * sin(k * theta), 
        r * cos(k * theta)); 
    } 
    CGContextClosePath(myContext); 
    CGContextFillPath(myContext); 
} 

Wystarczy dodać transformację i krzywej w każdym punkcie narysować gwiazdę.

Oto simple C code to calculate points on cubic bezier curve.

+0

Myślę, że Pestilence ma rację, próbowałem głaskania ze wzorem, ale używa wzoru jako tapety, np. działa ładnie prostując prostokąt, ale kiedy głaszcze krzywą, nie umieszcza gwiazd w środku obrysu, po prostu układa gwiazdy w obrysie, więc dostajesz kawałki i kawałki gwiazd - jak gdybyś narysował regularny wzór na ścianie, a następnie ciął poza zakrętem, gwiazdy nie ładnie pasują do krzywej ... – stefanB

+0

Jak mogę dostosować ten przykład, aby narysować gwiazdy na linii? – daveoncode

Powiązane problemy