二维阴影效果 - 圆上的点

二维阴影效果 - 圆上的点

问题描述:

我目前正试图对我用Python编写的2D游戏实施平面阴影效果。我在网上找到了大量的教程和方法(http://ncase.me/sight-and-light/),但是,这些都使用多边形作为障碍物,所有角点都是已知的,而我的游戏包含圆圈。二维阴影效果 - 圆上的点

我想知道如果它是可以计算或者X和Y坐标的每个接触点(P和Q)或该线的梯度的如果A和O的情况,并圆的半径是已知的。

在此先感谢和道歉,如果问题是脱离主题,但我无法在其他地方找到答案。

关键是要注意点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弧度。

让我们向量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