Найти наименьший четырехугольник из данного четырехугольника, который соответствует прямоугольнику - PullRequest
1 голос
/ 22 апреля 2011

Я работаю над приложением обработки изображений, использующим GDI + в C # (VS 2008), и я кое-что застрял. У меня есть прямоугольник на моем холсте и четырехугольник произвольного размера на моем холсте. Я знаю 4 угловых точки прямоугольника и четырехугольника. Мне нужно вычислить наименьший четырехугольник, который соответствует моему прямоугольнику. Новый четырехугольник должен быть вычислен из четырехугольника, который я уже имел на холсте. Новый четырехугольник не обязательно должен быть уменьшенной версией моего существующего четырехугольника, но стороны входного и выходного четырехугольника должны быть параллельны. Я загрузил изображение, чтобы описать проблему.

http://www.4shared.com/photo/dufR-UeN/SmallQuad.html

Есть идеи, как мне это сделать?

Заранее спасибо.

1 Ответ

2 голосов
/ 22 апреля 2011

Хорошо, пусть A, B, C, D - это точки, определяющие ваш случайный четырехугольник:

  • 1 - это сегмент [AB]
  • 2 - это сегмент [BC]
  • 3 - это сегмент [CD]
  • 4 - это сегмент [DA]

Теперь позвольте E (topслева), F (вверху справа), G (внизу слева), H (внизу справа) - точки вашего прямоугольника.В вашем изображении вы должны определить:

  • уравнение параллели к 1, проходящее через E (назовем это 1 ')
  • уравнение параллели к 2передавая F (назовем это 2 ')
  • уравнением параллели к 3, передавая G (назовем это 3')
  • уравнением параллели к 4проходя мимо H (назовем это 4 ')

Затем вы можете вычислить их пересечения, что, в свою очередь, даст вам нужные вам линии.

Давайте определим 1' (другие аналогичны): все линии, параллельные 1, имеют тот же наклон, что и 1.И этот наклон s1 определяется как:

s1 = (yB - yA) / (xB - xA)

Тогда 1 'имеет уравнение, подобное y = s1 * x + b.Поскольку мы хотим, чтобы эта линия достигла точки E(xE, yE), у нас есть b:

yE = s1 * xE + b => b = yE - s1 * xE

, а затем 1 'имеет для уравнения: y = s1 * (x - xE) + yE.Точно так же 2 'имеет для уравнения y = s2 * (x - xF) + yF, s2 определяемое по координатам B и C, то же самое для 3' и 4 '.

Теперь мы хотим пересечение 1'и 2 ': эта точка I имеет координаты для проверки уравнений этих двух линий, поэтому:

yI = s1 * (x - xE) + yE
yI = s2 * (x - xF) + yF

Итак:

s1 * (xI - xE) + yE = s2 * (xI - xF) + yF

, что дает xI затем yI:

xI = (s1 * xE - s2 * xF + yF - yE) / (s1 - s2)
yI = s2 * (xI - xF) + yF
   = (s1 * s2 * xE - s1 * s2 * xF + s1 * yF - s2 * yE) / (s1 - s2)

Вы можете определить координаты J (пересечение 2 'и 3'), K (пересечение 3 'и 4') и L (пересечение4 'и 1') одинаково.Требуемый четырехугольник состоит из этих 4 точек I, J, K и L.

...