Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Описать график функций (http://www.flasher.ru/forum/showthread.php?t=184682)

Tails 24.09.2012 18:57

Описать график функций
 
Вложений: 1
Нужно описать небольшую функцию. Так, чтобы передавая x (distance) получать y (power). Точки А и В по оси y всегда лежат на единице, но по оси x их можно задавать.

Супер точно не нужно, вот приблизительный график:

wvxvw 24.09.2012 19:46

Код:

if (x < A) (x + A - 1) * (x + A - 1);
else if (x < B) 1;
else (x - 1) * (x - 1);

Что-то такое?

Simplifier 24.09.2012 20:00

Эм. (x + a)^2 - это сдвиг функции x^2 по оси x на а. А тут вроде бы надо растягивать: сx^2

wvxvw 24.09.2012 20:29

Сорри, погарячился, но скоро все будет :)

Tails 24.09.2012 20:31

Вложений: 1
Цитата:

Сообщение от wvxvw (Сообщение 1097298)
Код:

if (x < A) (x + A - 1) * (x + A - 1);
else if (x < B) 1;
else (x - 1) * (x - 1);

Что-то такое?

У меня так получилось, не совсем то:
Вложение 28497

Код AS3:

function getPos(x:Number, A:Number, B:Number):Number{
        if (x < A) return (x + A - 1) * (x + A - 1);
        else if (x < B) return 1;
        else return (x - 1) * (x - 1);
}
 
var A:Number = 0.7;
var B:Number = 0.8;
 
var margin:Number        = 200;
var step:Number        = 150;
 
this.graphics.beginFill(0xff0000);
 
this.graphics.moveTo(margin-20, margin);
this.graphics.lineStyle(1, 0x000000, 0.5);
this.graphics.lineTo(margin+step, margin);
this.graphics.moveTo(margin, margin+20);
this.graphics.lineTo(margin, margin-step);
 
this.graphics.moveTo(margin, margin);
for(var i:Number = 0; i<=1; i+=0.03){
        this.graphics.lineStyle(1, 0x000000, 1);
 
        var _x:Number = margin+i*step;
        var _y:Number = margin+(-getPos(i, A, B)*step);
        this.graphics.lineTo(_x, _y);
 
        this.graphics.lineStyle(0, 0, 0);
        this.graphics.drawCircle(_x, _y, 2);
 
        this.graphics.moveTo(_x, _y);
}


Simplifier 24.09.2012 20:44

Для первого куска y = сx^2, где с=1/A^2

wvxvw 24.09.2012 21:19

Вложений: 1
ОК, вот, вобщем, с
Код:

if (x < A) ((1 / A) * x)^2;
else if (x < B) 1;
else ((1 / (1 - B)) * (x - 1))^2;

Что мы делаем: в промежутке от 0 до А - чертим функцию y = x^2 сжатую по горизонтали так, чтобы при x = 1, мы бы получили y = A. Следующий промежуток в объяснениях не нуждается - а в последнем - делаем практически то же самое, что и в первом, за исключением того, что мы эту самую квадратичную функцию перевернули горизонтально. Ну и, соответсвенно, сжали ее так, чтобы при x = B, y = 1.

Вложение 28499

Tails 24.09.2012 21:48

wvxvw,
Спасибо большое, только с последним промежутком не получается, слишком большое значение выдает. И скобки где-то не хватает:
Код:

else (1 / (1 - B)) * x)^2;

wvxvw 24.09.2012 22:14

Упс, сорри, опечатался, пофиксил.

Да, еще, такой момент, если это нужно, то "выпуклость" можно регулировать с помощью степени, в которую возводим инкремент.

expl 25.09.2012 11:47

А может тупо кривыми безье семулировать, если подгонка коэффициентов и формул кажется муторной?
Сама безье: https://github.com/cser/temperate/bl...MQuadBezier.hx
А здесь меня заломало вычислять коэффициенты для парабол (эмуляция изинга отскакивающего несколько раз мячика) и просто нарисовал функцию:
https://github.com/cser/temperate/bl...ing/MBounce.hx


Часовой пояс GMT +4, время: 11:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.