2010-12-13 11 views
10

Chcę zbudować program CGPathRef programowo oparty na współrzędnych Słońca w różnych punktach dnia. Obliczanie punktów nie jest problemem, ale chcę, aby CGPathRef był gładki i pomyślałby, że byłoby właściwe.Co oznaczają parametry dla CGPathAddCurveToPoint?

Rozumiem parametry ścieżki, transformacji, x i y, ale nie jestem pewien co do innych. Według dokumentacji Apple są one punktami kontrolnymi i domyślam się, że wyglądają tak, jak w programie do rysowania wektorów, w którym można dostosować sposób, w jaki krzywa przechodzi przez punkt.

Moje pytanie brzmi: jak wybrać punkty, które odnoszą się do moich współrzędnych, nie wiedząc, jakie są te współrzędne przed czasem? Myślę, że może po prostu odjąć ustaloną kwotę od każdego z pierwszych punktów kontrolnych i dodać taką samą ilość do drugiego punktu kontrolnego, ale to brzmi dla mnie w uproszczeniu. Czy istnieje standardowa metoda generowania punktów kontrolnych, które "mają sens" dla gładkiej krzywej?

void CGPathAddCurveToPoint (
    CGMutablePathRef path, 
    const CGAffineTransform *m, 
    CGFloat cp1x, 
    CGFloat cp1y, 
    CGFloat cp2x, 
    CGFloat cp2y, 
    CGFloat x, 
    CGFloat y 
); 
+0

Ponieważ znalazłem to pytanie, mając ten problem: Jeśli jesteś przyzwyczajony do oprogramowania graficznego wektorów, taki jak Illustrator, znaczenie punktów kontrolnych jest lekko różni się od tego, co jest używane w Core Graphics. Jeśli masz ścieżkę [(a1, p1, b1), (a2, p2, b2), ...] gdzie pi są punktami, a ai są punktami kontrolnymi, które są wizualnie z nimi połączone, odpowiednia ścieżka w Core Graphics zacznie się z [(b1, p2, a2), ...] (po moveToPoint dla p1). Mam nadzieję, że jest to pomocne dla kogoś. – mrueg

Odpowiedz

6

Dodatkowe punkty są punkty kontrolne krzywej Beziera do wyjścia z (bieżący) punktem źródłowym a krzywej do punktu docelowego (patrz http://en.wikipedia.org/wiki/Bézier_curve dla ogólnego wyjaśnienia). Linia currentX, currentY - cp1x, cp1y jest wektorem "out" bieżącego punktu i cp2x, cp2y - x, y jest wektorem "in" do punktu końcowego.

rozsądny sposób, aby wytworzyć gładką krzywą od P1 do P2 (zakładając 4 punkty P0, P1, P2, P3) wynosi (pseudokod)

v = (strength of curve from 0.0 to 1.0) 
cp1x = p1.x+v*(p1.x-p0.x) 
cp1y = p1.y+v*(p1.y-p0.y) 
cp2x = p2.x-v*(p3.x-p2.x) 
cp2y = p2.y-v*(p3.y-p2.y) 

za punkt wyjścia ustawione cp1x, cp1y do początkowe x, y i dla punktu końcowego ustawione cp2x, cp2y na zakończenie x, y.

UWAGA: Mam zaktualizowane odpowiedź na naniesienie uwag od ughoavgfhw

+2

Denis pisze o tym, że są punktami kontrolnymi, ale źle o ich użyciu. cp1x, cp1y podaje wektor OUT punktu CURRENT, a cp2x, xp2y podaje wektor do punktu x, y. Ponadto użycie ostatniego i następnego punktu prawdopodobnie dałoby proste linie. Przepraszam, ale nie mogę ci powiedzieć, jak właściwie obliczyć punkty, ale mogę zasugerować zamiast tego próbę CGPathAddArcToPoint. – ughoavgfhw

Powiązane problemy