问题描述
我正在浏览一个博客 关于在 2D 游戏中创建闪电效果.我想在 python 中实现相同的效果.但是我被困在一个地方.
I was going through a blog on Creating Lightning effect in 2D game.I wanted to implement the same in python. However I am stuck at a place.
假设 startpoint 和 endPoint 是 2D 平面中的坐标,代表线段的极值点.
Lets say startpoint and endPoint are co-ordinates in 2D plane , representing extreme points of a line segment.
让我们看看博客中的以下代码片段:
Lets look at following Code Snippet from the blog:
midPoint = Average(startpoint, endPoint);
// Offset the midpoint by a random amount along the normal.
midPoint += Perpendicular(Normalize(endPoint-startPoint))*RandomFloat(-offsetAmount,offsetAmount);
.
Normalize(endPoint-startPoint):
那条线得到一个从 startPoint 到 endPoint 的单位向量(长度为 1 的向量)
That line gets a unit vector (vector of length 1) from startPoint to endPoint
Perpendicular(Normalize(endPoint-startPoint))
然后得到一个与其垂直的向量(即与直线成直角)
then gets a vector perpendicular to that (i.e. at right angles to the line)
我不是一个普通的 Python 编码员.python 中是否有任何内置的 Normalise 和 Perpendicular 函数可以帮助我在 python 中实现上述代码.
I am not a regular python coder. Is there any in-built Normalise and Perpendicular Function in python that would help me in implementing the above code in python.
推荐答案
我不知道内置或第三方方法,但它们非常简单:
I don't know of built-in or third-party methods, but they are really simple:
import numpy as np
def perpendicular( a ) :
b = np.empty_like(a)
b[0] = -a[1]
b[1] = a[0]
return b
def normalize(a):
a = np.array(a)
return a/np.linalg.norm(a)
if __name__ == "__main__":
a = [1,2]
print perpendicular(normalize(a))
b = (4,-6)
print perpendicular(normalize(b))
这将打印
[-0.89442719 0.4472136 ]
[ 0.83205029 0.5547002 ]
你可以用
- 一个二元组
- 长度为二的列表
- 长度为 2 的一维数组
或类似类型.
请注意,如果向量 a 的长度为零,normalize
将引发异常.
Be aware that normalize
will raise an Exception if the vector a has length zero.
我决定根据 PEP 8 Python 风格指南将我的函数命名为小写.
I decided to name my functions lower-case according to PEP 8, Python style guide.
这篇关于python中的规范化和垂直函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!