web-dev-qa-db-ja.com

通常、プログラミングで直角三角形をどのように実装しますか

軸に沿った2D長方形を実装する場合は、常に_{x, y, w, h}_を使用します。これは、それが自然なアプローチだからです。 3D軸に揃えられた長方形では、{x, y, z, w, h, d(depth)}が必要です。 2D三角形の場合、_{x1, y1, x2, y2, x3, y3}_が必要です。しかし、軸に沿った直角三角形には何が必要ですか。それらをどのように保存しますか?

長方形と同じデータを使用し、次に斜辺の反対側の点を示す0から3の数字を使用することを想像できます。 _{x, y, w, h}_を使用することも想像できます。ここで、whは負になります(通常の四角形の反対)。

直角三角形を実装するための一般的なアプローチはどれですか?

編集:

さて、私は最終的に_{x, y, w, h, r}_を使用することにしました。ここで、w、h> = 0、rはラジアンです。したがって、最初は_r = {0, pi/2, pi, 3pi/2}_に集中でき、後で夢中になりたい場合は、インターフェイスを壊すことなくそれを行うことができます。

1
hgiesel

「一般的なアプローチ」はありません。これは、特別な標準が必要になるほど頻繁に発生する要件ではないためです。したがって、提案したようなニーズに合ったソリューションを選択してください。

{x, y, w, h}、ここでwhは負の値にすることができます

実はそれがあなたの質問を見て頭に浮かんだ最初のアイデアなので、やってみませんか?

これを抽象データ型またはクラスTriangleとして実装する場合、これらの4つの値は内部ストレージ表現としてのみ必要であり、クラスのAPIがその内部を公開する必要はないことに注意してください。たとえば、APIは、APIのユーザーに、1つのコーナーが他の2つのコーナーと「異なる方法で」内部に格納されていることを認識させずに、3つのコーナーの座標を均一にクエリするメソッドを提供できます。したがって、後で内部表現が最適ではないと思われる場合は、APIを使用するコードを変更することなく、後で簡単に変更できます。

したがって、内部表現を考えすぎないでください。APIの設計に時間をかけてください。

6
Doc Brown

三角形は通常、3つのコーナーに3つの座標を格納することによって実装されます。任意の三角形。つまり、2Dか3Dかに関係なく、右、鋭角、正三角形、鈍角、または考えられるあらゆるプロパティがあります。

通常、他の三角形と比較してそれほど多くの特別なプロパティがないため、特別な場合の軸に整列した直角三角形は実際には必要ありません(軸に整列した長方形の半分として解釈できることを除いて、なぜそうしないのですか?その場合は長方形を使用しますか?).

逆に、軸を揃えた直角三角形のみを許可すると、いくつかの問題が発生します。

  • 軸に整列した直角三角形間のギャップは、他の軸に整列した直角三角形で常に埋められるとは限りません。
  • 保存されるデータを減らしてバイトを節約したい場合は、必ずしも明白ではなく、後でバグにつながる可能性のあるいくつかの規則を導入します(負の幅または高さを保存するという「賢い」アイデアを見てください。簡単にバグを導入する可能性があります。負の面積値を計算します!)

あなたのユースケースが別の内部実装から利益を得るのに十分特別であると思うなら、あなたはcould 1つを選びます。その場合は、導入する規則を必ず文書化してください(特に、後で実装を切り替える必要がある場合は、APIが実装の詳細を漏らさないようにしてください)。

3
hoffmale

axis-aligned長方形の場合、通常は{x1、y1、x2、y2}対角線の1つを定義します。これにより、軸に沿った長方形が一意に定義されることに注意してください。したがって、対角線斜辺を持つ2つの(軸に沿った)直角三角形も定義します。 1つだけを一意に定義するには、「右ねじのルール」のようなものを適用します。つまり、手を開いて手のひらを上に向け、右手の親指を{x1、y1}から-の方向に向けます。 {x2、y2}次に、指を直角に向けます。

1
John Forkosh