2012-01-30 3 views
1

저는 문자 그대로 이것에 몇 시간 동안 붙어있어서 상당히 실망합니다. 나는 산발적 인 결과를 얻고있다. 프로그램은 언젠가는 작동하지만, 수학적으로는 하나 일 수는 있지만, 다른 시간에, 내가 찾고있는 "tangents"중 하나를 찾을 수 없습니다.C가 산발적 인 결과를 얻었습니다.

저는 누군가가 멍청한 놈을 도울 수있는 시간이 있다면, C#을하는 것이 정말 새롭습니다.

private List<PointF> SplitAndSolve(Graphics g, List<PointF> pointList) 
    { 
     if (pointList.Count < 4) 
      return pointList; 
     List<List<PointF>> leftAndRight = SplitByX(pointList); 
     List<PointF> left = leftAndRight[0]; 
     List<PointF> right = leftAndRight[1]; 
     drawPolygon(g, left);// just a way to visually assess the correctness 
     drawPolygon(g, right);// same 
     left = SplitAndSolve(g, left); 
     right = SplitAndSolve(g, right); 
     Combine(g, left, right); 
     return pointList; 
    } 
    private List<PointF> Combine(Graphics g, List<PointF> left, List<PointF> right) 
    { 
     //find tangents 
     List<PointF> topTangents = GetTangents(g, left, right, TOP); 
     drawPoint(g, topTangents[0]);//visual debug 
     drawPoint(g, topTangents[1]);//visual debug 
     List<PointF> botTangents = GetTangents(g, left, right, BOT); 
     drawPoint(g, botTangents[0]);//visual debug 
     drawPoint(g, botTangents[1]);//"" 
     // get a new polygon 

     return left;// just a place holder so I don't get errors for the time being 
    } 
    private List<PointF> GetTangents(Graphics g, List<PointF> left, List<PointF> right, float topOrBot) 
    { 
     List<PointF> tangents = new List<PointF>(); 
     foreach (PointF leftAnchor in left) 
     { 
      foreach (PointF rightAnchor in right) 
      { 
       double lax = leftAnchor.X; 
       double lay = leftAnchor.Y; 
       double rax = rightAnchor.X; 
       double ray = rightAnchor.Y; 
       double m = (lay - ray)/(lax - rax); 
       double b = (-1 * m * lax) + lay; 
       bool isTangent = true; 
       foreach (PointF lpoi in left) 
       { 
        if ((topOrBot == TOP) && (Test(m, b, lpoi) > 0)) 
        { 
         isTangent = false; 

        } 
        if ((topOrBot == BOT) && (Test(m, b, lpoi) < 0)) 
        { 
         isTangent = false; 

        } 
       } 

       foreach (PointF rpoi in right) 
       { 
        if ((topOrBot == TOP) && (Test(m, b, rpoi) > 0)) 
        { 
         isTangent = false; 

        } 
        if ((topOrBot == BOT) && (Test(m, b, rpoi) < 0)) 
        { 
         isTangent = false; 

        } 
       } 
       if (isTangent) 
       { 
        tangents.Add(leftAnchor); 
        tangents.Add(rightAnchor); 
        return tangents; 
       } 

      } 

     } 
     return null; 
    } 

    /* Test, test to see the location of a point in relation to a line 
    * @float m slope of the line 
    * @float b the constast of the y intercept form 
    * @Pointf r is the point to be tested against the line 
    * 
    * returns some k > 0 if point is below the line 
    * returns some k < 0 if point is above the line 
    * returns 0 if point is found along the line 
    */ 
    private double Test(double m, double b, PointF r) 
    { 
     return (m*(double)r.X) + b - (double)r.Y; 
    } 

그래서 나는 프로그래밍 오류라고 다소 확신합니다.

부적절한 게시물 인 경우 죄송합니다. 포럼을 오용하는 경우 알려 주시기 바랍니다. 누군가에게 귀찮음을 의미하지는 않습니다.

각 하위 그룹에서 하나씩 두 개의 꼭지점을 교차하는 선을 발견했습니다. 다른 모든 선은 아래 (맨 위 탄젠트) 또는 위 (아래 접선)입니다. 알고리즘을 사용하면 항상 반복 루프가 반환 null에 도달해서는 안된다는 오류가 있습니다. 그러나 때로는 그렇습니다. 나는 그것이 정확한 오류라고 생각한다.

+1

당신은 당신이 산발적 인 결과를 얻고있다라고하지만 당신은 예상/원하는 결과가 무엇인지 표시하지 않는 것. 우리는 당신이 만나는 것을 볼 수 있습니다. 그러나 * *의 탄젠트는? * 왜 * 코드가 잘못되었다고 생각합니까? – vcsjones

+1

무엇이 오류입니까? 또는 당신의 문제가있는 곳입니다 - 당신이 오류를 볼 수 없기 때문에 논리적 실수 일 수 있습니다. – JonH

+0

여기있는 사람이 당신을 위해 디버깅 할 것으로 기대하지 마십시오 ... –

답변

3

두 배로 정밀도 문제가 될 수 있습니까? 어쩌면 테스트 기능을 "퍼지 (fuzzy)"해야합니다. 이처럼

는 :

double result = (m*(double)r.X) + b - (double)r.Y; 

    if ((result > -0.0001) && (result < 0.0001)) 
    return 0.0; 
    else 
    return result; 
+0

그게 다야!,하지만 나는 그 개념을 이해하고 있는지 잘 모르겠다. 왜 이것이 필요한지 설명해 주시겠습니까? 나는 이중 값이 충분히 정확하여 이것이 정말로 문제가되지 않는다는 인상하에 있었다. – MrBrightside

+0

@CynicalOptimist - 확실하지만 확실한 이유는 더 나은 일을 한 다른 사람들이있을 때를 설명하려고하는 이유입니다. 예 : http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems – Hogan

+0

또는 여기 http://stackoverflow.com/a/590851/215752 – Hogan