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

6-2 データの座標と視点の座標と描画の座標

マップ上を移動するためには、データの座標系とは別に視点の座標系を考える必要がでてきます。描画の座標系は視点に準じます。
ここでは、視点関連のデータをParamControlクラスに保持させ、また、データの座標を引数として、ParamControlクラスが視点に準じた座標を返します。
class ParamControl{
    private var scale:Number;
    private var cx:Number;
    private var cy:Number;
    private var MINSCALE :Number =100;
    private var MAXSCALE :Number =100*64;

    function ParamControl(){
        setCenterPos(0,0);
        setScale(400);
    }

    private function setCenterPos(x:Number,y:Number):Void{
        cx=x;
        cy=y;
    }

    private function getCenterX():Number{
        return cx;
    }

    private function getCenterY():Number{
        return cy;
    }

    private function setScale(scale:Number):Void{
        this.scale=scale;
    }

    private function getScale():Number{
        return scale;
    }

    public function changePos(x:Number,y:Number):Void{
        setCenterPos(x,y);
    }

    public function changePosScaleUp(x:Number,y:Number):Void{
        var s:Number=getScale();
        s*=2;
        if(s>=MAXSCALE){
            s=MAXSCALE;
        }
        setScale(s);
        setCenterPos(x,y);
    }

    public function changePosScaleDown(x:Number,y:Number):Void{
        var s:Number=getScale();
        s/=2;
        if(s<=MINSCALE){
            s=MINSCALE;
        }
        setScale(s);
        setCenterPos(x,y);
    }

    public function getScreenX(x:Number):Number{
        return (x-getCenterX())*getScale()/100;
    }

    public function getScreenY(y:Number):Number{
        return (y-getCenterY())*getScale()/100;
    }

    public function getDataX(x:Number):Number{
        return x*100/getScale()+getCenterX();
    }

    public function getDataY(y:Number):Number{
        return y*100/getScale()+getCenterY();
    }
}
また、ここでは、マップの全データをDataStorageが保持していますが、描画該当部分のみのノードとエッジを取り出す必要があります。メソッドの返り値はArray型です。
前述のように、Array型はキャストができないため、返り値として用いる場合は注意が必要です。ここでは、返り値用のArrayを新規で作成し、適宜、このArrayにpushメソッドで加えていくため、キャストは必要ありません。
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;
        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);
        lineList[index].index1=getPointIndexFromId(point1);
        lineList[index].index2=getPointIndexFromId(point2);
    }

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

    private function getPointIndexFromId(id:String):Number{
        var ret:Number;
        for(var i:Number=0;i<getPointListLength();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 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 getAreaPoint(x1:Number,y1:Number,x2:Number,y2:Number):Array{
        var ret:Array=new Array();
        for(var i:Number=0;i<getPointListLength();i++){
            var x:Number=getPointPosX(i);
            var y:Number=getPointPosY(i);
            if(x1<=x && x2>=x && y1<=y && y2>=y){
                ret.push(i);
            }
        }
        return ret;
    }

    public function getAreaLine(x1:Number,y1:Number,x2:Number,y2:Number):Array{
        var ret:Array=new Array();
        var points:Array=getAreaPoint(x1,y1,x2,y2);
        for(var i:Number=0;i<getLineListLength();i++){
            var line1:Number=getLineIndex1(i);
            var line2:Number=getLineIndex2(i);
            var flag1:Boolean=false;
            var flag2:Boolean=false;
            for(var j:Number=0;j<points.length;j++){
                if(line1==Number(points[j])){
                    flag1=true;
                }
            }
            for(var j:Number=0;j<points.length;j++){
                if(line2==Number(points[j])){
                    flag2=true;
                }
            }
            if(flag1 || flag2){
                ret.push(i);
            }
        }
        return ret;
    }
}
getAreaLineメソッドはもう少し検討する余地があるように思います。



BACKTOPNEXT




All Contents Copyright (C) 2005 HOSHI Tetsuya
Home