容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标。在其他行业,容积率的计算也非常重要,如产品利用率、管道使用率等等。那么在监控系统中,如何能够生动形象的表达容积率的计算,是的监控系统具有准确性、安全性的同时,还具备了多样性,良好交互性等等。 最近的游戏产业发展也非常迅速,在手持终端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物理引擎是一种基于ActionScript 3.0的物理引擎,用于模拟各种物理现象。该引擎提供了多种粒子类型,例如矩形粒子、圆形粒子、轮子粒子等,每种粒子都有其独特的属性和方法。 AbstractItem是APE物理引擎中的一个...
此外,SDL提供的丰富API使得开发者能方便地处理图形界面、音频和输入事件,与ape引擎的物理计算部分无缝衔接。 三、主要组件解析 1. Rasterizer.cpp和Rasterizer.h:这部分代码涉及的是引擎的渲染器,负责将3D物理...
APE(物理引擎)是一个基于ActionScript 3(AS3)的开源物理模拟库,专为Flash平台设计,用于创建动态的、具有真实感的物理效果。它允许开发者在2D环境中模拟物体的碰撞、重力和其他物理现象,为游戏、互动媒体和...
《Flash AS3 COVE.APE物理引擎:2D游戏开发的核心技术》 在数字媒体领域,Flash AS3作为一款强大的动画和交互式内容创作工具,曾经占据着主导地位。尤其在2D游戏开发中,其灵活性和高效性使得开发者能够创造出丰富...
使用APE物理引擎,开发者可以通过创建粒子和约束,设置它们的属性,然后让引擎进行模拟计算,从而实现动态的物理效果。由于引擎提供了清晰的API和较少的类,学习和使用起来相对简便。此外,由于其开源特性,开发者还...
可用的超轻量的APE物理引擎库。min文件只有38k,APE中总共才12个类,用起来相当的方便。实现了大部分物理模拟(弹性、摩擦力、牵引力等),对于初学物理引擎的同学可以从APE学起。但相比较另一个物理引擎Box2D来说,...
【ape引擎系列教程-第一篇:模拟最简单的物理世界】 这篇教程主要介绍的是ape引擎,一个用于创建2D物理模拟的开源工具。在本篇教程中,我们将学习如何使用ape引擎来模拟一个基本的物理世界,包括物体的碰撞检测、...
**APE物理引擎**是一种在Flash平台上使用的物理模拟库,它基于ActionScript 3.0(AS3.0)编程语言实现。这个引擎为开发者提供了一种在2D环境中创建复杂物理效果的能力,如碰撞检测、重力模拟以及物体动态行为等。在...
APE (ActionScript Physics Engine) 是一款基于ActionScript 3(AS3)开发的2D物理引擎,主要用于Flash平台的游戏开发和其他需要实时物理模拟的应用。0.5a版是该引擎的一个稳定版本,提供了一系列基础的物理特性,如...
《APE0.45物理引擎_中文版》是一款专为游戏开发者设计的物理模拟引擎,其主要功能是为游戏中的物体运动提供真实感的物理效果。这个版本是针对之前0.44或者其他早期版本的问题进行了修复,特别是解决了项目运行时出现...
同时,理解并优化物理引擎性能也是必不可少的,比如减少不必要的计算、使用空间分段结构等方法。 通过学习和实践,你可以利用APE AS3物理引擎开发出令人印象深刻的Flash游戏,无论是简单的弹球游戏,还是复杂的平台...
这里我们将深入探讨几个在Flash平台上广泛使用的3D和2D物理引擎:BOX2D、FIVE3D、MOTOR2、FLADE以及APE。 首先,我们来看一下**BOX2D**。BOX2D是一款开源的2D物理引擎,由Erin Catto开发。它被广泛应用于Flash、C++...
APE引擎提供了许多有用的方法和属性,包括addConstraint、addParticle、cleanup、getAll、init、paint、removeConstraint和removeParticle等方法,以及constraints、particles、sprite等属性。 Java简单物理引擎是...
本文将详细介绍一款名为APE (Actionscript Physics Engine) 的物理引擎的Java版本。APE最初是基于ActionScript 3编写的,随后被移植到了Java和C++平台上。这款引擎以其简易性和高效性著称,非常适合初学者入门学习,...
APE(Actionscript Physics Engine)是一款基于ActionScript 3开发的物理引擎,用于模拟现实世界中的物体运动和碰撞。它是免费、开源的,遵循MIT协议。APE非常适合游戏开发,已经有许多有趣的应用程序使用了这个引擎...
APE是一个结构清晰简单的ActionScript 2D物理引擎。 APE实现了大部分物理模拟(弹性、摩擦力、牵引力等),对于初学物理引擎的同学可以从APE学起。但相比较另一个物理引擎Box2D来说,APE还缺乏例如多边形碰撞等等。
ape_a0452d物理引擎 06-21-07 Version 0.45a Two new properties for much greater stability - constraintCycles and constraintCollisionCycles Group now takes collideInternal setting as a parameter in the ...
通过打开和研究这些文件,你可以更深入地理解CANAPE中button的配置和使用方法。 总的来说,基于CANAPE的Panel设计涉及到了GUI设计、脚本编程和汽车软件开发等多个方面。掌握好这些知识,将有助于你创建出既美观又...