Posted on 2010-07-01 19:54
王之昊 閱讀(576)
評論(0) 編輯 收藏 引用 所屬分類:
二分 、
2:30
Deformed Wheel
題意:給你一個斜面,再給一個凸多邊形的石頭,讓石頭從高出放下,沿著斜面滾動,問石頭重心最后的位置。因?yàn)槟Σ亮艽?,石頭不能滑動,只能轉(zhuǎn)動。(還有很多細(xì)節(jié),具體見原題)
首先,這里要確定什么時候石頭算穩(wěn)定了,可以找到石頭和斜面相交的兩個點(diǎn),一個是相對石頭的最左點(diǎn)A,一個是相對石頭的最右點(diǎn)B,這樣如果石頭要向左轉(zhuǎn)動,必是繞著A轉(zhuǎn);要向右轉(zhuǎn)動,必是繞著B轉(zhuǎn)。這里有個問題,如果A,B的橫坐標(biāo)相同,那么A取最低的那個,B取最高的那個。
找到A,B兩點(diǎn)之后,如果重心G 有 A.x<=G.x <= B.x 那么他是穩(wěn)定的,如果G.x < A.x 那么他是向左轉(zhuǎn),如果G.x > B.x那么他是向右轉(zhuǎn)。
其次,要知道石頭如果開始轉(zhuǎn)動,不論向左向右,轉(zhuǎn)動多少角度會再次碰到斜面。假設(shè)轉(zhuǎn)動theta再次碰到斜面。我們要求出這個theta的值。這里可以采用二分theta的方法來解決,對于某個確定的角度theta1,直接模擬轉(zhuǎn)動theta1角度??词欠癯鲂泵娴姆秶绻?,說明theta1大了,否則說明theta1小了。
二分的實(shí)現(xiàn)上我覺得還是有很多trick的,比如
- 在檢查的時候,要檢查石頭上是否存在一點(diǎn)是否在斜面的下側(cè),這里很容易忽視那個支點(diǎn),如果把支點(diǎn)也一并去檢查,很可能因?yàn)榫鹊年P(guān)系判他在斜面的下方,結(jié)果check函數(shù)一直都是不合法。
- 向左轉(zhuǎn)和向右轉(zhuǎn)的處理上,向左轉(zhuǎn)我采用的是二分[0,PI]轉(zhuǎn)角,向右轉(zhuǎn)我則是二分[-PI, 0]轉(zhuǎn)角,結(jié)果寫在一起就出問題了,向左轉(zhuǎn)的判定如果在斜面下方,那么是角度大了,向右轉(zhuǎn)的判定如果在斜面下方,實(shí)際上是角度小了,盡管絕對值是大了。還有一種寫法是枚舉[0,PI],在check函數(shù)里再判斷是向左轉(zhuǎn),還是向右轉(zhuǎn)。這樣不容易寫錯。