123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <!DOCTYPE html>
- <html>
- <head>
- <!-- 必须强制指定页面编码为 UTF-8 -->
- <meta charset="utf-8">
- <!-- Demo 的简要说明,必须要填写 -->
- <meta name="description" content="使用 Kity 模拟三体运动">
-
- <!-- Demo 的作者,建议填写 -->
- <meta name="author" content="techird@qq.com">
-
- <!-- Demo 的标题,必须填写 -->
- <title>三体运动</title>
-
- <!-- Demo 开发过程中使用 CMD 引入 Kity 源码,方便调试 -->
- <!-- dev start -->
- <!-- 目录型的 Demo 注意修正源码引用路径 -->
- <script src="../dev-lib/sea.js"></script>
- <script>
- // 设置好 kity 源代码目录
- seajs.config( { base: '../src'} );
- // 定义 Demo 模块
- define('demo', function(require) {
- var kity = require('kity');
- var Draggable = require('../demo/public/draggable');
- kity.extendClass( kity.Paper, Draggable );
- });
- </script>
- <script>
- // 启动 Demo 模块
- seajs.use('demo');
- </script>
- <!-- dev end -->
- <!-- 生产使用中可以直接引用发布压缩的版本 -->
- <!-- production start -->
- <!-- 目录型的 Demo 注意修正源码引用路径 -->
- <!-- <script src="../dist/kity.min.js"></script> -->
- <!-- production end -->
- <style>
- body, div, html {
- margin: 0;
- padding: 0;
- overflow: hidden;
- }
- </style>
- </head>
- <body>
- <div id="clock" style="width: 100%; height: 100%; position: absolute;"></div>
- </body>
- <script>
- var G = 6.67e-11;
- var SUN_MASS = 1.99e30; // KG
- var EARTH_MASS = 5.97e24; // KG
- var R_SUN_EARTH = 1.52e11; // meter
- // 绘图画布
- var paper = new kity.Paper('clock').pipe(function() {
- this.setWidth('100%').setHeight('100%');
- this.setViewBox(-500, -500, 1000, 1000);
- this.setStyle('background', 'black');
- }).drag();
- var Body = kity.createClass('Body', {
- base: kity.Group,
- constructor: function() {
- this.callBase();
- this.shift = new kity.Vector();
- this.velocity = new kity.Vector();
- this.force = new kity.Vector();
- this.mass = 1;
- this.size = 5;
- this.draw();
- },
- draw: function() {
- return this.addShape(new kity.Circle(this.size).fill('white'));
- }
- });
- var ZERO = 1e-3;
- var bodies;
- function randomVector(min, max) {
- return new kity.Vector(min + Math.random() * (max - min), min + Math.random() * (max - min));
- }
- function randomize() {
- bodies.forEach(function(body) {
- body.shift = randomVector(-300, 300);
- body.velocity = randomVector(-100, 100);
- body.mass = 10 * Math.random();
- body.size = 2 + body.mass;
- });
- }
- function collision(a, b) {
- if (a.velocity.length() <= ZERO && b.velocity.length() <= ZERO) return false;
- // a connect from a to b
- var connect = kity.Vector.fromPoints(a.shift, b.shift);
- // v projection on the connect
- var avc = a.velocity.project(connect),
- bvc = b.velocity.project(connect);
- // v delta on the connect
- var dvc = avc.minus(bvc);
- // should check the dcv same direction with the connect
- // and the two ball is close enougth
- if (dvc.dot(connect) > 0 && connect.length() - a.size - b.size <= ZERO) {
- var normal = connect.vertical();
- var avn = a.velocity.project(normal),
- bvn = b.velocity.project(normal);
- // 连线方向速度交换,垂直方向速度不变
- var factor = 1;
- a.velocity = avn.add(bvc).multipy(factor);
- b.velocity = bvn.add(avc).multipy(factor);
- return true;
- }
- return false;
- }
- G = 30000;
- function simulate(frame) {
- var tick = 100;
- while (tick--) {
- bodies.forEach(function(body) {
- body.force = new kity.Vector();
- bodies.forEach(function(body2) {
- if (body2 != body) {
- collision(body, body2);
- var r = kity.Vector.fromPoints(body.shift, body2.shift);
- var f = G * body.mass * body2.mass / (r.square());
- body.force = body.force.add(r.normalize(f));
- }
- });
- body.acceleration = body.force.multipy(1 / body.mass);
- body.velocity = body.velocity.add(body.acceleration.multipy(0.0005));
- body.shift = body.shift.add(body.velocity.multipy(0.0005));
- });
- }
- bodies.forEach(function(body) {
- body.setTranslate(body.shift);
- body.getShape(0).setRadius(body.size);
- });
- frame.next();
- }
- function init() {
- bodies = [new Body(), new Body(), new Body(), new Body(), new Body(), new Body(), new Body()];
- paper.addShapes(bodies);
- paper.on('dblclick', randomize);
- randomize();
- kity.requestFrame(simulate);
- }
- function triple() {
- var a = bodies[0],
- b = bodies[1],
- c = bodies[2];
- a.mass = b.mass = 500;
- a.size = b.size = 5;
- a.shift = new kity.Vector(0, 200);
- b.shift = new kity.Vector(0, -200);
- a.velocity = new kity.Vector(100, 0);
- b.velocity = new kity.Vector(-100, 0);
- c.mass = 0;
- c.shift = new kity.Vector(10000, 100000);
- }
- function triangle() {
- var a = bodies[0],
- b = bodies[1],
- c = bodies[2];
- a.mass = b.mass = c.mass = 1050;
- a.size = b.size = c.size = 5;
- a.shift = kity.Vector.fromPolar(200, 0);
- b.shift = kity.Vector.fromPolar(200, 120);
- c.shift = kity.Vector.fromPolar(200, 240);
- a.velocity = kity.Vector.fromPolar(300, 60);
- b.velocity = kity.Vector.fromPolar(300, 180);
- c.velocity = kity.Vector.fromPolar(300, 300);
- }
- init();
- </script>
- </html>
|