2017-10-07 32 views
0

我用CGAffineTransform转换了一些UIView。现在我想知道在UIView中验证一些y值时是否有可能获得UIView的最小x点。找到旋转UIView给定y的最小x

例如在下图中,我想知道y值的最小x值,该值是视图高度的0.75倍。

enter image description here

someView.frame.origin.x只提供左上角位置的x值,但我需要的东西来改变这一立场得到一个给定的y值最小的x值。

+0

你知道在给定y值的那个平方中有许多x值。或者两个,如果你只关心外围。 – rmaddy

+0

@rmaddy你是什么意思?对于给定的y,x怎么能有多个x值?我想要最小的x位置,如果这就是你的意思。 –

+0

在给定的y值下,在你的视图上画一条水平线。注意这条线是如何穿过正方形的。它穿过左侧,再次穿过右侧。你也可以考虑广场内的所有点。如果您的目标是计算给定y的最左侧x值,请在您的问题中提及。 – rmaddy

回答

1

我认为你可以计算出在罗塔最小X和其对应的Y然后计算出X2,Y2,如下图所示,一旦你知道方角已经旋转的角度和其边长(然后是它的毕达哥拉斯定理)..

我用let rotatedRect = CGRectApplyAffineTransform(rotationTransformation, square.frame)得到旋转矩形的坐标。然后,我比较了所有4个点,找出X值最小的那个点,以及经过该点的正方形的两条线的方程(一个具有正斜率,另一个具有负值)。

一旦有了X1,Y1和X2,Y2,X3,Y3,如下所示,就可以计算出的两条线由取代或消除截取如下所示..

为简单起见,我假定通过正方形的直线的斜率为0(水平线)。

要找出哪个是正确的最小X值,比较是否X> = X1。如果是,那是满足您要求的最低限度。看下面的例子..

enter image description here

+0

注意:如果SQUARE的旋转角度是0,90,180或360,那么最小的X是X1,因为基本上没有旋转。 – Brandon

+0

Woa ...非常感谢! –

1

作为UIView总是一个矩形,我想你想跟踪矩形的给定y的最小x。

SOLUTION

可以跟踪4个顶点了UIView的总是你旋转它的位置。这种跟踪可以简单地通过乘以2x2旋转矩阵的点来完成。

| cosθ -senθ | | x | = | x * cosθ - y * senθ | 
| senθ cosθ | | y | | x * senθ + y * cosθ | 

然后,你可以用最小的X顶点(可以称之为V1)。

,那么你需要让其他2个顶点与最小X(称为V2V3)。

if V1.y > (given y) 
    write linear equation from V1 to vertex with minimum y between V2 and V3 
else 
    write linear equation from V1 to vertex with maximum y between V2 and V3 
到底

,你将有F(X)= AX + B

取代指定ŸF(X),你会得到X =(Y - B )/一个

希望帮助:)