[英]How do i find the smallest point P(x,y) containing triangle from a bunch of points?
[英]How can I find the least rect, which contains all points or the point symmetrical to the y=x axis?
我有一组点(x,y)。 如何找到包含这些点或与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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.