2016-07-06 106 views
0

我目前正試圖對我用Python編寫的2D遊戲實施平面陰影效果。我在網上找到了大量的教程和方法(http://ncase.me/sight-and-light/),但是,這些都使用多邊形作爲障礙物,所有角點都是已知的,而我的遊戲包含圓圈。二維陰影效果 - 圓上的點

我想知道如果它是可以計算或者X和Y座標的每個接觸點(P和Q)或該線的梯度的如果A和O的情況,並圓的半徑是已知的。

在此先感謝和道歉,如果問題是脫離主題,但我無法在其他地方找到答案。

回答

1

關鍵是要注意點P處發生了什麼。在點P處,線AP與圓相切,換句話說,角度APO是90度。同樣AQO是90度。現在我們知道我們有一個三角形,我們知道2個長度和一個角度(我們知道AO,OP/OQ(相同的東西)和APO/AQO)。

我們現在使用正弦律。記住要意識到單位(例如,使用90度作爲輸入值,然後忘記你的庫的函數可能以弧度而不是度數返回)。

從這裏,你可以找到所有的角度,知道三角形中所有角度的總和是180度。所以現在你有三個角度。

當你從上面的計算得到角度AOP時,可以再次使用正弦定律來計算AP的長度。

AP = sin(AOP) * AO/sin(APO). 

請注意,sin(90度)== 1(請記住,APO和AQO是90度|π/ 2弧度)。

現在我們有AP的長度。現在我們可以找到P的座標(x,y),假設A在(0,0)處。如果A不是原點,只需將A的座標添加爲偏移量即可。

要查找P的座標:

PxCoord = AxCoord + AP * cos(PAO) 
PyCoord = AyCoord + AP * sin(PAO) 

提醒:請檢查您的三角函數(SIN/ASIN)使用度或弧度,並確保在90度轉換爲弧度(這是pi/2弧度)如果你的功能使用弧度。另外請注意,如果是這種情況,您的輸出將以弧度爲角度,同樣,而不是在三角形中有180度,您將獲得pi弧度。

0

讓我們向量V = OP(未知),矢量Q = AP,矢量U = AO(已知)
注意是Q = U + V

矢量V的長度爲半徑R,所以

VX^2 + VY^2 = R^2 //1 

向量V和A是垂直的,所以它們的標量積爲零

VX * QX + VY * QY = 0 
VX * (VX + UX) + VY * (VY + UY) = 0 
VX * VX + VX * UX + VY * VY + VY * UY = 0 
R^2 + VX * UX + VY * UY = 0 //2 

求解等式1和2的系統和解決方案獲得

LL = U.X^2 + U.Y^2 

VY = (R^2 * UY +/- R * UX * Sqrt(LL - R^2))/LL 
VX = (R^2 - VY * UY)/UX 

最後

P.X = O.X + VX 
P.Y = O.Y + VY