PDA

Просмотр полной версии : Масштабируемое отображение ребер графа.


proxiServer
30.10.2009, 10:58
Делается следующее. На некоторой области отображается граф. Вершины и ребра. Граф масштабируется. Т.е. по событию вращения колесика мыши я по определенному закону сдвигаю вершины. Соответственно нужно и ребра перерисовать.

Ребра я рисую следующим образом. У меня есть мувиклип. Размер 10х10. Я вычисляю нужную мне длину линии и выставляю мувиклипу width. Получаю линию. Дальше вычисляю угол поворота ну и ставлю клип в нужную начальную координату.

Хочется посоветоваться на тему правильно ли я рисую ребра.

Проблема 1. Когда я задумывал эту схему, я думал что при повороте клипа поворачиваются и его координаты. Т.е. думал что смогу в последствии просто регулировать width и угол поворота созданных ребер. Но оказалось, что оси остаются на месте. И что бы перерисовать одно ребро я ставлю ему rotation=0, меняю width на новый и меняю снова rotation на новый.

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

lexa2000lexa
30.10.2009, 11:23
а что вам мешает, отрисовывать ваш граф в отдельный мувик, а потом его маштабировать, и не нужно будет перерисовывать ребра.

proxiServer
30.10.2009, 11:27
lexa2000lexa, то что ребра и узлы не должны изменяться в размере. допустим для узлов это можно сделать noscale-ом. Но вот линии. Мне нужно чтобы они всегда были одной и той же толщины, а вот длина должна меняться.

lexa2000lexa
30.10.2009, 16:18
пример из хелпа import flash.geom.Rectangle;
import flash.geom.Matrix;

this.createEmptyMovieClip("my_mc", this.getNextHighestDepth());

var grid:Rectangle = new Rectangle(20, 20, 260, 260);
my_mc.scale9Grid = grid ;

my_mc._x = 50;
my_mc._y = 50;

function onMouseMove()
{
my_mc._width = _xmouse;
my_mc._height = _ymouse;
}

my_mc.lineStyle(20, 0xff3333, 100);
var gradient_matrix:Matrix = new Matrix();
gradient_matrix.createGradientBox(15, 15, Math.PI, 10, 10);
my_mc.beginGradientFill("radial", [0xffff00, 0x0000ff],
[100, 100], [0, 0xFF], gradient_matrix,
"reflect", "RGB", 0.9);
my_mc.moveTo(0, 0);
my_mc.lineTo(0, 300);
my_mc.lineTo(300, 300);
my_mc.lineTo(300, 0);
my_mc.lineTo(0, 0);
my_mc.endFill();


разберайте, должно помоч вам.