Стартовая позиция (по крайней мере в примере) известна - начальная координата.
Конечная позиция тоже (например рандом).
Иначе как пойти в магазин если ты не знаешь где магазин и где ты?))
Составляешь уравнение прямой и прибавляешь соответствующие числа:
Код:
var k, b, x, y:extended;
...
//Стартовая инициализация:
x:=x1;
//Y не нужно, он будет все время пересчитываться "с нуля" для повышения точности
...
//уравнения прямой вида y=kx+b:
k:=(Y1-Y2)/(X1-X2); // x1,x2,y1,y2 - координаты первой и второй точек
b:=y1-k*x1;
...
//дальше прибавляем по X например 1, а по Y находим из уравнения:
x:=x+1;
y:=k*x+b;
//можно еще так: если |K|<1 то прибавляем по X и ищем Y, иначе
//прибавляем по Y и ищем X. Тогда будет отрабатываться лучше.
//А еще лучше вычислять скорость по осям X и Y в зависимости от K,
//исходя из того, что K - тангенс угла наклона скорости к оси OX:
{
// Инициализация после подсчета K:
Vx:=1*cos(arctan(k)); // В данном случае 1 - скорость по прямой в Пикс/срабатываний таймера
vy := k * vx;
...
x:=x+Vx;
y:=y+Vy;
}
//и двигаем:
Image1.Left:=round(x);
Image1.Top:=round(y);
В таком случае надо хранить в глобальных переменных начальные и конечные точки, или же один раз посчитать K и B для каждой картинки и хранить их.
Проект - движущаяся картинка: едет в направлении, заданном тыканьем мышки на форме.