Основные математики для анимации - PullRequest
4 голосов
/ 17 мая 2011

Предполагая, что у меня есть форма и нарисовал на ней овал. Затем я хочу взять элемент управления (например, поле для рисунков) и (удерживая верхний левый угол элемента управления точно на линии), я хочу переместить элемент управления за пикселем, следуя нарисованному овалу.

По сути, я хочу вычислить верхнюю / левую точку для каждой позиции / пикселя в моем овале. Я знаю, что это базовая формула, но я не могу на всю жизнь вспомнить, как она называется или как ее достичь.

Кто-нибудь хочет помочь?

Example

Ответы [ 2 ]

4 голосов
/ 17 мая 2011
double step=1.0; //  how fast do you want it to move

double halfWidth=100.0; //  width of the ellipse divided by 2
double halfHeight=50.0; //  height of the ellipse divided by 2

for (double angle=0; angle<360; angle+=step)
{
    int x=(int)halfWidth * Math.Cos(angle/180*Math.PI);
    int y=(int)halfHeight * Math.Sin(angle/180*Math.PI);
    pictureBox.TopLeft=new Point(x,y);
}

РЕДАКТИРОВАТЬ:

Теперь, если вы собираетесь спросить, почему он не движется, если вы напишите это так - вам нужно будет добавить обработку цикла сообщений в виде:

Application.DoEvents();

, который вы поместите внутри цикла.

1 голос
/ 17 мая 2011

Каноническая форма эллипса:

x-x^2/a^2 + y^2/b^2 = 1

, где a = Xradius и b = Yradius.Так, например, если вы хотите, чтобы верхняя левая точка прямоугольника на нижней стороне эллипса:

y = Sqrt((1-x^2/a^2)*b^2)

upd: чтобы переместить эллипс в указанную точку XC,YC, замените каждый x на(x-XC) и (y-YC).так что если вы (в C #) рисуете эллипс в прямоугольнике, то XC = rect.X + a YC = rect.Y + b и окончательное уравнение y = Sqrt((1 - Pow(x - rect.X - rect.Width / 2, 2) * Pow(rect.Height / 2, 2)) + rect.Y + rect.Height / 2 ... кажется правильным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...