Просмотр полной версии : [любопытным]исходники от D-manа
Вот решил повыкладывать всякие свои скрипты, написанные на досуге. Математика, физика, и всякая мелочь. Они не столько профессиональны в смысле кодинга, сколько образовательны в смысле алгоритма решения.
Ну вы смотрите, читайте, задавайте вопросы, выкладвайте мнения - нада это все / не надо.
Для начала, помнится была тема насчет альтернативы localToGlobal, globalToLocal.
Вот, написал ручками (работает несколько точнее ):
Название: localToGlobal, globalToLocal alternative
Тема: метематика, преобразование координат
MovieClip.prototype.thisToParent = function(my_obj: Object){
var nx, ny, x, y;
x = my_obj.x;
y = my_obj.y;
nx = x;
ny = y;
ang = (this._rotation) * Math.PI /180;
nx = nx * this._xscale / 100;
ny = ny * this._yscale / 100;
x = nx;
y = ny;
nx = x * Math.cos(ang) - y * Math.sin(ang);
ny = x * Math.sin(ang) + y * Math.cos(ang);
nx = nx + this._x;
ny = ny + this._y;
my_obj.x = nx;
my_obj.y = ny;
}
MovieClip.prototype.newLocalToGlobal = function(my_obj: Object){
var c, num, nar;
nar = this._target.toString().split("/");
num = nar.length;
for(c=1;c<=num-1;c++){
pth = "_root."+nar.slice(1,num - c+1).join(".");
eval(pth).thisToParent(my_obj);
}
}
MovieClip.prototype.thisToChild = function(my_obj: Object){
var nx, ny, x, y;
x = my_obj.x;
y = my_obj.y;
nx = x;
ny = y;
ang = (-this._rotation) * Math.PI /180;
nx = nx - this._x;
ny = ny - this._y;
x = nx;
y = ny;
nx = x * Math.cos(ang) - y * Math.sin(ang);
ny = x * Math.sin(ang) + y * Math.cos(ang);
nx = nx / this._xscale * 100;
ny = ny / this._yscale * 100;
my_obj.x = nx;
my_obj.y = ny;
}
MovieClip.prototype.newGlobalToLocal = function(my_obj: Object){
var c, num, nar;
nar = this._target.toString().split("/");
num = nar.length;
for(c=1;c<=num-1;c++){
pth = "_root."+nar.slice(1,c+1).join(".");
eval(pth).thisToChild(my_obj);
}
}
Здесь присутвуют 4 функции: newLocalToGlobal(), newGlobalToLocal() - это понятно. Использовать как оригиналы.
thisToChild(), thisToParent() - поуровневое преобразование от родителя к ребенку и от ребенка к родителю.
mediaman
28.07.2005, 22:07
2 D-man попробуй разглядеть свой код
успхв
cyraxchel
28.07.2005, 22:31
Интересный штука. А не приходилось писать сктипт для программного рисования окружности через lineTo? Если приходилось, скинь пример посмотреть.. я сейчас делаю похожие вещи, размышляю, как это лучше реализовать... :)
mediaman
28.07.2005, 22:48
2 D-MAN та нее, все нормалек, ты просто попробуй доберись до своего кода во флешке, которая с "_xxx", у меня не получилось )
2cyraxchel
Приходилось 2 дня назад. Тока там у меня задача пообщее: построение по трем точкам дуги окружности. Можт скоро выложу
Рисование проще всего сделать циклом.
Но лучше у Iv'а глянь - у него через curveTo организовано.
сктипт для программного рисования окружности через lineTo
супер-мега-простой способ
MovieClip.prototype.drawCircle = function(x, y, radius, cWidth, innerColor, outerColor) {
this.lineStyle(radius, outerColor, 100);
this.moveTo(x, y);
this.lineTo(x, y+0.15);
this.lineStyle(radius-cWidth, innerColor, 100);
this.moveTo(x, y);
this.lineTo(x, y+0.15);
}; :cool:
cyraxchel
28.07.2005, 23:29
2Dvaman
:) Прикольный выход. Но он не подходит мне, т.к. в моем случае мне нужна окружность без заливки. А в этой ванианте это нереально..
я могу нарисовать по трем точкам только квадратичную кривую, дугу надо подумать, не пробовал. полную окружность где-то делал, найду выложу.
так по поводу дуги )))
мож на мысли наведет )))))
MovieClip.prototype.drawCircle = function(x, y, r, segments) {
var endX, endY, controlX, controlY;
if (segments == undefined) {
segments = 8;
}
var segmentAngle = (360/segments)/180*Math.PI;
var controlDist = r/Math.cos(segmentAngle/2);
this.moveTo(x+r, y);
for (var i = 1; i<=segments; i++) {
endX = x+r*Math.cos(i*segmentAngle);
endY = y-r*Math.sin(i*segmentAngle);
controlX = x+controlDist*Math.cos(i*segmentAngle-segmentAngle/2);
controlY = y-controlDist*Math.sin(i*segmentAngle-segmentAngle/2);
this.curveTo(controlX, controlY, endX, endY);
}
};
this.lineStyle(1,0xff000);
this.drawCircle(275,200,200);
cyraxchel
29.07.2005, 10:31
2Dvaman
Во! Оно самое! :)
Спасибо.
Я уже начал вчера примерное то же самое делать, но более извратно. :)
Вот примерно так оно и будет выглядеть:
Немного прототипов =)
// (c) Nuran
_global.MovieClip.prototype.circle = function (x:Number, y:Number, r:Number)
{
var mas:Array = new Array ();
var step:Number = 16;
var angle:Number = 360 / step;
var rad:Number = Math.PI / 180;
for (var i = 0; i <= step; i++)
{
mas[i] = new Object ();
mas[i].x = Math.cos (angle * rad * i) * r + x;
mas[i].y = Math.sin (angle * rad * i) * r + y;
}
this.moveTo (mas[0].x, mas[0].y);
for (var i = 0; i < step; i += 2)
{
var cx = 2 * mas[i + 1].x - 0.5 * (mas[i].x + mas[i + 2].x);
var cy = 2 * mas[i + 1].y - 0.5 * (mas[i].y + mas[i + 2].y);
this.curveTo (cx, cy, mas[i + 2].x, mas[i + 2].y);
}
};
_global.MovieClip.prototype.arc = function (x:Number, y:Number, begA:Number, endA:Number, r:Number)
{
var step:Number = 16;
var mas:Array = new Array ();
var angle:Number = (endA - begA) / step;
var rad:Number = Math.PI / 180;
for (var i = 0; i <= step; i++)
{
mas[i] = new Object ();
mas[i].x = Math.cos ((begA + angle * i) * rad) * r + x;
mas[i].y = Math.sin ((begA + angle * i) * rad) * r + y;
}
for (var i = 0; i < step; i += 2)
{
var cx = 2 * mas[i + 1].x - 0.5 * (mas[i].x + mas[i + 2].x);
var cy = 2 * mas[i + 1].y - 0.5 * (mas[i].y + mas[i + 2].y);
this.curveTo (cx, cy, mas[i + 2].x, mas[i + 2].y);
}
};
_global.MovieClip.prototype.ellipse = function (x:Number, y:Number, begA:Number, endA:Number, rx:Number, ry:Number)
{
var step:Number = 16;
var mas:Array = new Array ();
var angle:Number = (endA - begA) / step;
var rad:Number = Math.PI / 180;
for (var i = 0; i <= step; i++)
{
mas[i] = new Object ();
mas[i].x = Math.cos ((begA + angle * i) * rad) * rx + x;
mas[i].y = Math.sin ((begA + angle * i) * rad) * ry + y;
}
this.moveTo (mas[0].x, mas[0].y);
for (var i = 0; i < step; i += 2)
{
var cx = 2 * mas[i + 1].x - 0.5 * (mas[i].x + mas[i + 2].x);
var cy = 2 * mas[i + 1].y - 0.5 * (mas[i].y + mas[i + 2].y);
this.curveTo (cx, cy, mas[i + 2].x, mas[i + 2].y);
}
};
_global.MovieClip.prototype.rectangle = function (lTopX:Number, lTopY:Number, rBotX:Number, rBotY:Number)
{
this.moveTo (lTopX, lTopY);
this.lineTo (rBotX, lTopY);
this.lineTo (rBotX, rBotY);
this.lineTo (lTopX, rBotY);
this.lineTo (lTopX, lTopY);
};
_global.MovieClip.prototype.superRectangle = function (lTopX:Number, lTopY:Number, rBotX:Number, rBotY:Number, roundness:Number)
{
if (roundness < 0 || roundness > 100 || roundness < 0)
{
var rn:Number = 0;
}
else
{
var rn:Number = roundness;
}
var d0:Number = Math.abs (arguments[3] - arguments[1]);
var d1:Number = Math.abs (arguments[2] - arguments[0]);
var d:Number = d0 < d1 ? d0 : d1;
var r:Number = (0.5 * d / 100) * rn;
var x1:Number = arguments[0] + r;
var x2:Number = arguments[2] - r;
var y1:Number = arguments[1] + r;
var y2:Number = arguments[3] - r;
this.moveTo (arguments[0], y1);
this.arc (x1, y1, 180, 270, r);
this.lineTo (x2, arguments[1]);
this.arc (x2, y1, 270, 360, r);
this.lineTo (arguments[2], y2);
this.arc (x2, y2, 0, 90, r);
this.lineTo (x1, arguments[3]);
this.arc (x1, y2, 90, 180, r);
this.lineTo (arguments[0], y1);
};
_global.MovieClip.prototype.setPixel = function (x:Number, y:Number)
{
this.moveTo (x - .5, y);
this.lineTo (x + .5, y);
this.moveTo (x, y - .5);
this.lineTo (x, y + .5);
};
_global.MovieClip.prototype.polyline = function (mas:Array, nx:String, ny:String)
{
for (var i = 0; i < mas.length; i++)
{
this.lineTo (mas[i][nx], mas[i][ny]);
}
};
_global.MovieClip.prototype.curveThroughThreePoints = function (x1:Number, y1:Number, x2:Number, y2:Number, x3:Number, y3:Number)
{
var cx:Number = 2 * x2 - 0.5 * (x1 + x3);
var cy:Number = 2 * y2 - 0.5 * (y1 + y3);
this.curveTo (cx, cy, x3, y3);
};
И нахрена столько кандыбаний, когда вот так можно:
function drawCircle(mc:MovieClip, x:Number, y:Number, r:Number):Void {
mc.moveTo(x+r, y);
mc.curveTo(r+x, Math.tan(Math.PI/8)*r+y, Math.sin(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y);
mc.curveTo(Math.tan(Math.PI/8)*r+x, r+y, x, r+y);
mc.curveTo(-Math.tan(Math.PI/8)*r+x, r+y, -Math.sin(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y);
mc.curveTo(-r+x, Math.tan(Math.PI/8)*r+y, -r+x, y);
mc.curveTo(-r+x, -Math.tan(Math.PI/8)*r+y, -Math.sin(Math.PI/4)*r+x, -Math.sin(Math.PI/4)*r+y);
mc.curveTo(-Math.tan(Math.PI/8)*r+x, -r+y, x, -r+y);
mc.curveTo(Math.tan(Math.PI/8)*r+x, -r+y, Math.sin(Math.PI/4)*r+x, -Math.sin(Math.PI/4)*r+y);
mc.curveTo(r+x, -Math.tan(Math.PI/8)*r+y, r+x, y);
}
2cyraxchel
попробуй еще с разным количеством сегментов, чем их больше тем сглаженей получается кривая.
2D-man
А в чем неточность localToGlobal и globalToLoacal? вроде как никакого подвоха не замечал.
а ты попробуй с моими функциями сравнить.
родные флешевские частенько выдают вроде:
5.999999999995
тогда как в реале 6.0 (как и у меня)
в некоторых задачах очень быстро накапливается ощутимая ошибка
в конце концов это не практический, а образовательный тред
Для тех кто страдает от проблемы с относительными путями
MovieClip.prototype.getCurrentPath = function() {
str = _root._url;
newstr = str.substring(0, (str.lastIndexOf("/"))+1);
return (newstr);
};
Пример использования:
loadSound(getCurrentPath()+"sound1.mp3");
или
loadSound(getCurrentPath()+"files/1/sound1.mp3");
для нас путь относительный, а для флеша - абсолютный!
на сей раз не исходник, а маленький trick от меня =)
недавно обсуждалась тема (но мне лень ее искать, пусть автор сам найдет мою %) ) как сохранить fps в загруженном клипе, если основной мувик имеет другой fps
было предложена куча разных извратных способов (это не камень в чейнить огород - не думайте), вплоть до смены кадров по setInterval'у
Все решается гораздо проще. В SoundForge делаем маленький пустой звук, зажимаем его под минимальный битрейт и кладем его на основной таймлайн (и/или на нужные для синхронизации таймлайны) нашего мувика как Stream. Voila!
PS Если такой способ был предложен ранее, прошу не ругать. Это не попытка выпендриться - это попытка помочь другим.
в некоторых задачах очень быстро накапливается ощутимая ошибка
если величина погрешности останется примерно на одном и том же уровне, то отклонение на 1px произойдет через 200 млрд. проходов (вложенности) ;)
в конце концов это не практический, а образовательный тред поддерживаю. по крайней мере если я и не буду использовать этом прием то хоть погляжу как это можно было бы реализовать :)
зы есть еще интересные хитрости из жизни флеша? поделись
если величина погрешности останется примерно на одном и том же уровне, то отклонение на 1px произойдет через 200 млрд. проходов (вложенности) ;)
Это если сложение, а если синусы, косинусы, а сосбенно тангенсы - ваще жопа. Тем более во многих задачах требуется строгое равенство (читай высокая точность).
зы есть еще интересные хитрости из жизни флеша? поделись Есть. Буду выкладывать потихоньку, а то ветка бытро умрет. ;)
PS Приму любые идеи для выкладывания, в общем пишите, что вам интересно (в приват, чтоб ветку не засирать), людям с вопросами типа как сделать прелоадер, просьба не беспокоиться =)
на сей раз не исходник, а маленький trick от меня =)
недавно обсуждалась тема (но мне лень ее искать, пусть автор сам найдет мою %) ) как сохранить fps в загруженном клипе, если основной мувик имеет другой fps
было предложена куча разных извратных способов (это не камень в чейнить огород - не думайте), вплоть до смены кадров по setInterval'у
Все решается гораздо проще. В SoundForge делаем маленький пустой звук, зажимаем его под минимальный битрейт и кладем его на основной таймлайн (и/или на нужные для синхронизации таймлайны) нашего мувика как Stream. Voila!
PS Если такой способ был предложен ранее, прошу не ругать. Это не попытка выпендриться - это попытка помочь другим. а ты знаешь какой-нить способ динамической регулировки фпса? setInterval не предлагать
KidsKilla
01.08.2005, 17:48
кстати, про прелоадер -- хотел сделать класс-мультилоадер, а всё как-то руки не дошли =)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.