2017-02-23 8 views
1

正方形の2つの対向する点の座標を与えられます(正方形のABCD内の点AとCを言います)。各文字は2D行列の中の点を表します。空の場合は '(空白)、空白の場合は' X '、そして' \ n 'は明らかに行末であり、次の行の先頭です。四角形が回転している可能性があります。これどうやってするの ?2つの反対側の点を与えられた2d行列の正方形を描く方法

このSoftwareEngineering Questionの@ avyskの回答のおかげで、私は正方形の2つの欠けている点を特定できました(私は明らかに質問が保留になって間違ったフォーラムで質問していました)。

今、私は私がのためのロジックを欠けている行列が大きすぎることになっていないので、私は行列のすべてのポイントを反復処理して、そのような

for (y = 0; y < height; y++) { 
    for (x = 0; x < width; x++) { 
     matrix[y][x] = (in_square(x, y, array_of_4_points)) ? 'X' : ' '; 
    } 
} 

などの条件を持っているだろうと考えました。 in_square関数です。

+0

[対角線の端点が与えられた正方形内に点があるかどうかを確認するには、どのようにしてCプログラムを書くのですか?](http://stackoverflow.com/q/42407174/2521214) – Spektre

答えて

1

あなたは内積でこれを行うことができ、あなたは、対角線上にポイントを(Pそれを呼び出す)プロジェクト場合はBとD

を見つける必要はありませんそして、もし対角線点からの距離投影された点から最も近い角(AまたはC)までの距離以下であれば、正方形の内側にあります。これは、 "ライン上にある"と仮定しています。

まず、ポイントがACの方向にどのくらい離れているかを調べます。値は正でなければならないか、他の対角線上の投影点は、次に

bool in_square(Point P, Point A, Point C) 
{ 
    float dot1 = ((P.x - A.x) * (C.x - A.x)) + ((P.y - A.y) * (C.y - A.y)); 
    if(dot1 < 0.0f) 
     return false; 
AとC

間のセグメントの外側にある点はCAの方向にあり、テスト同様にどれだけ離れてCから知ります:

float dot2 = ((P.x - C.x) * (A.x - C.x)) + ((P.y - C.y) * (A.y - C.y)); 
    if(dot2 < 0.0f) 
     return false; 

今対角線(例えば、A)上の点から点Pへのベクトルを算出し、次いで対角線と直交するベクトルでそれの内積を取ります。これはPの対角からの距離を与える。 DOT1とdot2の最小に、この距離の比較:

float dot3 = ((P.x - A.x) * (C.y - A.y)) + ((P.y - A.y) * (A.x - C.x)); 
    if(dot3 < 0.0f) 
     dot3 = -dot3; // abs value 
    if(dot1 < dot2) 
     return dot3 <= dot1; 
    else 
     return dot3 <= dot2; 
} 

私たちは比較や(ACに垂直AC、CA、)ベクトルの長さをしているため、これらのベクターのいずれかを正規化する必要はありませんです毎回同じ。

関連する問題