2013-09-04 3 views
0

회선으로부터의 거리를 계산 중입니다. 그러나 나는 틀린 거리를 얻고있다. 다음은 줄에서 거리를 가져 오는 코드 조각입니다.회선으로부터의 거리가 작동하지 않는다

float px,py,something,u; 
px=x2-x1; 
py=y2-y1; 

something = px*px + py*py; 

u = ((x - x1) * px + (y - y1) * py) /(something); 


if(u > 1) 
{ 
    u = 1; 
    // MinDist=0; 
} 
else if (u < 0) 
{ 
    u = 0; 
    //MinDist=0; 
} 


float xx = x1 + u * px; 
float yy = y1 + u * py; 

float dx = xx - x; 
float dy = yy - y; 

float dist= (float)Math.sqrt((double)dx*dx +(double) dy*dy); 

Dist가 잘못 답하고 있습니다.

+0

다음을 검토해 보시기 바랍니다 : http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Vector_formulation – weston

+0

거기에 사용할 수있는 알 고리가 있습니까? –

+1

자세한 내용을 제공해 주시겠습니까? 정확히 무엇이 주어 졌는가? 선의 방정식이 주어 졌습니까? 어떤 형태로? 적절한 변수 이름을 사용하고, 주석을 제공하고, '무언가'와 같은 변수 이름을 사용하지 않는다면 도움이되었을 것입니다. – Vikram

답변

2

에서 : http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Vector_formulation

distance(x=a+tn, p) = ||(a-p)-((a-p).n)n|| 

장소 :

a = (x1, y1)    //First point on line 
n = |(x2-x1, y2-y1)|  //Normalised direction vector 
p = (x, y)    //Query point 

그래서, 모든 것을 할,하지만 기능을하고 포뮬러에 따라 도움이되는 의미있는 이름을 부여하지 않을 :

float[] a = new float[]{x1, y1}; 
float[] n = new float[]{x2-x1, y2-y1}; 
normalize(n); 
float[] p = new float[]{x, y}; 

float[] aMinusP = subtract(a, p); 
float aMinusPDotn = dot(aMinusP, n); 

// vec2a.vec2b 
float dot(float[] vec2a, float[] vec2b) 
{ 
    return vec2a[0]*vec2b[0] + vec2a[1]*vec2b[1]; 
} 

// ||vec2|| 
float len(float[] vec2) 
{ 
    return (float)Math.Sqrt(dot(vec2, vec2)); 
} 

// vec2/||vec2|| 
void normalize(float[] vec2) 
{ 
    float length = len(vec2); 
    vec2[0] /= length; 
    vec2[1] /= length; 
} 

// vec2a - vec2b 
float[] subtract(float[] vec2a, float[] vec2b) 
{ 
    return new float[]{vec2a[0]-vec2b[0],vec2a[1]-vec2b[1]}; 
} 
+0

sqrt soemthing가 거리를 제공합니까? –

+0

선점은 (x, y)이고 선은 (x1, y1) (x2, y2)입니다. 내가 라인에서 포인트의 거리를 계산하고 싶습니다 –

+0

위의 코드는 2 점 사이의 거리를주고 있습니다. 나는 점과 선 사이의 거리를 갖고 싶습니다. –

관련 문제