pierwszy z pierwszych Należy zrozumieć użycie algorytmu w Bezier, Kiedy koduję program przez C# Który był pełen materiału graficznego użyłem beziers i wiele razy musiałem znaleźć punkt współrzędnych w beziera, który wydaje się nieprzyzwoicie na pierwszy rzut oka. więc to, co zrobiłem, to napisanie funkcji Cubic bezier w mojej klasie math kostiumów, która była w moim projekcie. więc najpierw podzielę się z tobą kodem.
//--------------- My Costum Power Method ------------------\\
public static float FloatPowerX(float number, int power)
{
float temp = number;
for (int i = 0; i < power - 1; i++)
{
temp *= number;
}
return temp;
}
//--------------- Bezier Drawer Code Bellow ------------------\\
public static void CubicBezierDrawer(Graphics graphics, Pen pen, float[] startPointPixel, float[] firstControlPointPixel
, float[] secondControlPointPixel, float[] endPointPixel)
{
float[] px = new float[1111], py = new float[1111];
float[] x = new float[4] { startPointPixel[0], firstControlPointPixel[0], secondControlPointPixel[0], endPointPixel[0] };
float[] y = new float[4] { startPointPixel[1], firstControlPointPixel[1], secondControlPointPixel[1], endPointPixel[1] };
int i = 0;
for (float t = 0; t <= 1F; t += 0.001F)
{
px[i] = FloatPowerX((1F - t), 3) * x[0] + 3 * t * FloatPowerX((1F - t), 2) * x[1] + 3 * FloatPowerX(t, 2) * (1F - t) * x[2] + FloatPowerX(t, 3) * x[3];
py[i] = FloatPowerX((1F - t), 3) * y[0] + 3 * t * FloatPowerX((1F - t), 2) * y[1] + 3 * FloatPowerX(t, 2) * (1F - t) * y[2] + FloatPowerX(t, 3) * y[3];
graphics.DrawLine(pen, px[i - 1], py[i - 1], px[i], py[i]);
i++;
}
}
jak widać powyżej, to jest droga dzieło Funkcja Beziera i czerpać taką samą Baziera jak Microsoft Beziera Funkcja zrobić (mam go przetestować). możesz uczynić go jeszcze bardziej dokładnym poprzez zwiększenie rozmiaru tablicy i rozmiaru licznika lub narysować elipse zamiast linii & .... Wszystkie one zależą od potrzeb i poziomu dokładności, jakich potrzebujesz i ....
Powracając do głównego celu, pytanie brzmi: jak obliczyć długość?
dobrze Odpowiedź jest taka, że mamy tony punktu, a każdy z nich ma współrzędną xi współrzędną y, która pamięta nas w kształcie trójkąta &, szczególnie w kształcie Right Right. więc jeśli mamy punkt p1 & p2, możemy obliczyć odległość ich jako akordu RightTriangle. jak pamiętamy z naszej lekcji matematyki w szkole, w ABC Triangle typu RightTriangle, acord Lenght to -> Sqrt (Angle's FrontCostalLenght^2 + Angle's SideCostalLeghth^2);
i istnieje ta relacja między wszystkimi punktami, dla których obliczamy długość między bieżącym punktem a ostatnim punktem przed bieżącym punktem (exmp p [i - 1] & p [i]) i zapisujemy ich sumę w zmiennej. pozwala pokazać go w kodzie poniżej
//--------------- My Costum Power Method ------------------\\
public static float FloatPower2(float number)
{
return number * number;
}
//--------------- My Bezier Lenght Calculator Method ------------------\\
public static float CubicBezierLenghtCalculator(float[] startPointPixel
, float[] firstControlPointPixel, float[] secondControlPointPixel, float[] endPointPixel)
{
float[] tmp = new float[2];
float lenght = 0;
float[] px = new float[1111], py = new float[1111];
float[] x = new float[4] { startPointPixel[0], firstControlPointPixel[0]
, secondControlPointPixel[0], endPointPixel[0] };
float[] y = new float[4] { startPointPixel[1], firstControlPointPixel[1]
, secondControlPointPixel[1], endPointPixel[1] };
int i = 0;
for (float t = 0; t <= 1.0; t += 0.001F)
{
px[i] = FloatPowerX((1.0F - t), 3) * x[0] + 3 * t * FloatPowerX((1.0F - t), 2) * x[1] + 3F * FloatPowerX(t, 2) * (1.0F - t) * x[2] + FloatPowerX(t, 3) * x[3];
py[i] = FloatPowerX((1.0F - t), 3) * y[0] + 3 * t * FloatPowerX((1.0F - t), 2) * y[1] + 3F * FloatPowerX(t, 2) * (1.0F - t) * y[2] + FloatPowerX(t, 3) * y[3];
if (i > 0)
{
tmp[0] = Math.Abs(px[i - 1] - px[i]);// calculating costal lenght
tmp[1] = Math.Abs(py[i - 1] - py[i]);// calculating costal lenght
lenght += (float)Math.Sqrt(FloatPower2(tmp[0]) + FloatPower2(tmp[1]));// calculating the lenght of current RightTriangle Chord & add it each time to variable
}
i++;
}
return lenght;
}
jeśli chcesz mieć szybsze obliczanie wystarczy zmniejszyć px & py długość tablicy i liczyć loob.
Możemy również zmniejszyć zapotrzebowanie na pamięć, zmniejszając px i py do długości tablicy do 1 lub utworzyć prostą podwójną zmienną, ale ze względu na sytuację warunkową, która spowodowała zwiększenie naszego dużego O, nie zrobiłem tego.
Mam nadzieję, że to ci pomogło. jeśli masz inne pytanie, po prostu zapytaj. Z pozdrowieniami, Hejdar - Islamska Republika Iranu.
Zobacz http://stackoverflow.com/a/28764614/107090. – lhf
@st bardzo trudno dostać formularz odpowiedzi tam (jeśli jest tu w ogóle odpowiedź, 99% prawdopodobnie nie) Potrzebuję bezpośredniej odpowiedzi w c lub pseudokod nie zaawansowanych dokumentów matematycznych bardzo trudne do odczytania – user2214913
Dlaczego się spodziewać kodu łatwo dostępne? Jak często sądzisz, że ktoś musi znać dokładną długość krzywej Beziera? Jeśli chcesz zrobić coś, czego nigdy wcześniej nie robiono, spodziewaj się trochę pracy. –