2D阴影效果 - 圆上的点

时间:2016-07-06 20:13:04

标签: python geometry 2d trigonometry shadows

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

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

如果问题不在主题,请提前致谢并道歉,但我无法在其他任何地方找到答案。

2 个答案:

答案 0 :(得分:1)

技巧是注意在点P处发生的情况。在点P处,线AP与圆相切,换句话说角度APO是90度。同样AQO是90度。

现在我们知道我们有一个三角形,我们知道两个长度和一个角度(我们知道AO,OP / OQ(相同的东西)和APO / AQO)。

我们现在使用正弦法则。

 AO/sin(APO) = OP/sin(PAO)
 PAO = asin(OP*(sin(APO)/AO))

记住要注意单位(即使用90度作为输入值,然后忘记你的sin函数可以以弧度而不是度数返回。)

从这里,您可以通过知道三角形中所有角度的总和为180度来找到所有角度。所以现在你有三个角度。

当您从上面的计算中获得角度AOP时,您可以再次使用正弦定律来计算AP的长度。

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

注意sin(90度)== 1(并记住APO和AQO是90度| pi / 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弧度。

答案 1 :(得分:1)

设矢量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