把三个坐标点放到一个数组里:
var d = [[0,0],[10,0],[5,5]]然后用个变量i表示A点在数组d中的初始序号:
var i = 0这样ABC三个点的坐标就是:
var a, b, ca = 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