容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标。在其他行业,容积率的计算也非常重要,如产品利用率、管道使用率等等。那么在监控系统中,如何能够生动形象的表达容积率的计算,是的监控系统具有准确性、安全性的同时,还具备了多样性,良好交互性等等。 最近的游戏产业发展也非常迅速,在手持终端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;@Overridepublic 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);}@Overridepublic int getWidth() {// TODO Auto-generated method stubif(Double.valueOf(_radius) != null){return (int) _radius*2;}return super.getWidth();}@Overridepublic int getHeight() {// TODO Auto-generated method stubif(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. 基于JBox2D物理引擎开发的“雷电”小游戏(五)——碰撞

    不好意思,隔了这么久才发这一篇文章,虽然部分原因是最近因为实习的事情很忙,还有一部分原因是比较懒,废话不多说,现在开始正文. 碰撞 既然学到了这里,想必大家都明白,物理引擎会帮我们做很多事情,省去从零 ...

  2. 基于JBox2d物理引擎和canvas的游戏开发实例

    本文基于JBox2d+canvas,后续提供NDK+openglEs版本:本文的主要目的是给大家介绍如何使用创建一个物理世界. 一.主函数: 主函数包括了Box2D的基本流程 简单来说,一个Box2D ...

  3. 一篇上手LayaAir的3D物理引擎

    昨天,我们分享了一篇2D物理文档<LayaAirIDE的可视化2D物理使用文档>. 今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本 ...

  4. 【Canvas】HTML5游戏开发的基本流程+P2.js物理引擎实战开发

    <HTML5游戏开发的基本流程> * 1. HTML5的简述 * 2. HTML5游戏开发所需的环境与工具 * 2.1. 开发环境 * 2.1.1. 浏览器 * 2.1.2. 开发语言 * ...

  5. 关于2d物理引擎box2d与ape的评论

    APE不行,做点简单的撞球,台球之类游戏还行.我最开始用他实验性做了个简单的基于物理引擎的泡泡龙类游戏,发现稍微多一点的几何体堆叠在一起就会产生渗透现象,没办法只好更改最初的设计.要专注做物理游戏,还 ...

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

    为什么80%的码农都做不了架构师?>>>    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来 ...

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

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

  8. 如何用GameMakerStudio开发基于物理引擎的平台游戏 | Lynda教程 中文字幕

    GameMakerStudio教程之如何用GML开发基于物理引擎的平台游戏 | Lynda教程 中文字幕 Building a Physics-Based Platformer in GameMake ...

  9. 如何制作一款像超级玛丽兄弟一样基于平台的游戏-第一部分 (xcode,物理引擎,TMXTiledMap相关应用)

    这篇文章还可以在这里找到 英语 Learn how to make a game like Super Mario! 这是一篇IOS教程组的成员 Jacob Gundersen发布的教程, 他是一位独 ...

最新文章

  1. 2022-2028年中国玻璃纤维毡热塑性塑料(GMT)行业市场研究及前瞻分析报告
  2. 这是一个不一样的社会公益活动
  3. Vue中动态设置页面title
  4. 六层感知神经网络系统
  5. Name与x:Name的关系--转载
  6. 基于 Flink 的严选实时数仓实践
  7. IE6/IE7/Firefox浏览器不兼容原因及解决办法
  8. s7-1200跟mysql_让西门子S7-1200直接连接MySQL数据库!!!
  9. 【Flink】Flink Row和RowData的区别
  10. 依赖注入(Dependency Injection)框架是如何实现的?
  11. php添加导航和删除导航,新增/修改/删除ECSHOP后台左侧导航菜单
  12. C#编写NotifyIcon
  13. Domain Adaptation论文合集
  14. Kindle 3---中文越狱之路
  15. 未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)解决
  16. Cadence OrCAD Capture 修改添加阵列PIN的递增方向的方法
  17. python内置函数之len()方法
  18. mac 卸载php版本,mac osx 更改自带php版本
  19. 4.再模仿一个算术题
  20. 关于centos安装最新的firefox出现的问题GLib-GObject-CRITICAL **

热门文章

  1. vue2关于引入字体的步骤
  2. c语言length函数,length_length什么意思
  3. 36条经典的编程格言(中英对照程序员个性签名)
  4. qt大作业——消灭星星
  5. Linux操作系统分析-lab2-进程的创建与可执行程序的加载
  6. 模拟电路设计(40)---你真的懂“接地”吗?
  7. 废品回收小程序搭建是如何实现运营方案整合以及利润的产生
  8. 【高电复习4】角度调制与解调
  9. 机器学习(十八) 方差、标准差、协方差、协方差矩阵、相关系数
  10. Linux 系统黑洞 /dev/null