JAVAC.JP
HOSHI TETSUYA 星鉄矢
2005/07/25
hossy@javac.jp
http://www.javac.jp
Google
WWW を検索 WWW.JAVAC.JP を検索

5-5 エッジの再描画処理の最適化

さて、さきほどの自己最適化(もどき)においては、リアルタイムにノード・エッジともに動くので、
・全ノードの移動
・全エッジの再描画
が必要だったのですが、その前のGraphに関してはどうでしょう。
ドラッグして1つのノードを動かしている最中に全エッジの再描画を行うことは、エッジが大量に存在する場合は、望ましい方法とは言えません。関連したエッジのみの再描画に留めるのがよいかと考えられます。
方法ですが、あるノードに対して、そのノードに付いているエッジを登録することで、再描画するエッジを指定できるようにします。ノードに対し付いているエッジは不変なので、Array型でデータを保持します。
class GraphDataStorage{
    private var pointList:Array;
    private var lineList:Array;

    function GraphDataStorage(){
        reset();
    }

    public function reset():Void{
        pointList=new Array();
        lineList=new Array();
    }

    public function getPointListLength():Number{
        return pointList.length;
    }

    public function getLineListLength():Number{
        return lineList.length;
    }

    public function addPoint(id:String,x:Number,y:Number):Number{
        var o:Object=new Object();
        o.id=id;
        o.x=x;
        o.y=y;
        o.connecter=new Array();
        pointList.push(o);
        return getPointListLength()-1;
    }

    public function addLine(id:String,point1:String,point2:String):Number{
        var o:Object=new Object();
        o.id=id;
        o.point1=point1;
        o.point2=point2;
        lineList.push(o);
        return getLineListLength()-1;
    }

    private function addPointIndexToLine(index:Number):Void{
        var point1:String=String(lineList[index].point1);
        var point2:String=String(lineList[index].point2);
        var pointIndex1:Number=getPointIndexFromId(point1);
        var pointIndex2:Number=getPointIndexFromId(point2);
        lineList[index].index1=pointIndex1;
        lineList[index].index2=pointIndex2;
        addConnecter(pointIndex1,index);
        addConnecter(pointIndex2,index);
    }

    public function addPointIndexToLineLists():Void{
        var len:Number=getLineListLength();
        for(var i:Number=0;i<len;i++){
            addPointIndexToLine(i);
        }
    }

    private function addConnecter(pointIndex:Number,lineIndex:Number):Void{
        pointList[pointIndex].connecter.push(lineIndex);
    }

    private function getPointIndexFromId(id:String):Number{
        var ret:Number;
        for(var i:Number=0;i<pointList.length;i++){
            var targetId:String=String(pointList[i].id);
            if(id==targetId){
                ret=i;
                break;
            }
        }
        return ret;
    }

    public function getPointId(index:Number):String{
        return String(pointList[index].id);
    }

    public function getPointPosX(index:Number):Number{
        return Number(pointList[index].x);
    }

    public function getPointPosY(index:Number):Number{
        return Number(pointList[index].y);
    }

    public function getConnecterLength(index:Number):Number{
        return Number(pointList[index].connecter.length);
    }

    public function getConnecter(pointIndex:Number,index:Number):Number{
        return Number(pointList[pointIndex].connecter[index]);
    }

    public function getLineId(index:Number):String{
        return String(lineList[index].id);
    }

    public function getLineIndex1(index:Number):Number{
        return Number(lineList[index].index1);
    }

    public function getLineIndex2(index:Number):Number{
        return Number(lineList[index].index2);
    }

    public function setPointPosition(index:Number,x:Number,y:Number):Void{
        pointList[index].x=x;
        pointList[index].y=y;
    }
}



BACKTOPNEXT




All Contents Copyright (C) 2005 HOSHI Tetsuya
Home