求个JS算法

JavaScript07

求个JS算法,第1张

把三个坐标点放到一个数组里:

var d = [[0,0],[10,0],[5,5]]

然后用个变量i表示A点在数组d中的初始序号:

var i = 0

这样ABC三个点的坐标就是:

var a, b, c

a = d[i]

b = d[(i+1)%3]

c = d[(i+2)%3]

向右旋转时:

a = d[++i%3]

b = d[(i+1)%3]

c = d[(i+2)%3]

向左旋转时:

a = d[--i<0?2:i]

b = d[(i+1)%3]

c = d[(i+2)%3]

将整个系统看做这样一个物理系统:质点和橡皮筋的系统;橡皮筋有个自然长度Length,当橡皮筋被拉长时产生弹力T;任意2个质点间存在反万有引力G(简单的说就是质量产生斥力,和物理系统相反)。当斥力和弹力平衡的时候,布局就结束了,算法简单描述如下:

设系统为G(V,E)

for (vi in V) {

vi.x = random ()

vi.y = random ()

}

while (未平衡) {

for (ei(vx, vy) in E) {

Fx += T(ei, vx, vy)

Ty += T(ei, vy, vx)

}

for (vi in V) {

for (vj in V) {

if (i == j) 跳过

Fi += G (vi, vj)

}

}

for (fi in F) {

vi.x = |fi| * cos(fi.angle)

vi.y = |fi| * sin(fi.angle)

}

}

其中弹力公式T(e, vi, vj)遵循胡克定律:F = Length(e) >Length ? K * (Length(e) - Length) : 0K 为胡克常数,酌情取值

万有引力公式G(vi, vj)遵循牛顿万有引力定律,但方向相反:

F = -G * Mass(vi) * Mass(vj) / (Distance(vi, vj) * Distance(vi, vj))G 为万有引力常数,酌情取值,Mass(v)为质点v的质量,可直接去定点的边数;Distance(vi, vj)为质点vi 和vj之间的距离,根据勾股定理可到。

系统平衡的标准:合弹力=合斥力,表现为v.x和v.y不再发生变化或震动

注意:当随机初始化后,可能产生2个质点重叠的现象,这时2质点间的斥力可用常数替代,方向随机。若质点无质量,可使用一个小常数替代,如.0005