저는 문자 그대로 이것에 몇 시간 동안 붙어있어서 상당히 실망합니다. 나는 산발적 인 결과를 얻고있다. 프로그램은 언젠가는 작동하지만, 수학적으로는 하나 일 수는 있지만, 다른 시간에, 내가 찾고있는 "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에 도달해서는 안된다는 오류가 있습니다. 그러나 때로는 그렇습니다. 나는 그것이 정확한 오류라고 생각한다.
당신은 당신이 산발적 인 결과를 얻고있다라고하지만 당신은 예상/원하는 결과가 무엇인지 표시하지 않는 것. 우리는 당신이 만나는 것을 볼 수 있습니다. 그러나 * *의 탄젠트는? * 왜 * 코드가 잘못되었다고 생각합니까? – vcsjones
무엇이 오류입니까? 또는 당신의 문제가있는 곳입니다 - 당신이 오류를 볼 수 없기 때문에 논리적 실수 일 수 있습니다. – JonH
여기있는 사람이 당신을 위해 디버깅 할 것으로 기대하지 마십시오 ... –