Расчет времени анимации

Здравствуйте.
Подскажите пожалуйста как правильно расчитать анимацию движения с учетом fps?

Вот у меня простой код. Шарик должен двигаться по синусоиде с частотой 1 герц.
То есть за 1 сек нужно сделать оборот.

 thread = new Thread(new ThreadStart(() =>
                {
                        double sin = R * Math.Sin(angle * grad);
                        angle += step;
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            Canvas.Info = "Test: " + Hzs[testCnt].ToString() + " Hz, " + secTimes[testCnt] + " sec., TotalTime:  " + stw.Elapsed.Seconds.ToString() + " sec.";
                            if (IsVertical)
                            {
                                Canvas.Markerpos = new Point(Canvas.ActualWidth / 2, Canvas.ActualHeight / 2 + sin);
                            }
                            else
                            {
                                Canvas.Markerpos = new Point(Canvas.ActualWidth / 2 + sin, Canvas.ActualHeight / 2);
                            }
                            Canvas.InvalidateVisual();
                            //Canvas.UpdateLayout();
                        }));
                        Thread.Sleep(threadDelay);
                    }
                    onTestCanceledEvent?.Invoke();
                }));
                thread.Start();

А как мне сделать так чтобы обойтись без Thread.Sleep(threadDelay); и сделать максимально плавную отрисовку с максимальным фпс.
А то сейчас я делю на фиксированное количество шагов и глазом заметно что элемент дергается при подходе к центру.

Умножать на время прошедшее с начала?

Типа как тут https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame#examples