`

基于APE物理引擎的管线容积率计算方法

阅读更多

容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标。在其他行业,容积率的计算也非常重要,如产品利用率、管道使用率等等。那么在监控系统中,如何能够生动形象的表达容积率的计算,是的监控系统具有准确性、安全性的同时,还具备了多样性,良好交互性等等。 最近的游戏产业发展也非常迅速,在手持终端3D的游戏也越来越多,那么如果我们将游戏引擎融入到监控系统中,会实现什么样的效果呢,本文重点介绍使用APE物理引擎结合TWaver 2D产品实现管线的容积率计算。 先来看下效果:
guandao2
物理引擎很多,我们使用比较容易入手的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物理引擎中文API.pdf

    APE物理引擎是一种基于ActionScript 3.0的物理引擎,用于模拟各种物理现象。该引擎提供了多种粒子类型,例如矩形粒子、圆形粒子、轮子粒子等,每种粒子都有其独特的属性和方法。 AbstractItem是APE物理引擎中的一个...

    ape 开源 物理引擎

    此外,SDL提供的丰富API使得开发者能方便地处理图形界面、音频和输入事件,与ape引擎的物理计算部分无缝衔接。 三、主要组件解析 1. Rasterizer.cpp和Rasterizer.h:这部分代码涉及的是引擎的渲染器,负责将3D物理...

    APE物理引擎的中文说明文档

    APE(物理引擎)是一个基于ActionScript 3(AS3)的开源物理模拟库,专为Flash平台设计,用于创建动态的、具有真实感的物理效果。它允许开发者在2D环境中模拟物体的碰撞、重力和其他物理现象,为游戏、互动媒体和...

    flash as3 COVE.APE物理引擎(2D)

    《Flash AS3 COVE.APE物理引擎:2D游戏开发的核心技术》 在数字媒体领域,Flash AS3作为一款强大的动画和交互式内容创作工具,曾经占据着主导地位。尤其在2D游戏开发中,其灵活性和高效性使得开发者能够创造出丰富...

    APE物理引擎中文API

    使用APE物理引擎,开发者可以通过创建粒子和约束,设置它们的属性,然后让引擎进行模拟计算,从而实现动态的物理效果。由于引擎提供了清晰的API和较少的类,学习和使用起来相对简便。此外,由于其开源特性,开发者还...

    Ape物理引擎-白鹭(egret)库

    可用的超轻量的APE物理引擎库。min文件只有38k,APE中总共才12个类,用起来相当的方便。实现了大部分物理模拟(弹性、摩擦力、牵引力等),对于初学物理引擎的同学可以从APE学起。但相比较另一个物理引擎Box2D来说,...

    [转] ape引擎系列教程-第一篇:模拟最简单的物理世界

    【ape引擎系列教程-第一篇:模拟最简单的物理世界】 这篇教程主要介绍的是ape引擎,一个用于创建2D物理模拟的开源工具。在本篇教程中,我们将学习如何使用ape引擎来模拟一个基本的物理世界,包括物体的碰撞检测、...

    APE物理引擎

    **APE物理引擎**是一种在Flash平台上使用的物理模拟库,它基于ActionScript 3.0(AS3.0)编程语言实现。这个引擎为开发者提供了一种在2D环境中创建复杂物理效果的能力,如碰撞检测、重力模拟以及物体动态行为等。在...

    APE as3 物理引擎

    APE (ActionScript Physics Engine) 是一款基于ActionScript 3(AS3)开发的2D物理引擎,主要用于Flash平台的游戏开发和其他需要实时物理模拟的应用。0.5a版是该引擎的一个稳定版本,提供了一系列基础的物理特性,如...

    APE0.45物理引擎_中文版.rar

    《APE0.45物理引擎_中文版》是一款专为游戏开发者设计的物理模拟引擎,其主要功能是为游戏中的物体运动提供真实感的物理效果。这个版本是针对之前0.44或者其他早期版本的问题进行了修复,特别是解决了项目运行时出现...

    APE AS3物理引擎学习

    同时,理解并优化物理引擎性能也是必不可少的,比如减少不必要的计算、使用空间分段结构等方法。 通过学习和实践,你可以利用APE AS3物理引擎开发出令人印象深刻的Flash游戏,无论是简单的弹球游戏,还是复杂的平台...

    flash一些3D和2D物理引擎

    这里我们将深入探讨几个在Flash平台上广泛使用的3D和2D物理引擎:BOX2D、FIVE3D、MOTOR2、FLADE以及APE。 首先,我们来看一下**BOX2D**。BOX2D是一款开源的2D物理引擎,由Erin Catto开发。它被广泛应用于Flash、C++...

    Java简单物理引擎.pdf

    APE引擎提供了许多有用的方法和属性,包括addConstraint、addParticle、cleanup、getAll、init、paint、removeConstraint和removeParticle等方法,以及constraints、particles、sprite等属性。 Java简单物理引擎是...

    java简单物理引擎

    本文将详细介绍一款名为APE (Actionscript Physics Engine) 的物理引擎的Java版本。APE最初是基于ActionScript 3编写的,随后被移植到了Java和C++平台上。这款引擎以其简易性和高效性著称,非常适合初学者入门学习,...

    物理引擎APE中文帮助

    APE(Actionscript Physics Engine)是一款基于ActionScript 3开发的物理引擎,用于模拟现实世界中的物体运动和碰撞。它是免费、开源的,遵循MIT协议。APE非常适合游戏开发,已经有许多有趣的应用程序使用了这个引擎...

    ActionScript 3.0 物理引擎 APE 0.45版本以及DEMO

    APE是一个结构清晰简单的ActionScript 2D物理引擎。 APE实现了大部分物理模拟(弹性、摩擦力、牵引力等),对于初学物理引擎的同学可以从APE学起。但相比较另一个物理引擎Box2D来说,APE还缺乏例如多边形碰撞等等。

    ape_a0452d物理引擎

    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的Panel设计(一)--button

    通过打开和研究这些文件,你可以更深入地理解CANAPE中button的配置和使用方法。 总的来说,基于CANAPE的Panel设计涉及到了GUI设计、脚本编程和汽车软件开发等多个方面。掌握好这些知识,将有助于你创建出既美观又...

Global site tag (gtag.js) - Google Analytics