Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Синусоидальная кривая! Кто смогёт? (http://www.flasher.ru/forum/showthread.php?t=74981)

veterok4 01.02.2006 23:14

Синусоидальная кривая! Кто смогёт?
 
Вложений: 2
Как говорится и на старуху бывает проруха. Не варят мои тригонометрические мозги:))

Дано:задаётся программно кривая (синяя), см аттач.
необходимо: преобразовать её в синусоидальную кривую, сохраняя направление изгиба (красная).
Я конечно подозреваю, что синусоиду можно разбить на более мелкие кривые, но как при этом сохранить функцию изгиба?

CrazyFlasher 02.02.2006 02:46

2.jpg - никак не синусойда, а график кривой. Читай математику :D

aksios 02.02.2006 10:01

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

veterok4 02.02.2006 10:54

Интересно!
 
Цитата:

Сообщение от CrazyFlasher
2.jpg - никак не синусойда, а график кривой. Читай математику :D

Это синусоида -правда немного "скорректированная" направляющим изгибом... просьба не флудить.
п.с. Сам читай тригонометрию!

Skubent 02.02.2006 11:41

Во втором случае - это что-то вида
y(x) = A*sin(x) + B*sin(k*x);
где A много больше B, k значительно больше 1.

Kotana 02.02.2006 17:01

Цитата:

Сообщение от Skubent
Во втором случае - это что-то вида
y(x) = A*sin(x) + B*sin(k*x);
где A много больше B, k значительно больше 1.

line_mc.lineTo(x, 23*Math.sin(x*100) + 32*Math.sin(x/34) + 100);
line2_mc.lineTo(x, 23*Math.sin(x*100) + 32*Math.sin(x/4) + 300);
x++;

не то, что нужно, но красиво...

Nox Noctis 02.02.2006 17:15

граждане!

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

что я предлагаю:
Код:

var radius = 200;
var amp = 20;
var speed = 1;
// количество завитков за один оборот на 360 градусов
var sin_number = 20;
//
this.createEmptyMovieClip("curve", 0);
curve._x = 200;
curve._y = 200;
curve.speed = speed;
//
curve.createEmptyMovieClip("plotter", 0);
curve.plotter.lineStyle(10, 0, 100);
curve.plotter.lineTo(1, 0);
curve.plotter.radius = radius;
curve.plotter.angle = 0;
curve.plotter.amp = amp;
curve.plotter.sin_number = sin_number;
//
curve.plotter.onEnterFrame = function()
{
        // вот тут синусоида. только по иксу.
        this._x = this.radius+Math.sin(this.angle)*this.amp;
        this.angle += (2*Math.PI/360)*this.sin_number;
};
//
curve.onEnterFrame = function()
{
        // а вот тут движение по дуге.
        // в данном случае в качестве дуги взята окружность.
        var point = {x:this.plotter._x, y:this.plotter._y};
        this.localToGlobal(point);
        _root.lineTo(point.x, point.y);
        //
        this._rotation += this.speed;
};
//
lineStyle(2, 0xFF0000, 50);
moveTo(curve._x+radius, curve._y);

у меня ушло на этот скрипт 15 минут. из них половина - на придумывание.

если нужна не окружность а какая-то хитрая дуга, то путей несколько:

1. двигать внешний клип программно по параболе/еще какой-то формуле.

2. двигать внешний клип по гайду, нарисованному ручками (сами понимаете, чем это удобно и чем не удобно)

3. взять класс Ивана Дембицкого - Path -- и с помощью него двигать внешний клип программно по любой кривой безье, как угодно.

veterok4 02.02.2006 22:09

Nox Noctis - респектище! красиво выглядит, конечно, но мне не нужна замедленная прорисовка... сейчас попытаюсь разобраться с кодом что тут к чему, а потом спроэцировать на свои рандомные дуги:)....тема ещё не закрыта:)

Nox Noctis 02.02.2006 22:56

Цитата:

Сообщение от veterok4
мне не нужна замедленная прорисовка

тогда вот так я бы сделал:
Код:

var center = {x:200, y:200};
var radius = 200;
var amp = 20;
var speed = 1;
var sin_number = 20;
//
var step = (2*Math.PI/360)*sin_number;
//
this.createEmptyMovieClip("curve", 0);
curve.createEmptyMovieClip("plotter", 0);
curve._x = center.x;
curve._y = center.y;
//
lineStyle(2, 0xFF0000, 50);
moveTo(curve._x+radius, curve._y);
//
var angle = 0;
for (var i = 0; i<=360; i += speed) {
        curve.plotter._x = radius+Math.sin(angle)*amp;
        var point = {x:curve.plotter._x, y:curve.plotter._y};
        curve.localToGlobal(point);
        //
        _root.lineTo(point.x, point.y);
        //
        curve._rotation += speed;
        angle += step;
}

те же яйца, только в профиль. :)
заметь, по-прежнему всего один синус.

а если у тебя такие прям произвольные кривые - бери Path Дембицкого и будет тебе щастье. им очень легко пользоваться.

Usnul 03.02.2006 00:22

а я круче Нокса ^_^
Код:

a = 20 //Apmlitude
r = 100 //Radius
n = 30 //Number of oscillations
_root.moveTo(r,0);
_root.lineStyle(2,0x000000,100);
for(i=1;i<=n/4;i+=2){
        _root.curveTo(Math.cos((i-0.5)*(360/n)*Math.PI/180)*(r+a),Math.sin((i-0.5)*(360/n)*Math.PI/180)*(r+a),Math.cos(i*(360/n)*Math.PI/180)*r,Math.sin(i*(360/n)*Math.PI/180)*r);
        _root.curveTo(Math.cos((i+0.5)*(360/n)*Math.PI/180)*(r-a),Math.sin((i+0.5)*(360/n)*Math.PI/180)*(r-a),Math.cos((i+1)*(360/n)*Math.PI/180)*r,Math.sin((i+1)*(360/n)*Math.PI/180)*r);
}

_root._x = _root._y = 200;



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

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