/* 磁石のそれぞれの極が分離したような粒子の動きを眺めるプログラムです。 粒子の相互作用で様々な図形が姿を現します。 操作方法 粒子をクリック: 極を反転 */ #runtime "hsptv" #const FpsSamples 60 #uselib "winmm" #cfunc timer "timeGetTime" #const double G 20000 #const DistanceThreshold 150 #const DistanceThreshold2 (DistanceThreshold * DistanceThreshold) #const MaxObjects 128 #const LastObject (MaxObjects - 1) #enum ObjectType = 0 #enum PositionX #enum PositionY #enum VelocityX #enum VelocityY #enum Elements dimtype objects, 3, Elements, MaxObjects repeat MaxObjects gosub *setCurrentObject type = double(rnd(2) * 2 - 1) px = double(rnd(640)) py = double(rnd(480)) loop repeat 2 buffer 1 + cnt, 64, 64 color : boxf hsvcolor , , 4 boxf i = cnt * 16 color 24 - i, 12, 7 + i boxf 16, 16, 47, 47 i = cnt * 72 color 96 - i, 48, 23 + i boxf 26, 26, 37, 37 loop onexit *close gsel pt = timer() repeat await t = timer() dt = 0.001 * limit(t - pt, 1, 33) #ifdef _DEBUG fpsb(cnt \ FpsSamples) = t - pt #endif pt = t stick in, 64 draw = (in & 64) == 0 | cnt \ 32 == 0 if draw { redraw : redraw 0 color 255, 240, 255 gmode 6, 640, 480, 192 grect 320, 240 } repeat MaxObjects gosub *setCurrentObject repeat LastObject - cnt, cnt + 1 dup target, objects(0, cnt) dx = px - target(PositionX) dy = py - target(PositionY) dist2 = dx * dx + dy * dy if dist2 < DistanceThreshold2 & dist2 >= 1 { m = type * target * G * dt / dist2 / sqrt(dist2) if dist2 <= 100 { m *= -1 } dx *= m dy *= m vx += dx vy += dy target(VelocityX) -= dx target(VelocityY) -= dy } loop if in & 256 { dx = px - mousex dy = py - mousey if dx * dx + dy * dy < 100 { type *= -1 in = 0 } } vx -= vx * dt vy -= vy * dt px += vx * dt py += vy * dt if px < -64 { px = -16.0 vx = absf(vx) } else : if px > 704 { px = 656.0 vx = -absf(vx) } if py < -64 { py = -16.0 vy = absf(vy) } else : if py > 544 { py = 496.0 vy = -absf(vy) } if draw { gmode 5, 64, 64, 256 pos px - 32, py - 32 gcopy 1 + (type > 0) } loop n = 0 foreach fpsb n += fpsb(cnt) loop if draw { hsvcolor , , 255 pos 2, 2 mes strf("FPS: %.0f", double(FpsSamples) * 1000 / n) } loop *close end *setCurrentObject dup type, objects(0, cnt) dup px, type(PositionX) dup py, type(PositionY) dup vx, type(VelocityX) dup vy, type(VelocityY) return