У меня проблема, когда мне нужно найти максимальное количество точек, которые меньше или равно заданному расстоянию D до линии, нарисованной в двумерном евклидовом самолет. Чтобы решить эту проблему, я написал алгоритмы, которые вычисляли бы возможный максимум, если бы линия была ортогональна либо по оси х, либо по оси у. Моя проблема заключается в том, что только диагональная линия будет давать максимальное количество точек.Диагональная развертка и ортогональное расстояние от точки до диагонали
Учитывая ограничения, что и x, и y имеют минимальное значение -1000000 и максимум 1000000. Я написал следующий алгоритм, чтобы попытаться узнать максимум. Кажется, я не получаю правильный ответ. Мог бы кто-нибудь, пожалуйста, направить меня туда, где я ошибаюсь. Я попытался также рисовать линию регрессии, но использовал вертикальное расстояние, которое не срабатывало для моих целей. Возможно, я ошибаюсь, и эта проблема может быть решена как проблема оптимизации. В любом случае, любая помощь с объяснением спуска очень ценится.
// diagonal sweep
for (int degree = 1; degree < 180; degree++) if (degree % 90 != 0)
{
int k = 1, degrees = degree;
double x1 = -1000000, x2 = 1000000;
if (degree > 90 && degree < 180)
{
degrees = 180 - degrees;
k = -1;
}
//slope
double m1 = Math.Tan(Math.PI * degrees * k/180.0);
//Point A
Point A = new Point(x1, m1 * x1);
//Point B
Point B = new Point(x2, m1 * x2);
for (int i = 0; i < x.Length; i++)
{
//Point P = household that needs power
Point P = new Point(x[i], y[i]);
double normalLength = Math.Sqrt((B.X - A.X) * (B.X - A.X) + (B.Y - A.Y) * (B.Y - A.Y));
double segmentLength = 1d * Math.Abs((P.X - A.X) * (B.Y - A.Y) - (P.Y - A.Y) * (B.X - A.X))/normalLength;
if (segmentLength <= D)
tempCnt++;
}
maxConnections = Math.Max(maxConnections, tempCnt);
tempCnt = 0;
}
return maxConnections;
Не совсем уверен, что я понимаю ваши намерения. Вы проходите через градусы от 0 до 180, затем создаете линию под этим углом ... но проходя через точку отсчета? – dbc
Что это? у вас есть много точек где-то и приходится регрессировать линию через них, а затем выбирать все точки на некотором расстоянии от нее? потому что текст и код OP меня сбивают с толку (текст подразумевает, что вы не знаете, что точки и код являются точками и строкой для перебора), так что известно и что неизвестно? Если точки неизвестны, они на какой-то сетке? (Я не кодер C#, поэтому мне может быть что-то не хватает) – Spektre
btw смотрите здесь: http://stackoverflow.com/a/20888844/2521214 это может помочь немного – Spektre