2016-09-29 8 views
0

ポイントのセットが別のポイントから見えるかどうかを調べようとしています。私は幾何学的なメッシュと観測点(画像上に赤い点)を持っています。メッシュは線分に分割され、線分はそれぞれ中心を持つ(青い矢印)。観測点が他の線分を挟まずに線分の中心を見ることができるかどうかを判断する必要があります。ポイントが表示されているかどうかを確認する

私が追ってきた方法は、観測点と各中心との間の線に垂直な線を計算しようとしています。次に、それぞれの線分をこの線の上に投影し、関係する中心が投影線分の開始点と終了点の間にあるかどうかをチェックします。私はすべてが観測点に目に見える、または見えないようにする。

私は私の質問は2つの部分を持っているreference

としてこれを使用しています。まず、なぜこれが機能していないのか把握することができませんし、第二にこれを行うためのより良い方法がありますか?唯一のシャドウイングの半分である

enter image description here

bool projectPointOntoLine(point observation, vector<segment> segments, int currentIndex){ 

point currentPoint = segments[currentIndex].getCenter(); 

double dx = observation.getX() - currentPoint.getX(); 
double dy = observation.getY() - currentPoint.getY(); 

double m = -dy/dx; 
double mm = m*m; 

double newX = calculateNewX(currentPoint.getX(), currentPoint.getY(), m, mm); 
double newY = calculateNewY(currentPoint.getX(), currentPoint.getY(), m, mm); 

long double minDist = sqrt((currentPoint.getX() - observation.getX())*(currentPoint.getX() - observation.getX()) + (currentPoint.getY() - observation.getY())*(currentPoint.getY() - observation.getY())); 

bool visible = true; 

for(unsigned ii = 0; ii < segments.size(); ii++){ 
    if(ii != currentIndex){ 

     point mid = segments[ii].getStart(); 

     long double dist = sqrt((mid.getX() - observation.getX())*(mid.getX() - observation.getX()) + (mid.getY() - observation.getY())*(mid.getY() - observation.getY())); 

     if(dist < minDist) { 

      point start = segments[ii].getStart(); 
      point end = segments[ii].getEnd(); 

      double newStartX = calculateNewX(start.getX(), start.getY(), m, mm); 
      double newStartY = calculateNewY(start.getX(), start.getY(), m, mm); 

      double newEndX = calculateNewX(end.getX(), end.getY(), m, mm); 
      double newEndY = calculateNewY(end.getX(), end.getY(), m, mm); 

      if ((newX >= newStartX && newEndX >= newX)){// && (newY >= newStartY && newEndY >= newY)) { 
       visible = false; 
      } 
      else if ((newX >= newEndX && newStartX >= newX)){//} && (newY >= newEndY && newStartY >= newY)) { 
       visible = false; 
      } 
     } 

    } 
} 

return visible; 
} 

double calculateNewX(double x, double y, double gradient, double gradientSquared){ 
return (1/(1 + gradientSquared))*(x) + (gradient/(1 + gradientSquared))*(y); 
} 

double calculateNewY(double x, double y, double gradient, double gradientSquared){ 
return (gradient/(1 + gradientSquared))*(x) + (gradientSquared/(1 + gradientSquared))*(y); 
} 

この

は私に次のような結果になります。

+0

'calculateNewX'と' calculateNewY'は何をしますか?読みやすさのために、それらを 'point 'をとり、' point'を返す単一の関数にマージすることを検討してください。スケールの目的は何ですか? 'm 'を計算するときにスケーリングが除外されるようです。 – chtz

+0

申し訳ありません。スケーリングは私が先に何かを試していたときだった。私は今コードセクションを更新しました。 –

答えて

0

どうやら問題はここにある:

if((newX > newStartX && newEndX > newX) && (newY > newStartY && newEndY > newY)){ 
     visible = false; 
    } 

あなたはnewStartXが常に未満newEndXYと同じ)であると推定。これは必ずしも当てはまらない。セグメントの相互の向きと投影する線に応じて、端点が反転することがあります。

+0

'originalStartX'が' originalEndX'よりも小さいかどうかを追加してチェックする必要がありますか?そうでなければ、点を入れ替えてy座標を同じようにしますか? –

関連する問題