PDA

Просмотр полной версии : Замкнутая линия по произвольным точкам


Ilya
06.07.2002, 02:13
Громадный привет всем !

Я тут несколько (а точнее капитально :) отстал от жизни и на третий день сидения в MX спинной мозг начал подсказывать что наверняка не мне первому понадобилось нарисовать фигуру с минимально изрезанными краями по произвольно расположенным точкам ? :) Получасовой поиск на форумах ничего толком не дал, но все равно не верится что до сих пор нигде нету стандартной функции для подобных задач... В общем если кто-нибудь видел где-то, ткните старого лентяя носом в урл :)
Или начинать бороться с ленью садиться писать самому ? :)

sergwizard
06.07.2002, 04:07
И тебе не менее громадный.

Фигуру, или контур? Согласись, - разные вещи. Что значит "с минимально изрезанными краями"? Возьмем четыре точки, являющиеся вершинами квадрата. По этим точкам можно провести окружность, квадрат, треугольник и еще массу контуров разнообразнейших фигур. Если ты имеешь в виду, что эти точки должны быть вершинами многоугольника, то - конечно - можно. В приложенном исходнике – определены четыре точки (для простоты). На известном баннере мастера У.Б. "Стань известным, добавь свой исходник", определено множество точек, образующих надпись. Там не фигура, - там посложнее. Но, как видишь, можно.
Правильно ли я тебя понял?

rolling_tmp
06.07.2002, 13:47
привет!

вот если у тебя точки на плоскости и есть их порядок, то тогда
простой алгоритм

создаеш курву от первой точки до второй
якорь ставишь меж них по центру

при содздании последующих точек якоря ставишь в точку симметрно предидущему якорю относительно начальной точки кривой.

вот код, только концевые точки уж сам соедини
(чтобы заработало - код в первый фрейм, в библиотеке пустой мувик с линкаджем spline )


function Spline(){
this.n=5
this.init(this.n);
}
Spline.prototype = new MovieClip();

Spline.prototype.init= function(n){
var i=0;
while (i<n){
if(i==0){
var j=0;
} else {
j=1;
}
while (j<3){

this.createEmptyMovieClip (i+""+j, i*100 + j);

this[i+""+j].onPress =function(){
startDrag(this,true);
this.onEnterFrame = function(){
this._parent.redraw();
}
}
this[i+""+j].onRelease =function(){
stopDrag();
delete this.onEnterFrame;

}
if(j==1){
//this[i+""+j]._visible=false;
}

with (this[i+""+j]){
if (j==1){
beginFill (0xCC0000, 100);
} else {
beginFill (0xFFFFFF, 100);
}
lineStyle (0, 0x000000, 50);
moveTo (-5, -5);
lineTo (5, -5);
lineTo (5, 5);
lineTo (-5, 5);
lineTo (-5, -5);
endFill();



_x =50+i*100 + j* 50;
_y=200;
init_x =_x;
init_y = _y;


}
this[i+""+j].init_x =this[i+""+j]._x;
this[i+""+j].init_y =this[i+""+j]._y;
//this[i+""+j].createTextField("lbl",11,10,-5,300,20);
//this[i+""+j].lbl.text = i+""+j;

j++;

}
with ( this){

lineStyle( 0, 0x0000FF, 100 );
if(i==0){
moveTo( this[i+""+0]._x, this[i+""+0]._y );
} else {
moveTo( this[(i-1)+""+2]._x, this[(i-1)+""+2]._y );
}
curveTo( this[i+""+1]._x, this[i+""+1]._y, this[i+""+2]._x, this[i+""+2]._y );
//trace(spline[i+""+1]._x+":"+ spline[i+""+1]._x);
}

i++;
}
}

Spline.prototype.redraw= function(){
this.clear();

//this[0+""+1]._x= this[0+""+0]._x +(this[0+""+2]._x - this[0+""+0]._x)/2;
//this[0+""+1]._y= this[0+""+0]._y +(this[0+""+2]._y - this[0+""+0]._y)/2;

var i=1;

while (i<this.n){
this[i+""+1]._x= this[(i-1)+""+2]._x +(this[(i-1)+""+2]._x - this[(i-1)+""+1]._x);
this[i+""+1]._y= this[(i-1)+""+2]._y +(this[(i-1)+""+2]._y - this[(i-1)+""+1]._y);
i++;
}


///////////////
var i=0;
while (i<this.n){
with ( this){

lineStyle( 0, 0x0000FF, 100 );
if(i==0){
moveTo( this[i+""+0]._x, this[i+""+0]._y );
} else {
moveTo( this[(i-1)+""+2]._x, this[(i-1)+""+2]._y );
}
curveTo( this[i+""+1]._x, this[i+""+1]._y, this[i+""+2]._x, this[i+""+2]._y );
}

i++;
}

}
Object.registerClass("spline" /*symbolID*/, Spline /*theClass*/ );

_root.attachMovie("spline","spl", 0);

Ilya
07.07.2002, 20:25
Hi !

Спасибо всем громадное :) теперь у меня хотя бы появилась пища для размышлений :)