![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2007
Сообщений: 89
|
Привет!
Для рисования кривых по точкам использовал функцию:
function Multicurve(Xargs, Yargs, closed)
{
var Xmid = Xargs.slice(0);
var Ymid = Yargs.slice(0);
if ((Xmid.length != Ymid.length) || (Xmid.length < 2))
{
trace('Wrong Arguments');
return this;
}
if (Xmid.length == 2)
{
this.moveTo(Xmid[0],Ymid[0]);
this.lineTo(Xmid[1],Ymid[1]);
delete Xmid;
delete Ymid;
return this;
}
var Xpoint = new Array();
var Ypoint = new Array();
for (var i = 1; i < Xmid.length - 2; i++)
{
Xpoint[i] = 0.5 * (Xmid[i + 1] + Xmid[i]);
Ypoint[i] = 0.5 * (Ymid[i + 1] + Ymid[i]);
}
if (closed)
{
Xpoint[0] = 0.5 * (Xmid[1] + Xmid[0]);
Ypoint[0] = 0.5 * (Ymid[1] + Ymid[0]);
Xpoint[i] = 0.5 * (Xmid[i + 1] + Xmid[i]);
Ypoint[i] = 0.5 * (Ymid[i + 1] + Ymid[i]);
Xpoint[i + 1] = 0.5 * (Xmid[i + 1] + Xmid[0]);
Ypoint[i + 1] = 0.5 * (Ymid[i + 1] + Ymid[0]);
Xmid[i + 2] = Xmid[0];
Ymid[i + 2] = Ymid[0];
Xpoint[i + 2] = Xpoint[0];
Ypoint[i + 2] = Ypoint[0];
}
else
{
Xpoint[0] = Xmid[0];
Ypoint[0] = Ymid[0];
Xpoint[i] = Xmid[i + 1];
Ypoint[i] = Ymid[i + 1];
Xmid.pop();
Ymid.pop();
}
this.moveTo(Xpoint[0],Ypoint[0]);
for (var i = 1; i < Xmid.length; i++)
{
this.curveTo(Xmid[i],Ymid[i],Xpoint[i],Ypoint[i]);
}
delete Xmid;
delete Ymid;
delete Xpoint;
delete Ypoint;
return this;
}
Object.prototype.multicurveTo = Multicurve;
Если при создании контура эту функцию использовать один раз, то все ок. Но если присоздании контура ее использовать дважду, в любых комбинациях, то при заливке появляются странные незапланированные артифакты. Хотя без заливки контур нормальный. С заливкой же контур имеет странную форму. Подскажите, с чем это связано? |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 89
|
Вот тестовые данные.
1. Функция один раз ссылается на Multicurve. Здесь все нормально. function drawTest()
{
this.lineStyle(2,0x9fff999,255);
xa = new Array();
ya = new Array();
this.beginFill(0xF02D17,255)
xa[0] = 600;
ya[0] = 20;
xa[1] = 650;
ya[1] = 30;
xa[2] = 670;
ya[2] = 80;
this.moveTo(400,20)
this.lineTo(600,20);
this.multicurveTo(xa,ya,false);
this.lineTo(400,20);
this.endFill();
}
Object.prototype.drawTest = drawTest;
function drawTest()
{
this.lineStyle(2,0x9fff999,255);
xa = new Array();
ya = new Array();
this.beginFill(0xF02D17,255)
xa[0] = 600;
ya[0] = 20;
xa[1] = 650;
ya[1] = 30;
xa[2] = 670;
ya[2] = 80;
this.moveTo(400,20)
this.lineTo(600,20);
this.multicurveTo(xa,ya,false);
xa[0] = 670;
ya[0] = 80;
xa[1] = 650;
ya[1] = 90;
xa[2] = 400;
ya[2] = 100;
this.lineTo(670,80);
this.multicurveTo(xa,ya,false);
this.lineTo(400,20);
this.endFill();
}
Object.prototype.drawTest = drawTest;
unction drawTest()
{
this.lineStyle(2,0x9fff999,255);
xa = new Array();
ya = new Array();
//this.beginFill(0xF02D17,255)
xa[0] = 600;
ya[0] = 20;
xa[1] = 650;
ya[1] = 30;
xa[2] = 670;
ya[2] = 80;
this.moveTo(400,20)
this.lineTo(600,20);
this.multicurveTo(xa,ya,false);
xa[0] = 670;
ya[0] = 80;
xa[1] = 650;
ya[1] = 90;
xa[2] = 400;
ya[2] = 100;
this.lineTo(670,80);
this.multicurveTo(xa,ya,false);
this.lineTo(400,20);
//this.endFill();
}
Object.prototype.drawTest = drawTest;
|
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Ну так вы же рисуете и рисуете, получается одна фигура. Если линии пересекаются, возможны дырки.
Надо в какой-то момент сказать endFill() и начать рисовать следующюю фигуру (beginFill) А кстати зачем вы мультикривую в прототип к Object добавляете? Добавляйте к MovieClip, все равно никто кроме него рисовать не умеет. |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 89
|
Но ведь тут то и странность что линии не пересекаются!
|
|
|||||
|
Modus ponens
|
А так?
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 89
|
Дело в том, что я рисую сложную фигуру из линий и кривых, и проблемс то в том, что не получается за один раз эту фигуру закрасить. И чем эта фигура сложнее, тем проблематичнее залатывать этот баг.
|
|
|||||
|
Modus ponens
|
А мой вариант не помог?
А вообще, да рисовал бы из простых составляющих, если сложно... зачем самому себе жизнь усложнять? Т.е. разбей свою фигуру на простые примитивы, и рисуй по частям - во-первых, проще будет понять, где не сростается, во-вторых - тебе же легче будет. Как тут уже сказали, если ты не будешь "поднимать-опускать перо" beginFill-endFill то и результаты могут быть далеко не теми, какие ты ожидаешь... Или... еще проще, нарисуй на бумажке/в паинте чего собираешься рисовать, мб решение ещe проще.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 22.10.2007 в 18:26. |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 89
|
Ок. Спасибо.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 03:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|