PDA

Просмотр полной версии : считывание координат програмной кривой


Forcasigun
17.04.2008, 15:01
помогите пожалст решить такую задачку))):
есть програмный сплайн, с задаными координатами конца, начала и центра....
известно что линия проходит через некоторый диапозон значений по Х, (от 10 - до 30, например..)
можно ли в заданом "Х" узнать координату по "У" этого сплайна??...
============
хотя это вообще не сама цель, просто мне показалось, что такое решение наиболее подходящее....

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

вот....
заранее спасибо))

Vertax
17.04.2008, 15:10
Если не хоца заморачиваться с "полностью" программными сплайнами (отличный пример http://flash-ripper.com/tests/bezier.ru/demo/test.swf), то hitTest.

Forcasigun
17.04.2008, 15:45
дело то не в сплайне... дело в координатах точек на этом сплайне)))....
посмотрел пример, есть кое что, что наверняка поможет... но у меня почему то .fla не открывается у hitTesta(( выкидывает с крит ошибой)
можешь код выложить сцены под 6 номером))? тама где точка двигается по сплайну...

iNils
17.04.2008, 15:46
http://bezier.ru

Forcasigun
17.04.2008, 15:57
о.... спасибо))... будем разбираться))

Forcasigun
18.04.2008, 00:51
я конечно извиняюсь за наглость)))....
но, не поможете решить уравнение по поводу этих кривых... или может кто сталкивался с подобной задачей...
ситуация такова:
вот уравнение которое описывает построение кривой Безье -
Pt = S*(1-t)^2+2*C*(1-t)^t+E*t^2
Pt - точка на кривой; S - точка начала кривой; C - точка центра; E - точка конца кривой; t - интератор по которому строятся точки

и это уравнение надо привести к виду t=.....
что бы зная координаты точки на кривой, например по Х... можно было найти интератор t... и через него выяснить координату по У, тойже точки....

я уже голову сломал....)) продолжаю ломать, но решил может не один я попыхчу..))

Vertax
18.04.2008, 15:08
Ты б исходник, или скрин требуемой части показал. На 348% уверен, что есть более простые методы добиться того, что нужно. Ты ж все таки не векторный редактор пишешь.

Forcasigun
19.04.2008, 07:50
ну может и есть более простые для конкретной задачи.....
мне бы хотелось что бы меню (движок меню) было легко редактировать по любой следующий дизайн....

вот исходник.....

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

Vertax
19.04.2008, 20:54
Лови, постарался менять как можно меньше.

Forcasigun
20.04.2008, 00:25
у меня видимо совсем старенький флеш))))... не открывается совсем))).... можешь в двух словах идею расказать и swf фаил кинуть как оно получилось))
спасиб!))

Vertax
20.04.2008, 04:42
Сорри CS3, в настройках выставляешь AS2, кружки M1...M6, полоска MMM, дальше думаю, докумекаешь, а свой код узнаешь:
_global.frames = 24;
//количество кадров за которое будет выполнена анимация
_global.dx = 0.1;
//коэффициент, чем меньше значение, тем более плавная остановка (допустимые значения любые положительные числа не равные "0")
_global.ish = 40;
//начальное положение по "у" после нажатия

for (i = 1; i < 7; i++)
{
mc = eval ("M" + i);
mc.onRollOver = function ()
{
var x = 0;
var objY = this._y;
var k = Math.abs(objY-bar._y);
var a = Math.pow((k+dx)*(1/dx), 1/frames);
var b = Math.log(k+dx)/Math.log(a);
onEnterFrame = function()
{
if (x<frames)
{
x++;
newY = Math.pow(1/a, x-b)-dx;
if (objY-_root.bar._y<0)
{
bar._y = objY+newY;
}
else
{
bar._y = objY-newY;
}
bar._x = 150;
for (j = 0; j < 150; j++) if (MMM.hitTest(170 - j, bar._y, true))break;
bar._x = 240 - j;

}
else
{
delete onEnterFrame;
}
}
}
mc.onPress = function ()
{
var x = 0;
var objY = ish;
var k = Math.abs(objY-bar._y);
var a = Math.pow((k+dx)*(1/dx), 1/frames);
var b = Math.log(k+dx)/Math.log(a);
onEnterFrame = function()
{
if (x<frames)
{
x++;
newY = Math.pow(1/a, x-b)-dx;
if (objY-bar._y<0)
{
bar._y = objY+newY;
}
else
{
bar._y = objY-newY;
}
}
else
{
delete onEnterFrame;
}
};
}
}

Forcasigun
20.04.2008, 13:04
да спасиб еще раз))).... все впринципе понятно... остались кое какие мелочи из серии "а почему так?" но думаю разберемся))))....

самое смешное, что накануне читал как раз про HitTest, но ничего не понял... щас еще разок перечитаю)))

про eval первый раз слышу очень удобно оказывается))... за эт тоже спасиб))..

Forcasigun
22.04.2008, 22:09
не то что бы не разобрался с хитТестом...
просто уж очень я упертый)))...

вот и я все таки решил это уравнение....:

при условии что мы знаем координаты 3х узловых точек кривой (S-начальная; C-центр; E-конечная) и некую произвольную координату, например по Y (P.y), принадлежащую этой кривой....

и нам надо найти координату по X (P.x), так что бы точка с координатами P.x;P.y лежала на кривой.

для этого нам необходимо найти переменную t:

P = S(1-t)^2+2C.yt(1-t)+Et^2; (1)

t = -(b/a+((b/a)^2-4c/a)^0.5)/2 (2)
---------
где:
a = S-2C+E;
b = 2(C-S);
c = S-P.y
---------
теперь все что надо для того что бы найти координату (P.x) надо получившееся значение t подставить в первую формулу...

получается примерно так как в примере...
если приглядется то движение по "формуле" (слева) куда плавнее движения "по хитТесту"....