Witajcie.
Wyobraźmy sobie sytuacje, że wybraliśmy na formatce dwa punkty, oznaczmy je w sposób następujący: A(x1,y1), B(x2,y2).
Punkt A(x1,y1) wskazuje położenie początkowe (środek) względem formy pewnego komponentu, np Paintboxa.
Punkt B(x2,y2) wskazuje położenie końcowe tego komponentu.
Jak zapewne już się domyślacie, chodzi mi o płynny ruch komponentu z punktu A do B po lini prostej, najkrótszą drogą.
Mój sposób rozwiązania zagadnienia jest następujący:
Obliczam równanie prostej przechodzącej przez dwa punkty A i B. (Prosta zawiera przeciwprostokątną trójkąta (najkrótsza droga) o długości boków dx=x2-x1 oraz dy=y2-y1 co do wartości bezwględnej).
Równanie prostej ma postać y=ax+b.
gdzie y - wartość top komponentu, x - wartość left.
Obliczam współczynnik kierunkowy prostej: a = dx/dy, wyraz wolny b z równania b=y1-a*x1.
Komponentem poruszam w Timerze w sposób następujący:
Paintbox1.Left := Paintbox1.Left + 1; // +1, -1 w zależności od położenia punktów.
Paintbox1.Top := a * Paintbox1.Left + b;
Prawie wszystko działa tak, jak chciałem. Obieram dowolny punkt B i komponent porusza się wedle wyznaczonej prostej do tego punktu we wszystkich kierunkach.
Jaki jest problem?
Problem jest z prędkością poruszania się komponentu. Im prosta jest bardziej stroma, tym komponent porusza się szybciej. Najczęściej mniejsza wartość dx oraz większa dy, więc komponent ma dłuższą drogę w pionie niż w poziomie czyli wyliczone wartości y są większe i to powoduje większą prędkość. (większe przeskoki)
Bardzo proszę o cenne wskazówki.