-1

私はコンレックの悪夢を見ています。Conrec を使用して ActionScript で等高線を実装しようとしています。Java と JavaScript の両方の実装を調べましたが、まだ行き詰まっています。これらはここにあります: http://paulbourke.net/papers/conrec/

Conrec はグリッド データを取得し、連続した等高線を組み立てます。問題は、必ずしもこれらの線を連続的に描画するとは限らないことです。たとえば、A、B、C、D などではなく、A->B、C->B、C->D の順に描画します。

JavaScriptの実装はこれを考慮しており、命令をドローポイントの配列にシリアライズしているようです。それは私も最終的に達成したいことです。つまり、コア Conrec ロジック (例: A->B、C->B、C->D など) から命令を取得し、A、B、C、D シリーズに編成します。破線に対応するためにシリーズを多次元配列として返すこともあると思います(例:[[A、B、C、D]、[E、F、G]] )この最後の機能は、Actionscript で行う必要があるものです。

この最後の部分は、私が立ち往生しているところです。今のところ Conrec は無視します (Actionscript の実装を見つけることをあきらめました)。これらの命令をシリアル ポイントのコレクションにまとめるにはどうすればよいでしょうか? Conrec から「X->Y からポイントを描画する」というメッセージが表示された場合、X または Y が既にシリーズに含まれているかどうかを最初に確認し、X または Y (シリーズに含まれていない方) をシリーズに追加するにはどうすればよいですか? そして、どちらもシリーズにない場合は、X、Y をスターティング セットとして新しいシリーズを開始します。次に、既存のすべてのシリーズと接続シリーズに対して後続の命令をチェックし、それらが同じポイントで開始および停止する場合は? また、シリーズがそれ自体を閉じることができるようにする必要があります (例: A、B、C、A) -- ループ (それは可能ですか?!)。

これが理にかなっていることを願っています。「連結」を超えてやりたいことを表す専門用語があるかどうかはわかりません。また、誰かが Conrec でこれを行い、私にいくつかの指針を与えてくれることを願っています。

それまでの間、私はこれを続けて、何かを思いつくことができるかどうかを確認しますが、自分の能力に自信がありません. ベテランや専門家のアドバイスに本当に感謝しています。

PS: グリッド データから等高線を描画する別の方法を知っている場合は、代替案を受け入れます。しかし、Actionscript で実装できなければなりません。

4

3 に答える 3

0

ConRec を Actionscript3 に移植したところ、うまく動作しているようです。完全にはテストしていませんが、期待どおりに輪郭を描画します。よろしければ試してみてください。正しいポートかどうか知りたいです。それはここにあります:

http://www.jvanderspek.com/DEV/ConRec/ConRec.as

于 2011-04-05T23:59:32.047 に答える
0

わかりました、これが私が必要なことを成し遂げるための私の最初の試みです。結果にはあまり満足していませんが、うまくいっているようです。

package {
  import flash.display.Sprite;

  public class lineSeriesPointConcat extends Sprite {
    public function lineSeriesPointConcat() {
      init();
    }
    //directions [X -> Y]
    //case 1: both counterclockwise, result is counterclockwise
    private var case1:Array = [
      ["G1", "F1"], 
      ["F1", "E1"], 

      ["D1", "C1"],
      ["C1", "B1"],
      ["B1", "A1"], 

      ["E1", "D1"], //link
      ["G1", "A1"] //loop
    ];

    //case 2: clockwise, counterclockwise, result is clockwise
    private var case2:Array = [
      ["E2", "F2"], 
      ["F2", "G2"], 

      ["D2", "C2"], 
      ["C2", "B2"], 
      ["B2", "A2"], 

      ["E2", "D2"], //link
      ["G2", "A2"] //loop
    ];

    //case 3: both clockwise, result is clockwise
    private var case3:Array = [
      ["E3", "F3"], 
      ["F3", "G3"], 

      ["A3", "B3"], 
      ["B3", "C3"], 
      ["C3", "D3"], 

      ["E3", "D3"], //link
      ["G3", "A3"] //loop
    ];

    //case 4: counterclockwise, clockwise, result is clockwise
    private var case4:Array = [
      ["G4", "F4"], 
      ["F4", "E4"], 

      ["A4", "B4"], 
      ["B4", "C4"], 
      ["C4", "D4"], 

      ["E4", "D4"], //link
      ["G4", "A4"] //loop
    ];


    private var collectedSeries:Array = [];

    private function init():void {
      var directions:Array = case1.concat(case2.concat(case3.concat(case4)));
      for each (var direction:Array in directions) {
        connect(direction[0], direction[1]);
      }
      trace ("final series:\n\t" + collectedSeries.join("\n\t"));
    }

    private function connect(from:String, to:String):void {
      var series:Array;
      var seriesStart:String;
      var seriesEnd:String;
      var seriesIndex:int;
      var n:int = collectedSeries.length;
      var i:int;
      for (i = 0; i < n; i++) {
        series = collectedSeries[i];
        seriesStart = series[0];
        seriesEnd = series[series.length - 1];

        if (seriesStart == to) {
          seriesStart = from;
          series.unshift(from);
          break;
        } else if (seriesStart == from) {
          seriesStart = to;
          series.unshift(to);
          break;
        } else if (seriesEnd == to) {
          seriesEnd = from;
          series.push(from);
          break;
        } else if (seriesEnd == from) {
          seriesEnd = to;
          series.push(to);
          break;
        }
      }

      if (i == n) {
        //this is a new series segment
        series = [from, to];
        seriesStart = from;
        seriesEnd = to;
        collectedSeries.push(series);
      }

      for (var j:int = 0; j < n; j++) {
        var compareSeries:Array = collectedSeries[j];
        if (compareSeries == series) {
          //don't compare the series to itself.
          continue;
        }
        var compSeriesStart:String = compareSeries[0];
        var compSeriesEnd:String = compareSeries[compareSeries.length - 1];
        if (compSeriesStart == compSeriesEnd) { 
          //this series loops on itself, it will not concatenate further
          continue;
        }
        if (compSeriesStart == seriesEnd) {
          trace ("case 1");
          series = series.concat(compareSeries.slice(1));
        } else if (compSeriesStart == seriesStart) {
          trace ("case 2");
          series = compareSeries.reverse().concat(series.slice(1));
        } else if (compSeriesEnd == seriesStart) {
          trace ("case 3");
          series = compareSeries.concat(series.slice(1));
        } else if (compSeriesEnd == seriesEnd) {
          trace ("case 4");
          series = compareSeries.concat(series.reverse().slice(1));
        } else {
          //no linkage between these two series
          continue;
        }
        collectedSeries[i] = series; //replace one of the two segements
        collectedSeries.splice(j, 1); //splice out the other
        break;
      }
      trace ("series: " + series + (i == n ? " new" : ""));
    }
  }
}

これにより、次の結果が得られます。

A1、G1、F1、E1、D1、C1、B1、A1

G2、A2、B2、C2、D2、E2、F2、G2

G3、A3、B3、C3、D3、E3、F3、G3

G4、A4、B4、C4、D4、E4、F4、G4

アドバイスやフィードバックをいただければ幸いです。誰もConrecを使っていない? !

編集:おっと!元の splice() にバグがありました! ごめん!現在修正済み

于 2011-04-01T01:05:29.910 に答える