2017-10-07 67 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 )/一個

希望幫助:)