我目前正在尝试将平面阴影效果应用于我用Python编写的2D游戏。我已经在网上找到了大量的教程和方法(http://ncase.me/sight-and-light/)但是,这些都使用多边形作为障碍物,当我的游戏包含圆圈时,所有角点都是已知的。
我想知道是否可以计算每个接触点(P和Q)的X和Y坐标,或者如果A和O的情况以及圆的半径是已知的。
如果问题不在主题,请提前致谢并道歉,但我无法在其他任何地方找到答案。
答案 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