基于APE物理引擎的管线容积率计算方法
容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标。在其他行业,容积率的计算也非常重要,如产品利用率、管道使用率等等。那么在监控系统中,如何能够生动形象的表达容积率的计算,是的监控系统具有准确性、安全性的同时,还具备了多样性,良好交互性等等。 最近的游戏产业发展也非常迅速,在手持终端3D的游戏也越来越多,那么如果我们将游戏引擎融入到监控系统中,会实现什么样的效果呢,本文重点介绍使用APE物理引擎结合TWaver 2D产品实现管线的容积率计算。 先来看下效果:
物理引擎很多,我们使用比较容易入手的APE引擎,首先要对APE物理引擎有所了解,可以下载经典的APEdemo进行研究,下载链接:APE物理引擎Demo(提取密码:eyjm)。简单的介绍下APE:
AbstractCollection 所有群组的抽象类
AbstractConstraint 所有物理相互作用的的抽象类
AbstractItem 所有相互作用(碰撞)、粒子的基类
AbstractParticle 关于粒子的基类
APEngine 主引擎、力的类
CircleParticle 圆形粒子
RectangleParticle 矩形粒子
Composite 可以包含粒子和碰撞的复合物类
Group 一个组的类,可以包含粒子、碰撞、复合物
SpringConstraint 两个粒子之间类似弹性碰撞的类(弹簧)
Vector 力
WheelParticle 一个粒子,模拟轮子行为
接下来开始结合TWaver 2D产品:
1.创建一个具有物理参数的网元CircleParticle:类CircleParticle继承于AbstractParticle,AbstractParticle继承于TWaver的Node网元;
import java.awt.geom.*;
import twaver.TWaverConst;
public class CircleParticle extends AbstractParticle {
private double _radius; @Override
public String getUIClassID() {
return CircleParticleUI.class.getName();
} public CircleParticle (
double x,
double y,
double radius,
boolean fixed,
double mass,
double elasticity,
double friction) {
super(x, y, fixed, mass, elasticity, friction);
_radius = radius; if((Double.valueOf(x) != null) && (Double.valueOf(y) != null)){
this.setLocation(x, y);
} this.putCustomDraw(true);
this.putCustomDrawShapeFactory(TWaverConst.SHAPE_CIRCLE);
} @Override
public int getWidth() {
// TODO Auto-generated method stub
if(Double.valueOf(_radius) != null){
return (int) _radius*2;
}
return super.getWidth();
} @Override
public int getHeight() {
// TODO Auto-generated method stub
if(Double.valueOf(_radius) != null){
return (int) _radius*2;
}
return super.getHeight();
} public double getRadius() {
return _radius;
} public void setRadius(double r) {
_radius = r;
} public void paint() {
if(curr.y > 500) return;
if(Math.pow(curr.x+_radius-330,2) + Math.pow(curr.y+_radius-240, 2) > 150*150){
return;
}
this.setLocation((int)(curr.x - getRadius()), (int)(curr.y - getRadius()));
} public Interval getProjection(Vector axis) {
double c = curr.dot(axis);
interval.min = c - _radius;
interval.max = c + _radius;
return interval;
} public Interval getIntervalX() {
interval.min = curr.x - _radius;
interval.max = curr.x + _radius;
return interval;
} public Interval getIntervalY() {
interval.min = curr.y - _radius;
interval.max = curr.y + _radius;
return interval;
}
}
2.另外创建一个视图类CircleParticleUI类,继承NodeUI,用于绘制网元。
import twaver.Node;
import twaver.network.TNetwork; public class CircleParticleUI extends AbstractParticeUI{ public CircleParticleUI(TNetwork network, Node node) {
super(network, node);
}
}
这样物理引擎下的网元就创建成功了,接下来就可以按照TWaver的方式创建加载网元了。
//初始化场景,加载网元到box和物理引擎中
private void initWorld(){
APEngine.init((double) 1 / 5);
APEngine.setCollisionResponseMode(APEngine.STANDARD);
APEngine.addMasslessForce(new Vector(0, 10)); SwingUtilities.invokeLater(new Runnable() {
public void run() {
int Count = 500;
for (int i = 0; i < Count; i++) {
float centerX = 330;
float centerY = 240;
float radius = 150;
float x = (float) (centerX + radius
* Math.cos(Math.PI * 2 / Count * i));
float y = (float) (centerY + radius
* Math.sin(Math.PI * 2 / Count * i)); CircleParticle circle = new CircleParticle(x, y, 1, true, 1, 0, 1);
APEngine.addParticle(circle);
box.addElement(circle);
i++;
} }
}); paintQueue = APEngine.getAll();
}
//更新容积率以及告警显示规则
public void updateWorld() {
APEngine.step();
alarm.setName(Count+"个管道"+"/剩余面积:"+remainS/totalS*100+"%");
if(remainS/totalS*100 <15){
AlarmState alarmState = alarm.getAlarmState();
alarmState.increaseNewAlarm(AlarmSeverity.MINOR, 1);
alarm.putClientProperty("alarm", "alarm");
flag = false;
}
} //绘制网元
public void paintWorld() {
for (int i = 0; i < paintQueue.size(); i++) {
if (paintQueue.get(i) instanceof CircleParticle) {
((CircleParticle) paintQueue.get(i)).paint();
}
}
}
//最后设置场景更新规则
private void game() {
usedTime = 1000;
t = 0;
initWorld();
while (flag) {
t++;
long startTime = System.currentTimeMillis();
updateWorld();
paintWorld();
usedTime = System.currentTimeMillis() - startTime;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
}
}
}
这样一个监控容积率计算的平台就完成了,当然建立在各种物理引擎之上可以完成更加丰富的表达方式,如果您有这方面的需求和想法,欢迎和我们进行探讨!
基于APE物理引擎的管线容积率计算方法的更多相关文章
- 基于HTML5的WebGL结合Box2DJS物理引擎应用
上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...
- 基于HT for Web 3D呈现Box2DJS物理引擎
上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...
- 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘
计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...
- Verlet-js JavaScript 物理引擎
subprotocol最近在Github上开源了verlet-js.地址为https://github.com/subprotocol/verlet-js.verlet-js是一个集成Verlet的物 ...
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- [原]Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody)
在虚拟世界中,任何物体都是没有活力的,要想变的真实,Rigidbody是必不可少的组件,下面介绍Rigidbody的各个属性: Mass:质量 Drag:阻力,对象在运动时遇到的空气阻力,0表示没有空 ...
- 物理引擎简介——Cocos2d-x学习历程(十三)
Box2D引擎简介 Box2D是与Cocos2d-x一起发布的一套开源物理引擎,也是Cocos2d-x游戏需要使用物理引擎时的首选.二者同样提供C++开发接口,所使用的坐标系也一致,因此Box2D与C ...
- p2.js物理引擎学习
P2简介 P2是一款基于Javascript编写的HTML5 2D物理引擎,和Box2D.Nape等2D物理引擎一样,P2集成了各种复杂的物理公式和算法,可以帮助我们轻松的实现碰撞.反弹等物理现象的模 ...
- 大约cocos2d-X 3.x使用引擎版本自带的物理引擎Physics
今天打算用BOX2D物理引擎, 我想我以前听说过一些时间cocos2d-X在3.0版本封装自己的物理引擎Physics, 听名字很霸气量, 这的确是一个比BOX2D非常多( 毕竟是基于BOX2D封装的 ...
随机推荐
- Java千百问_03基本的语法(001)_局部变量、类变量、实例变量有什么差别
点击进入_很多其它_Java千百问 局部变量.类变量.实例变量有什么差别 在聊局部变量.类变量.实例变量有什么差别之前,我们须要了解一下Java变量. 1.Java变量是什么 在数学世界中,我们知道有 ...
- NTFS文件系统的单个文件最大到底有多大?
于NTFS文件系统的单个文件最大到底有多大? 闲来无事突然想到这个问题,到网上搜索了一下也没有一个固定的解释. 于是到微软官方知识库去寻找答案: 注意:基础硬件限制可能会对任何文件系统施加额外的分区大 ...
- CSP 201703-4 地铁修建【最小生成树+并查集】
问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市 ...
- finger的使用
finger命令用来查询一台主机上的登录账号的信息,通常会显示用户名.主目录.停滞时间.登录时间.登录Shell等信息,使用权限为所有用户. 安装 sudo apt-get install finge ...
- iOS 证书详解
引言 关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一个iOS开发小白 ...
- CF 1042 A Benches —— 二分答案(水题)
题目:http://codeforces.com/problemset/problem/1042/A 代码如下: #include<iostream> #include<cstdio ...
- bzoj2287
背包+fft 既然要不选一个东西,那么我们求出前缀背包和后缀背包,每次答案就是f[i-1][w]*g[i+1][j-w] 但是这样复杂度还是n^3,跑不过,但是我们发现上面那个东西不就是个裸卷积吗,直 ...
- 流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM) 的比较
1.流式套接字 使用这种套接字时,数据在客户端是顺序发送的,并且到达的顺序是一致的.比如你在客户端先发送1,再发送2,那么在服务器端的接收顺序是先接收到1,再接收到2,流式套接字是可靠的,是面向连接的 ...
- SCRIPT70: 没有权限
主要原因:iframe安全而引发的问题,浏览器中js是没有垮域访问的权限的.如果用到iframe首先确保不垮域,或者不用iframe以绕开这个问题. 另外在jquery的早期版本中如:jquery-1 ...
- es6之数据结构 set,WeakSet,mapWeakMap
{ let list = new Set(); list.add(1); list.add(2); list.add(1); console.log(list); //Set(2) {1, 2} le ...