Algorithm 基本矩形分割
我被一些琐碎的问题困住了,我想我需要帮助 我有两个矩形,保证它们从4个基点(图片的上半部分)有一个公共点。还保证它们是轴对齐的 我知道这个公共点(也可以很容易地推断),这些矩形的尺寸和坐标Algorithm 基本矩形分割,algorithm,language-agnostic,Algorithm,Language Agnostic,我被一些琐碎的问题困住了,我想我需要帮助 我有两个矩形,保证它们从4个基点(图片的上半部分)有一个公共点。还保证它们是轴对齐的 我知道这个公共点(也可以很容易地推断),这些矩形的尺寸和坐标 现在,我需要检索名为1和2的矩形的坐标,我正在寻找一种简单的方法来实现这一点(图片的下半部分) 我当前的实现依赖于许多if语句,我怀疑我太笨了,找不到更好的方法 多谢各位 更新:我的当前实现。 这是重构的,但是方法getCommonPoint和getnextrick…和getantivative有许多if
现在,我需要检索名为
1
和2
的矩形的坐标,我正在寻找一种简单的方法来实现这一点(图片的下半部分)
我当前的实现依赖于许多if
语句,我怀疑我太笨了,找不到更好的方法
多谢各位
更新:我的当前实现。
这是重构的,但是方法
getCommonPoint
和getnextrick…
和getantivative
有许多if
语句,我认为这是否可以做得更好。据我所知,似乎需要一个if(或switch)语句来确定矩形的方向,从这里可以简单地进行加法和减法:
如果您知道内部蓝色矩形的坐标(以及作为一个整体的矩形的尺寸),那么找到其他矩形应该没有问题。R1和R2点中的一个始终相同:等于相邻的蓝色矩形点。其他的只是一个小数学
似乎无法摆脱最初的if/switch语句。如果矩形只能是向上或向下,那么你可以使偏移量为负或正,但也可以是左或右。因此,你可能会被卡住。您可以为垂直或水平状态创建一个-/+偏移量,但是您必须检查每个计算假设您有
RA
和RB
作为输入,并且您使用的任何语言都有一个矩形
类,这里有一种方法可以使用4if
s、Math.Min
,Math.Max
和Math.Abs
:
Rectangle r1, r2; // Note - Rectangle constructor: new Rectangle(X, Y, Width, Height)
if (RA.X = RB.X) {
r1 = new Rectangle(Math.Min(RA.Right, RB.Right), Math.Min(RA.Y, RB.Y), Math.Abs(RA.Width - RB.Width), Math.Max(RA.Height, RB.Height));
if (RA.Y = RB.Y) {
// Intersects Top Left
r2 = new Rectangle(RA.X, Math.Min(RA.Bottom, RB.Bottom), Math.Min(RA.Width, RB.Width), Math.Abs(RA.Height - RB.Height));
} else {
// Intersects Bottom Left
r2 = new Rectangle(RA.X, Math.Max(RA.Bottom, RB.Bottom), Math.Min(RA.Width, RB.Width), Math.Abs(RA.Height - RB.Height));
}
} else {
r1 = new Rectangle(Math.Min(RA.X, RB.X), Math.Min(RA.Y, RB.Y), Math.Abs(RA.Width - RB.Width), Math.Max(RA.Height, RB.Height));
if (RA.Y = RB.Y) {
// Intersects Top Right
r2 = new Rectangle(Math.Max(RA.X, RB.X), Math.Min(RA.Bottom, RB.Bottom), Math.Min(RA.Width, RB.Width), Math.Abs(RA.Height - RB.Height));
} else {
// Intersects Bottom Right
r2 = new Rectangle(Math.Max(RA.X, RB.X), Math.Min(RA.X, RA.Y), Math.Min(RA.Width, RB.Width), Math.Abs(RA.Height - RB.Height));
}
}
此代码是用记事本编写的,因此可能有一两个输入错误,但逻辑是正确的。矩形1的顶部和底部值与大矩形相同。矩形2的左右值与小矩形相同。我们只需要获得矩形1的左右值,以及矩形2的顶部和底部值。因此,我们只有两个简单的if语句:
if (bigRectangle.Left == smallRectangle.Left)
left = smallRectangle.Right
right = bigRectangle.Right
else
left = bigRectangle.Left
right = smallRectangle.Left
rectangle1 = new Rectangle(left, bigRectangle.Top, right - left, bigRectangle.Height)
if (bigRectangle.Top == smallRectangle.Top)
top = smallRectangle.Bottom
bottom = bigRectangle.Bottom
else
top = bigRectangle.Top
bottom = smallRectangle.Top
rectangle2 = new Rectangle(smallRectangle.Left, top, smallRectangle.Width, bottom - top)
<>上述,
if (bigRectangle.Left == smallRectangle.Left)
left = smallRectangle.Right
right = bigRectangle.Right
else
left = bigRectangle.Left
right = smallRectangle.Left
rectangle1 = new Rectangle(left, bigRectangle.Top, right - left, bigRectangle.Height)
if (bigRectangle.Top == smallRectangle.Top)
top = smallRectangle.Bottom
bottom = bigRectangle.Bottom
else
top = bigRectangle.Top
bottom = smallRectangle.Top
rectangle2 = new Rectangle(smallRectangle.Left, top, smallRectangle.Width, bottom - top)