2015-06-27 2 views
2

У меня есть круг на моем холсте. Положение мыши вычисляется относительно холста. Я хочу, чтобы круг двигался, когда мышь находится на < = расстояние в 100px от него. Минимальное расстояние для начала движения - 100 пикселей, 0,5 пикселя/галочка. Он достигает 2px/tick на расстоянии 20px.Выполнение алгоритма

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

То, что я до сих пор движется круг, когда расстояние меньше или равно 100 - (я использую библиотеку easeljs)

function handleTick() { 
    distance = calculateDistance(circle, mX, mY); 
    if (distance<=100) { 
     circle.x += 0.3; 

    stage.update(); 
    } 
} 

То, что я хочу

function handleTick() { 
    distance = calculateDistance(circle, mX, mY); 
    if (distance<=100) { 
     circleSpeed = // equation that takes distance and outputs velocity px/tick. 
     circle.x += circleSpeed; 

    stage.update(); 
    } 
} 

Так что я думал это была математическая проблема и опубликовала ее на математическом обмене, но пока ответов нет. Я пробовал по нескольким темам: «как найти уравнение для отношения», так как у меня есть домен (100, 20) и диапазон (0,5, 2). Какая функция может их связывать?

Дело в том, что я плохо разбираюсь в математике, и эти цифры могут даже не иметь отношения - я не уверен, что я ищу здесь.

Должен ли я писать случайный алгоритм «circleSpeed = 2x + 5x;» и надеяться, что он сделает то, что я хочу? Или можно сделать так, как я, - «Я хочу, чтобы они были минимальными и максимальными значениями, теперь мне нужно придумать уравнение для этого»?

Указатель в правильном направлении был бы замечательным, потому что пока я снимаю в темноте.

+1

Вы собираетесь изменить скорость на 1,5 пикселя на расстоянии 80px -> а изменение 0.01875 пикс скорости на пиксель. – Rishav

+3

вы забыли одну важную информацию: какой должна быть связь между скоростью и расстоянием? линейный, логарифмический, ... – Paul

+0

@Paul вы еще больше запутаете OP с такими терминами: p – Rishav

ответ

5

Если я правильно понимаю, вы хотите circleSpeed быть функцией distance, так что

  • circleSpeed является 0.5 когда distance является 100.
  • circleSpeed является 2 когда distance является 20.

Существуют функции бесконечности, которые выполняют это, поэтому я буду считать линейность.

Уравнение линии с наклоном m и которая содержит точку (x₀,y₀) является

y = m (x-x₀) + y₀ 

Но в этом случае у вас есть два очка, (x₁,y₁) и (x₂,y₂), так что вы можете рассчитать склон с

y₂ - y₁ 
m = ─────── 
    x₂ - x₁ 

Так уравнение линии

y₂ - y₁ 
y = ─────── (x - x₁) + y₁ 
    x₂ - x₁ 

С вашими данными,

0.5 - 2 
y = ──────── (x - 20) + 2 = -0.01875 x + 2.375 
    100 - 20 

Поэтому

circleSpeed = -0.01875 * distance + 2.375 
+0

. Ты заставляешь меня выглядеть математически оспариваемой ... – Rishav

+1

И ты заставляешь меня @ РишавКунду, где это меня покидает? xD – Harlequin

+0

@Oriol 'a' - это то, что в этом уравнении? 'b' - это место, где линия пересекает ось y. «b» - это «y1» в вашем решении, почему? откуда взялось 2.375? = P – Harlequin

2

Предполагаете, что вам нужна линейная зависимость между расстоянием и скоростью?

Если да, вы можете сделать что-то вроде circleSpeed = (2.5 - 0.5(distance/20)). Это, однако, установило бы скорость линейно от 0 до 2,5 на диапазоне (от 100 до 0), но с помощью другого, если бы это было if (distance < 20) circleSpeed = 2, вы ограничили бы скорость до 2,0 в диапазоне 20.

Это не на 100% точнее того, что вы просили, но довольно близко, и оно должно выглядеть нормально. Думаю. Его можно было бы также подстроить, чтобы приблизиться.

Однако, если вы хотите, чтобы круг отошел от мыши, вам также нужно что-то сделать, чтобы рассчитать правильное направление движения, а ваша проблема немного сложнее, чем вам нужно рассчитать speed_x и speed_y

+0

Да, я собирался сделать это после скорости. Спасибо, все еще читаю через – Harlequin

1

Вот простой фрагмент для анимации скорости linear, что означает, что ускорение круга будет постоянным.

if distance > 100: 
    print 0 
elseif distance < 20: 
    print 2 
else: 
    print 2 - (distance -20) * 0.01875 

Возможны и другие отношения (другие облегчения, которые вы могли бы назвать их), но они будут сложнее, хе-хе.

EDIT: Упс, я допустил ошибку.