0

必要なアルゴリズムが何を行うのかをより少ない言葉で定式化する方法がわかりません。そのような質問はすでにここで回答されている可能性が高いですが、検索方法がわかりません。

私が必要とするのは次のとおりです。
私は一種の 2D グラフ プロット プログラムを書いています。明らかに、主要な座標線のみを描画することはあまり適切ではありません。なぜなら、グラフは原点から離れた場所に配置される可能性があり、主要な線のみが描画されると、ユーザーはそのサイズを参照できなくなるからです。
基準線、つまり一定の間隔で周期的に現れる水平線と垂直線を引くことにしました。これは、たとえば整数に対応しています。ただし、スケーリングの可能性があるため、一定の間隔を使用してもうまく機能しません。たとえば、ユーザーが単位正方形の内部を確認するためにズームインすると、サイズを参照することなく、ほぼ空のボックスが再び表示されます。

したがって、参照線を描画するために使用する間隔を何らかの方法で再スケーリングする必要があります。言い換えれば、double -> double現在のスケール係数 (使用するものは、長さの 1 単位に含まれるピクセル数を指定する) またはそれに適用される関数の値 (たとえば、可能な単位長の最大数) を受け入れるタイプの関数が必要です。いくつかの軸に沿って画面内に収まる)、step の値 (論理単位のピクセル単位は関係ありません)、つまり基準線間の間隔の長さを返します。

そのような関数の値のセットは可算無限になると思います。つまり、この関数はスケール係数値の間隔をステップの固定値にマッピングします。アルゴリズムの大まかな説明、またはより正確には、必要なマッピングを提供できます。これは次のようになります (入力値は画面内の最大ユニット数です)。

  • ...
  • [5..9] -> 0.25
  • [9..15] -> 0.5
  • [15..30] -> 1
  • ...

ここでの値は純粋に経験的なものであり、説明のためにのみ使用されています。

ただし、この一連のマッピングをより広い範囲のスケール係数値に外挿する方法はわかりません。そのような依存関係を分析的に表現する方法は言うまでもありません。しかし、私は多くのグラフ作成プログラムでそのようなことを見たので、これが可能であると確信しています.

必要なものに非常に近いこの質問を見つけましたが、ラベルの幅について言及しており、ラベルがないため、その答えを自分のタスクに適応させることができませんでした。

4

1 に答える 1

1

1 桁 (10 のべき乗) に対して正確に定義し、他の桁を同様に処理して元に戻すことができます。

double tickStep(double pixelDistance)
{
     if(pixelDistance <= 3.0)
       return(tickStep(pixelDistance * 10.0) / 10.0);
     else if(pixelDistance > 3.0 && pixelDistance <= 5.0)
        return(0.125);
     else if(pixelDistance > 5.0 && pixelDistance <= 9.0)
        return(0.25);
     else if(pixelDistance > 9.0 && pixelDistance <= 15.0)
        return(0.5);
     else if(pixelDistance > 15.0 && pixelDistance <= 30.0)
        return(1.0);
     else if(pixelDistance > 30.0)
        return(tickStep(pixelDistance / 10.0) * 10.0);
}

アイデアを明確にするために再帰を使用しましたが、おそらくlogandを使用する方が効率的powです。

于 2013-01-22T23:23:36.220 に答える