基于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封装的 ...
随机推荐
- gitlab的安装和配置
1 使用omnibus gitlab来安装gitlab 也就是说,将gitlab和它所需要的组件打一个包,即打一个bundle进行安装. 第一步,安装gitlab的源. curl https://pa ...
- 深度理解apache 重写模块rewrite_mod,重写不再犯错
1.RewriteRule ^(com\/.*)$ index.php?do=$1 问:上面的规则匹配表达式 "^(.*)$" 匹配的内容是什么 答:匹配内容是URI站点目录:/d ...
- CSP 201703-4 地铁修建【最小生成树+并查集】
问题描述 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市 ...
- Error:(2, 0) No service of type Factory<LoggingManagerInternal> available in ProjectScopeServices. <
compile报下面的错误Error:(2, 0) No service of type Factory available in ProjectScopeServices. 点击open file ...
- 嵌入式Linux系统---ppp拨号,4G模块上网【转】
本文转载自:http://blog.csdn.net/qq562029186/article/details/65438553 4G模块PPP拨号上网 方法1 所需文件: xxx-chat-conne ...
- [Codeforces Education Round 6E] New Year Tree
[题目链接] https://codeforces.com/contest/620/problem/E [算法] 显然 , 一棵子树的DFS序必然为连续的一段 用线段树维护颜色数即可 [代码] #in ...
- H5页面背景音乐,C33 360°旋转效果
在做H5页面的时候,经常会需要用到背景音乐,比如电子贺卡.动态音乐相册等,右上角有个360°旋转的音乐图标,点击可以控制音乐是否播放,那这个效果是如何实现的呢?我现整理了一下代码: Demo 点击 ...
- redis之简单动态字符串(SDS)
O(N):时间复杂度 N的值越大 时间复杂度随N的平方增大 O(1):就是说N很大的时候,复杂度基本不增长了.基本就是常量了. 在Redis数据库里 包含字符串值的键值对 在底层都是由SDS实现的. ...
- RandomAccessFile使用场景及总结
大家在学到Java中IO流的时候学到了各种流,对文件的各种操作.但是唯独可能对RandomAccessFile对象不会去过多的研究,那么这个到底有什么用呢? RandomAccessFile的唯一父类 ...
- spring 异常处理
1. 实现接口 HandlerExceptionResolver 捕获异常 2.@ExceptionHandler 在方法添加注解,捕获本地controller异常 3.@ControllerAdvi ...