Математическая задача с плавным масштабированием на холсте - PullRequest
1 голос
/ 24 июля 2011

Всем математикам, пожалуйста, прочитайте весь вопрос, на который можно ответить без знания HTML5: -)

Я масштабирую (масштабирую) холст HTML5, и я хочу сделать это за множество маленьких шагов вместо одного большого шага, чтобы сделать скроллинг «гладким». Чтобы объяснить это:

Когда пользователь поворачивает колесо прокрутки, однажды моя цель - увеличить холст на 20%. Теперь я хочу разделить это на, скажем, 20 маленьких шагов.

Моя проблема в том, что из-за ограниченной библиотеки canvas я могу использовать для этого только метод scale (xscale, yscale) в 2d Context. Таким образом, я не могу установить единицы к определенному размеру, который облегчит это. Я должен использовать фактор на каждом этапе и не могу понять, как это можно сделать.

Таким образом, единицы измерения моего холста равны 100 на шаге 1, я хочу, чтобы они были равны 130 на шаге 20 с 19 маленькими шагами между ними.

  1. oldscale: 100,: фактор: x, newscale: 101
  2. oldscale: 101,: фактор: x, newscale: 102
  3. oldscale: 102,: фактор: x, newscale: 103

......

Переменные i теперь являются текущим номером шага (0-19), итогами (20) и целевым увеличением в процентах (20)

Это очень простой пример того, что мне нужно. Основная проблема в том, что у меня есть доступ только к X, и я не могу напрямую влиять на весы.

Кто-нибудь может помочь? Надеюсь, я хорошо это объяснил.

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Не в чем ваша проблема:

Но я думаю, что вы хотите найти x такой, что:

(1+x)**numberofStep - 1 = pourcentageOfIncrease  //** is power

=> x= numberOfStepsNTHROOTOF(1+pourcentageOfIncrease) -1

для numberofStep = 20 и pourcentageOfIncrease = 20

вы найдете: x=pow(1+20%,1/20.)-1= 0.00916 = 0.916% increase at each step

Примечание: Это похоже на вычисление сложного процента , но для масштабирования.Вы вычисляете масштаб на каждом шаге, чтобы получить общий масштаб.

Надеюсь, я понял вашу проблему, и это поможет

1 голос
/ 24 июля 2011

Вам нужен 20-й корень из 130/100.Для его вычисления используйте

k = Math.exp(Math.log(130/100) / 20)

k, повышенное до 20-й степени, будет 130/100.

...