2012-01-19 16 views
10

Weźmy następujący AS3 że będzie narysować linię krzywą za pomocą curveTo():Jak mogę przekonwertować curveTo() na listę punktów?

var line:Shape = new Shape(); 

line.x = line.y = 20; 
line.graphics.lineStyle(2, 0xFF0000); 
line.graphics.curveTo(200, 200, 200, 0); 

addChild(line); 

Powstały wizualny jest:

enter image description here

Teraz chcę coś, aby móc podążać tą ścieżką; jak mogę przekonwertować ten wizualny na listę współrzędnych? Walczę z jakąkolwiek zaawansowaną matematyką, ale zakładam, że istnieje pewna (do jakiejś) formuła, którą curveTo() używa do stworzenia powyższego, którą mogę replikować i poprawiać, aby utworzyć moją pożądaną listę.

Wynik może wyglądać tak (przy założeniu przesunięcia około 5 punktów między punktami).

Vector.<Point> = [ 
    new Point(20, 20), 
    new Point(23, 23), 
    new Point(27, 28), 
    new Point(33, 32), 
    new Point(40, 37) 
    /* ...etc... */ 
]; 

Rezultatem będzie używany do rzeczy, takich jak tworzenie deszcz pocisków, które następują następujące ścieżki, na przykład:

enter image description here

+0

Należy również sprawdzić ten facet blog: http://www.paultondeur.com/ 2008/03/09/rysunek-a-cubic-bezier-curve-using-actionscript-3 /, im go używać do tego. – turbosqel

Odpowiedz

14

Od czytanie dokumentacji języka ActionScript, rozumiem, że curveTo metoda w skrypcie akcji generuje kwadratową krzywą Beziera.

Krzywa składa się z trzech „punktów kontrolnych”, które określonych w kodzie:

control point 1 (p1) = (20,20) 
control point 2 (p2) = (200,200) 
control point 3 (p3) = (200,0) 

interpolować wartość wzdłuż krzywej w wartości u w zakresie od 0 do 1 (0 oznacza początek punkt i 1 będący punktem końcowym) możesz użyć tak zwanych wielomianów Bernsteina. Na kwadratowej krzywej (Twój przypadek) wielomiany są:

B1 = (1 - u) * (1 - u) 
B2 = 2 * u * (1 - u) 
B3 = u * u 

Wystarczy obliczyć tych numerów dla wartości parametru u i zsumować punkty kontrolne pomnożonych przez odpowiadające im wielomiany Bernsteina.

point on curve at parameter *u* = p1 * B1 + p2 * b2 + p3 * B3 

Tak więc, na przykład, jeśli chcesz dostać 5 punktów wzdłuż krzywej, można obliczyć punkty wzdłuż krzywej przy wartości parametru 0, 0,25, 0,5, 0,75 i 1,0

+5

Uwielbiam, jak przypadkowo używasz "po prostu" i "wielomianów" w tym samym zdaniu! – grapefrukt

+0

Dlaczego tak bardzo komplikują rzeczy na Wikipedii ?! Dzięki, Kappamaki. – chadiik

3

curveTo() służy narysować kwadratową krzywą Beziera, gdzie krzywa Beziera jest obliczana między dwoma punktami końcowymi oraz w odniesieniu do dwóch punktów kontrolnych, a kwadratowa krzywa Beziera to taka, w której oba punkty kontrolne mają te same współrzędne.

Krzywe Beziera są obliczane na podstawie wielu równań, które umożliwiają znalezienie współrzędnych x i y dla punktu, który jest osiągany w określonym czasie wzdłuż ścieżki, więc to już całkiem pasuje do Twoich potrzeb. Ogólne informacje na temat krzywych Beziera można znaleźć na stronie this page.

Wszystko, co musisz zrobić, aby uzyskać punkty współrzędnych, to przetłumaczyć te równania na ActionScript. I na szczęście, Paul Tondeur ma ładny post na blogu pokazujący, jak to zrobić. Jego rozwiązanie jest używane do rysowania sześciennych krzywych Beziera, ale możesz łatwo zmienić kod, aby zwrócić współrzędne dla tego, co próbujesz zrobić.

1

Krzywa Beziera jest funkcją parametryczną.Kwadratowa krzywa Beziera (tj. Trzy punkty kontrolne) może być wyrażona jako: F (t) = A (1 - t)^2 + B (1 - t) t + Ct^2 gdzie A, B i C są punktami i t przechodzi od zera do .

to daje dwa równania:

x = a(1 - t)^2 + b(1 - t)t + ct^2 

y = d(1 - t)^2 + e(1 - t)t + ft^2 

Po dodaniu na przykład równanie linii (Y = KX + M), z tym, będzie koniec z trzech równań i trzy niewiadome (x, y i t).

od: How to find the mathematical function defining a bezier curve

za pomocą tego równania można utworzyć tablicę współrzędne X i Y

Powiązane problemy