У меня есть набор точек (x, y). Как найти самый маленький прямоугольник (края перпендикулярны оси системы координат), который содержит эти точки или точки, симметричные оси y = x? Не все точки должны быть зеркальными изображениями одновременно, поэтому можно иметь некоторые нормальные и некоторые симметричные точки к оригинальным.Как найти наименьший прямоугольник, который содержит все точки или точку, симметричную оси y = x?
ответ
Вы могли решить эту проблему с помощью грубой силы O(n*2^n)
подход: определить ваши очки в какой-то класс/структуру, которая, в дополнение к (x,y)
координат вашей точки, также имеет логическое mirrored
состояние. Для n
количество точек, петля над всем 2^n
Возможный набор состояний этого набора точек. Для каждого набора состояний вычислите окружность (2x+2y
) ограничивающего прямоугольника.
Ниже следует это решение, реализованное в Swift. Если вы решите использовать этот подход грубой силы, мы надеемся, вы сможете перевести его на ваш язык выбора.
Точечные контейнеров и сервисных функций:
struct Point {
private var xOrig : Double
private var yOrig : Double
private var mirrored = false
var x : Double { return mirrored ? yOrig : xOrig }
var y : Double { return mirrored ? xOrig : yOrig }
init(_ x: Double, _ y: Double) {
xOrig = x
yOrig = y
}
mutating func setState(state: Bool) {
mirrored = state
}
}
func boundingBoxCircumference(points: [Point]) -> Double {
let xMax = points.maxElement { $0.x < $1.x }?.x ?? 0.0
let xMin = points.minElement { $0.x < $1.x }?.x ?? 0.0
let yMax = points.maxElement { $0.y < $1.y }?.y ?? 0.0
let yMin = points.minElement { $0.y < $1.y }?.y ?? 0.0
return 2*((xMax - xMin) + (yMax - yMin))
}
func setMirroredStates(inout points: [Point], states: [Bool]) {
for i in 0..<points.count {
points[i].setState(states[i])
}
}
Основные функции и пример
func findSmallestBox(var points: [Point]) -> Double {
var smallestBox = Double.infinity
for i in 0..<Int(pow(2,Double(points.count))) {
smallestBox = min(smallestBox, boundingBoxCircumference(points))
var binString = String(i, radix: 2)
if let a = Optional(points.count - binString.characters.count) where a > 0 {
binString = "".stringByPaddingToLength(a, withString: "0", startingAtIndex: 0) + binString
}
let pointStates = Array(binString.characters).map { String($0) == "1" }
setMirroredStates(&points, states: pointStates)
}
return smallestBox
}
var myPoints : [Point] = [Point(1,2), Point(-4,3), Point(7,-5), Point(5,4), Point(-5, -1)]
print(findSmallestBox(myPoints)) // 34
Спасибо за ваш код, но, к сожалению, я знал о решениях грубой силы. Я ищу лучшее решение, так как 0 (n * 2^n) - много. – wprzechodzen
@ WojtekPrzechodzeń Я вижу, возможно, кто-то может что-то придумать. – dfri
- 1. Найти LineSegment, который содержит точку
- 2. найти наименьший угол линии до оси X в C#
- 3. Matplotlib Укажите точку на X и Y оси
- 4. Как найти ближайшую точку (точку (x, y), в списке разных точек) до заданной точки?
- 5. Перевернутый на оси X или Y
- 6. OpenCV Draw прямоугольник из центра x, y
- 7. Найти все точки вне четырехугольника (не прямоугольник)
- 8. Как установить точку пересечения оси x и y
- 9. XPath: Найти элемент, который содержит текст X, а не Y
- 10. NVD3.js: как настроить значения оси x или оси y
- 11. Как найти любую точку внутри треугольника, зная все три точки?
- 12. Поиск прямоугольника, который содержит точку
- 13. Найти большой прямоугольник в сетке, который лежит на границе и содержит точку
- 14. Как перенести NSObject в точку (x, y)?
- 15. Растяжение оси X или Y на System.Graphics.DrawString
- 16. Автомасштабирование оси Y на оси X Zoom
- 17. Как найти точку в заданной точке поверхности x x, y и z и расстояние от первой точки
- 18. Как изменить диапазон оси x и оси y в matlibplot?
- 19. Запрос на матч полигон, который содержит точку
- 20. Линейные кресты Прямоугольник - как найти точки пересечения?
- 21. Переполнение по оси x и y-оси
- 22. Экранные диаграммы оси y и оси x
- 23. Как получить все координатные точки (X и Y) в ios
- 24. две точки, а затем находит наименьший круг и самый маленький прямоугольник, содержащий точки
- 25. Вычисление нечисловой оси X от оси y
- 26. Как избежать дополнительного расстояния по оси x и оси y
- 27. Как найти угол точки от оси х независимо от квадранта?
- 28. Метод поиска x, y точки на сплайне, который является точным расстоянием от другой точки
- 29. Стартовая точка оси Y
- 30. JavaFX: Как найти x, y определенной точки по кругу, заданной только радиусом и центром x, y?
Вы в основном с вопросом, как вычислить ограничивающий прямоугольник 2D? Просто прокрутите каждую точку в своем наборе и получите минимальное и максимальное значение для каждого компонента, и у вас будет ограничивающий прямоугольник. – ajshort
Нет; он просит выравнивания по оси, но с возможностью замены произвольно многих точек в наборе их зеркальными аналогами. Это вызов. – ThorngardSO
@ThorngardSO это не вызов. Наименьший прямоугольник всегда легко получается путем зеркалирования всех точек, так что они распределяются по одному квадранту, если симметрия является осевой или двумя квадрантами, если это точечная симметрия. – Paul