2016-09-29 118 views
0

我試圖找出一個點集是否是另一點可見。我有一個幾何網格和一個觀察點(圖像上的紅點)。網格被分解成線段,每個線段都有一箇中心(藍色箭頭)。我需要確定觀察點是否可以看到線段的中心,而沒有任何其他線段在中間。確定是否點可見

我一直在下面試圖計算垂直於所述觀察點和各中心之間的線的線的方法。然後將每個線段投影到該線上,並檢查我所關心的中心是否位於投影線段的起點和終點之間。我要麼讓觀察點的一切都可見或不可見。

我用這作爲reference

我的問題有兩個部分。首先,我不知道爲什麼這不起作用,其次是有更好的方法來做到這一點?

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); 
} 

這給了我以下結果:

enter image description here

僅是陰影的一半。

+0

什麼'calculateNewX'和'calculateNewY'嗎?爲了可讀性,考慮將它們合併爲一個函數,該函數需要一個「點」並返回一個「點」。 「規模」的目的是什麼?在計算'm'時,縮放似乎會被分解出來。 – chtz

+0

對不起。縮放是我早些時候嘗試的時候。我已經更新了代碼部分。 –

回答

0

顯然,問題就在這裏:

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

你假定newStartX始終小於newEndX(與Y相同)。情況並非一定如此。取決於分段和要投影的線的相互方向,端點可能會翻轉。

+0

那麼我只需要添加並額外檢查'originalStartX'是否小於'originalEndX',否則交換點並且對y座標執行相同操作? –

相關問題