容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标。在其他行业,容积率的计算也非常重要,如产品利用率、管道使用率等等。那么在监控系统中,如何能够生动形象的表达容积率的计算,是的监控系统具有准确性、安全性的同时,还具备了多样性,良好交互性等等。 最近的游戏产业发展也非常迅速,在手持终端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物理引擎的管线容积率计算方法的更多相关文章

  1. 基于HTML5的WebGL结合Box2DJS物理引擎应用

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  2. 基于HT for Web 3D呈现Box2DJS物理引擎

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  3. 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘

    计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...

  4. Verlet-js JavaScript 物理引擎

    subprotocol最近在Github上开源了verlet-js.地址为https://github.com/subprotocol/verlet-js.verlet-js是一个集成Verlet的物 ...

  5. [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)

    通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...

  6. [原]Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody)

    在虚拟世界中,任何物体都是没有活力的,要想变的真实,Rigidbody是必不可少的组件,下面介绍Rigidbody的各个属性: Mass:质量 Drag:阻力,对象在运动时遇到的空气阻力,0表示没有空 ...

  7. 物理引擎简介——Cocos2d-x学习历程(十三)

    Box2D引擎简介 Box2D是与Cocos2d-x一起发布的一套开源物理引擎,也是Cocos2d-x游戏需要使用物理引擎时的首选.二者同样提供C++开发接口,所使用的坐标系也一致,因此Box2D与C ...

  8. p2.js物理引擎学习

    P2简介 P2是一款基于Javascript编写的HTML5 2D物理引擎,和Box2D.Nape等2D物理引擎一样,P2集成了各种复杂的物理公式和算法,可以帮助我们轻松的实现碰撞.反弹等物理现象的模 ...

  9. 大约cocos2d-X 3.x使用引擎版本自带的物理引擎Physics

    今天打算用BOX2D物理引擎, 我想我以前听说过一些时间cocos2d-X在3.0版本封装自己的物理引擎Physics, 听名字很霸气量, 这的确是一个比BOX2D非常多( 毕竟是基于BOX2D封装的 ...

随机推荐

  1. [疑问] C# 多线程程序,如果在并行程序块中开空间会远远慢于将空间开在并行块之外

    // int[,] label = new int[m, n]; Parallel.For(, thread_num, (n) => { ]; i++) { int[] tmp = new in ...

  2. bzoj 2428 均分数据

    题目大意: 已知N个正整数 将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小 求最小均方差 思路: 模拟退火 #include<iostream> #include<c ...

  3. 2018.09.09 DL24 Day2总结

    今天挂的有点惨…… T1.forging 这道题自己在考试的时候想出来了…… 这题是一个期望递推.我们首先考虑这么一件事,一枚硬币,你抛到正面停止,抛到反面继续抛,问期望抛的次数.是两次.我们假设期望 ...

  4. JSSDK使用步骤

    绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 引入js文件 在需要调用JS接口的页面引入如下JS文件,( ...

  5. python3 批量管理Linux服务器 下发命令与传输文件

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- import paramiko import os, stat import sys import ope ...

  6. Java DAO模式

    DAO模式: DAO(DateAccessObject,数据存取对象) 位于业务逻辑和持久化数据之间,实现对持久化数据的访问. DAO组成: DAO接口: 数据库的所有操作定义成抽象方法,可以提供多种 ...

  7. js工作备注

    { field : 'state', title : '事件状态', align: 'center', width : 120, formatter : function(value, row, in ...

  8. sublime text2 配置php本地环境时遇到的错误。

    首先,将PHP加到电脑的环境变量中如图(D:\PHPEnv\PHP5是我PHP的安装目录): 第二步:添加编译系统配置 第三步:配置详情: { "cmd": ["php. ...

  9. 思维题 UVA 10881 Piotr's Ants

    题目传送门 /* 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 关键2:蚂蚁的相对位置不变 关键3:o ...

  10. 最大流增广路(KM算法) HDOJ 1533 Going Home

    题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...