5

頂点のリストがあります。つまりList<Point>、正方形の次の点が含まれています:(0,0)、(1,0)、(2,0)、(3,0)、(4,0)、(4,1)、 (4,2)、(4,3)、(4,4)、(3,4)、(2,4)、(1,4)、(0,4)、(0,3)、(0 、2)、(0,1)、(0,0)

ここに画像の説明を入力してください

正方形を描くには、4つのポイント(0,0)、(0,4)、(4,4)、(4,0)が必要ですが、リストから冗長な(直線になる)ポイントを削除するにはどうすればよいですか?

必ずしも正方形とは限りませんが、基本的には直線になったらポイント数を減らしたいと思います。たとえば、(0,0)、(0,1)、(0,2)、(0,3)、(0,4)は、4つのポイントすべてを描画する代わりに直線を作成し、ポイントから線をすばやく描画します。 (0,0)、(0,4)。

4

2 に答える 2

5

p0一度に3つの連続するポイントを見てください(それらをp1、、と呼びましょうp2)。p2 = p0 + k(p1 - p0)ここkで、が任意の実数である場合、これらの3つの点は同一線上にあります(1本の線を形成します) 。上記の条件は、連立方程式で表すことができます。

(x2 - x0) = k(x1 - x0)
(y2 - y0) = k(y1 - y0)

理論的には、あなたがする必要があるのは、3つのポイントの各セットを順番に取るだけです。kxコンポーネントとyコンポーネントのの値を計算します。それらが同じである場合、線は同一線上にあるため、を削除しp1ます。

実際には、固定小数点または浮動小数点の制限により、これは一般的なケースではより注意が必要になります。同一線上にあるはずのポイントは、座標が量子化されると完全に同一線上にない場合があります。したがって、比較を行うときに、ある程度の許容誤差を考慮する必要がある場合があります。

于 2011-01-09T17:23:44.947 に答える
0

これを自動的に行う1つの方法は、minX、maxX、minY、およびmaxYの組み合わせを含むポイントを取得することです(これは最も広がりのある座標であり、配列内の他のポイントはすべて長方形の境界内にあると想定しています)。

これがあなたが考えている質問に答えない場合は、もう少し詳細と制約を与えることをお勧めします。

于 2011-01-09T17:20:34.543 に答える