注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

豆芽兵的生存探索

因,记录。留下历史,看到未来...

 
 
 

日志

 
 

第二节:RealFlow Python脚本基础(2)  

2012-05-24 08:49:04|  分类: RealFlow探索 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地
 

2.7 数据类型

编译器与程序员必须要区分不同类型的数据类型。在学校里你可能已经见过它们其中的绝大部分,在RealFlow里你需要再次使用到这些类型。最常见的类型肯定是整数类型(整型,Integer)。整数使用很普通,在日常生活使用它们根本时不会注意到。整型数像下面这些:

整数集是无限的,可以是正数或负数,但不包括像 3.645-1.333,或 12.7这样的小数(fraction)。小数不属于整数集。也不包括这样的小数? o或 ?。虽然这样写后可看作是两个整数的组合。

Python中有两种亚型的整数。第一个被称为纯整数,或只是整数。这种类型缩写被称为 int. 这种类型,有一个最大范围。为了提高性能,它需要区分一下。几乎99%的工作,纯整数能满足你的要求。

这里是规范:

int(整型或纯整数) 

?2,147,483,648 +2,147,483,648

 这个范围也被称为 32位,它也是现在操作系统最低精度。大部分操作系统支持64位了。64位有效范围是:

 ?9,223,372,036,854,77,.808 +9,223,372,036,854,775,808

 

long(长整型)

Python的子类型具有无限精度,但你的数字的有效长度取决于您的计算机中的RAM(内存)大小。

接下来,非常重要的类型是Float(浮点型)。你已经在前面见过Float(也可叫做浮点数)。此类型可以引入小数。浮点型最显著的特征是有小数点(1.8543)。

它可以计算出不同长度的小数位。当然,它可以结合整数和小数成有效的表达式。如:

75.543 / 8.4 + 1.3 * 67.55

5.8564 * 6 + 23.98

浮点弄可以是正数或负数。浮点的长度在很大程度上取决于你的电脑和操作系统,但大部分时候你不会碰到这个问题。这在Python仅仅是Float.

我们最后要谈的一个数据类型是

 复数(complex).

RealFlow里这种数据类型很少使用到,仅仅是在完整性(completeness)里提到。复数( Complex numbers)有两个部分组成:实部和虚部。因此复数总是用一对数字来写。实部只能是整型或浮点型,而虚部只能是 a j 形式。

(3 + 6j)

即使虚部是0,你也要写成这样带j的形式:

(12+0j)

虚数像通常一样来进行计算:

(2 + 4j) * (8 + 3j) or (11 + 1j) * (7 + 5j)

 Python中,这种特殊的数据类型可被引进为 complex 语句。

 现在你知道了,int,long,float complex.这些数据类型。

但你还是不知道,怎么使用些类型。

当然数据类型主要应用还是变量。方便的是你并不需要具体指出是哪个变量类型。Python能自动识别正确的数据类型。但也有一些其它情况,你需要指定,你到底要用哪个类型。其中一个例子是GUIs——图形用户界面。后面会有GUI的详细讲解。我想在这介绍一些与数据类型有关的基本用法。

 图形用户界面(GUI)允许初始化自定义输入值。

 让我们假设,你想用盒子搭建一座塔。在图形用户界面(GUI)中你可以键入长和高,叠加的高度值。塔层肯定是一个整数,因为你不可能建立一个5.278层的塔。高度和宽度,却可以测量出 2.5 7.84 单位。 

数据类型在例子中使用如下:

Levels(层数)    = int  e.g. 10

Width(宽)  = float  e.g. 2.5

height (高) = float  e.g. 3.75

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地

3:塔层基于整型和浮点型

另一个经常使用到的是数据类型的转换。整型和浮点型可相互转换。你也能把长整型转换成浮点数。但所有这些转换,你要注意到,你可能会丢失精度。浮点型数字转换成整型是 截掉小数部分:

int(3.256) = 3

int(9.999) = 9

这种转换只需要,原始数字的整数部分,不需要四舍五入。转换长整型到浮点型也是这样。

 

2.71 向量

 

另一个数据类型是向量。向量不是在Python一个内置的元素,但也有一些语言支持向量。RealFlow拓展的Python,完全支持 向量。因为它不是Python标准安装的一部分,我在这里称为 伪数据类型。(Pseudo Data Type).

向量(Vector)RealFlow是非常重要的一元素之一,这也是我为什么要选择单独讨论它。向量可被看做是一个指向一个方向的箭头。要描述一个向量的方向,我们必须至少有两个方向:xy。通过绘制一个矢量坐标系统,我们得到的主要特性:方向和模。方向告诉你向量指向哪,而模表明箭头的长度。

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地

 4.指向不同方向的向量

向量的坐标可以包括整数和浮点数。Vector的图示可能有助于得到理解,但它不适合用于计算。因此,我们必须找到一个符号。因此,有一些既定的形式来表示一个矢量,但根据的RealFlow的表示法,在本书矢量总是写为:

a= (x, y) 或 a = (1.0, 1.0)

RealFlow里,我们需要用向量的第三个坐标来处理三维空间。

a= (x, y, z)  a= (1.0, 1.0, 1.0)

 (译者注:本书里向量都写为斜体加粗 如上面的 a)

如果你对现实生活中的例子或数学背景感兴趣,我建议你看看物理书籍或互联网,如维基百科。(http://zh.wikipedia.org/wiki/Wikipe

 

2.72 向量的计算

向量是不能直接计算的。向量最常见的计算(类型)是加。

进行向量计算,你需要使用到各个元素,x,y,z,包括它们的大小

向量的坐标称为标量。你已经在本章一开始就听过标量了

a = (5.0, 2.5, 4.2)

b= (1.7, 3.9, 8.1)

在这个例子中,我们要计算 c=a+b,也许它只是

c= (ax + bx, ay + by, az + bz)

c = (5.0 + 1.7, 2.5 + 3.9, 4.2 + 8.1)

c= (6.7, 6.4, 12.3)

这是正确的回答,类比是向量的减法。

c= (ax - bx, ay - by, az - bz)

c = (5.0 - 1.7, 2.5 - 3.9, 4.2 - 8.1)

c= (3.3, -1.4, -3.9)

 正如你可以在这里看到,一个Vector,也可以指向负方向。 

因为向量的坐标是标量。所以向量的某一个分量可以与标量相乘。

很有可能你会经常用到这种方法,特别是力相关的计算。 

乘法与标量计算的方法:

a= (4.8, 2.9, 1.4)

s= 2.5

b = s * a

b = (s *ax, s * ay s * az)

b = (2.5 * 4.8, 2.5 * 2.9, 2.5 * 1.4)

b = (12, 7.25, 3.5)

 

另一个很重要的计算法则是 矢量积(点积)。不要与最后介绍的乘法与标量相乘法则混淆。他们操作是完全不一样的。矢量的结果是一个标量,可以当作两个矢量的乘积考虑:

a = (1.7, 7.3, 3.3)

b= (2.4, 0.7, 5.1)

c= ab

c= ax * bx + ay * by + az * bz

c= 1.7 * 2.4 + 7.3 * 0.7 + 3.3 * 5.1

c= 4.08 + 5.11 + 18.83

c= 26.02

 

 

积的一个特殊形式是矢量的平方。

c = a2

c = ax2 +ay2 +az2

 

 

 

从这个术语中提取的平方根,产生一个矢量数量级(通常被称为规范或长度)

 

|c|=sqrt(ax2 +ay2 +az2)     (应该是在跟号下,因为不好排版,就用字母了)

 

    正如你可以清楚地看到这里,此操作的结果是一个标量,而不是一个矢量。C的绝对值表示,它是一个常数。在RealFlow里你不用担心这一规则,因为有一个内置函数来计算矢量积。里RealFlow里称为点积(Dot Product),用一个星号来表示(*)。

 

下一条规则,我们谈论的,被命名为交叉积(Cross Product)。交叉积结果也是一个向量。最常见的方法来计算交叉积是乘两个向量的部分:

a = (2.2, 6.1, 1.0)

b= (0.7, 0.4, 3.8)

c = a x b

cx = ay * bz - az * by

cy  = az * bx - ax * bz

cz  = ax * by - ay * bx


cx = 6.1 * 3.8 - 1.0 * 0.4

cy = 1.0 * 0.7 - 2.2 * 3.8

cz = 2.2 * 0.4 - 6.1 * 0.7


cx  = 23.18 - 0.40 = 22.78

cy = 0.70 - 8.36 = -7.66

cz = 0.88 - 4.27 = - 3.39

c= (cx, cy, cz)

c= (22.78, -7.66, -3.39)

RealFlow  默认情况下就能计算这个操作符,不需要手动计算。许多物理值是利用了交叉积,例如 洛伦兹力或扭矩。 有一定时间,当你开始寻找特殊公式来增强您的模拟。你一定会再碰到交叉积的。许多公式,处理自然,湍流现象的模拟使用交叉积来模仿所需的力量。

 

最后一个规则已经出台:矢量的范数(Norm)或模长(Magnitude)。这个运算的结果是一个标量。你会经常使用来计算力的大小。这个标量还可以再乘以一个矢量(参看,上面“标量的乘法”)。模长计算,会用到老朋友 勾股定理。如果你记不得了,不用担心,请看下一页。

 

勾股定理通常用于三角计算。在数学中矢量,也可以用一个箭头代表向量,它的值也可以通过构建三角形来或得。

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地
 

5.矢量的模长

 

用勾股定理你可以计算出长度或叫矢量的模长

 

勾股定理:a2+ b2 =c2

平方根就是C的值:

 c = sqrt ( a2+ b2)

 在三维坐标系里的矢量也适用。因为取的是平方根的值,所以矢量模长都是正数。

a= (3.2, 2.8, 1.5)

| a | = sqr (ax2 +ay2 +az2)

| a ] = sqr (10.24 + 7.84 + 2.25)

| a | = 4.51

 

对于流体,烟,火的模型,(物理)引入矢量场。矢量在矢量场要考虑每个点的分配空间。解决方法是在每一个点创建场的变量强度。很好的例子是重力场或磁场。实际应用取决于你不同的值 RealFlow中的Python中创建矢量场是不太重要的。为此,我不想更深入这些场的讲解。

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地
 

6.用箭头来表示三维向量场。

 

向量场背后的数学问题是很复杂的。在RealFlow中主要问题是,我们需要解决之前和当前值的方程。RealFlow没有提供用于随时间推移替换之前结果的函数。

 

可以在Java Applet 了解更多关于向量场的知识

 http://www.falstad.com/vector3d/


2.8符号和语法

现在你越来越近了脚本理论部分。

在这一章中,您将学习如何组织一个RealFlow的脚本和你不得不做的。当你为RealFlowPython脚本,你必须遵循一定的(语法)规则。否则你会看到错误提示,你的脚本也将不能运行。最好的办法是,从一开始就避免这些错误。正如我在非官方的RealFlow论坛上看到,最常见的错误是相关的大小写转换和空格问题。Python能自动识别语句,条件和语法的标志就是前面制表符,空格。

program start:

 statement 1

 if ( condition ):

  statement 2

 else:

  statement 3

 while loop:

  statement 4

  if ( condition ):

   statement 5

  else:

   statement 6

  statement 7

 

上面的例子是一个典型的Python结构的脚本的。对于每一个新的语句,都是单独一行。编译器允许空格以及制表符,但你绝对不能将它们一起使用。使终用一种进行换行。我建议用Tab键(制表符)。使用这个,你不用担心数字的空格,将使你工作变得轻松

 其他脚本语言,如Perl,经常使用括号把语句和函数的括起来。它的优点是你不用考虑制表符,但你不能忘记括号另一半。否则,你会收到一个错误。这在Perl代码结构的一个例子:

sub function {

 statement 1;

  if ( condition ) { state

  else { statement 3 }

 while loop {

  statement 4

   if ( condition ) { sta

   else { statement 6 }

  statement 7

 } # end while

} # end sub function

 虽然定义所有条件,循环嵌入到分支中很不错,但使用制表符仍然是很不错主意,更有利于阅读。所以在复制和粘贴Python脚本时要特别小心。来自论坛或其它地方脚本往往无法遵循前导制表符的规则,就容易直接导致问题。

 Python是非常灵活的程序语言。它支持很多简短和复杂的语句。

 对于初学者来说,它往往很难理解脚本,这是怎么回事,这就是Python的利弊。本期会一步步把这脚本技术教给大家。可能许多脚本超过你的实际水平,但就是初学者,也能理解这些代码。我把这些用最简单的脚本写给你。随着经验的增长,你将会学会代码到底是如何起作用的。

 另一个问题是变量(Variables)的拼写。 RealFlowPython使用特定字引入函数。这些字不能用于变量名。你可以在64页看到这些保留字的列表。变量名的另一个限制是“点”号的使用。点号用于标志区分对像的属性,像:

 emitter.getPosition()

 脚本的规则可看做是语法。违反这些规则会产生错误。有很多定义和有关语法的文章,很容易使初学者不能理解其重要性。

 脚本是一个语法的逻辑结构

 这种结构不是一个固定的规则类型,很灵活,总是有不止一种方法来实现结果。这认为这就是语法的本质。如果你想进一步了解,你可以再上网查查。

 

 你在RealFlow收到最常见的错误信息是“Script Syntax error line XX",

 语法错误往往是一些很微小的原因:

1.前导空格是错的

 2.语句顺序错误

 3.未声名变量

 4.变量名拼写错误 (注意区分大小写)

 5.括号没有标记,配对

 6.无限循环(死循环)

 7.使用不正确的操作符(运算符)

 8.使用保留字和禁止字

 9.数据类型使用错误

 

第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地
 7RealFlow错误信息 (提示到具体哪一行有问题了)


PS:脚本基础知识到这就结束了,后面章节就会真正开始有实例操作。和真正开始在RF中应用。

这些基本知识,大部分人肯定在大学学过。希望不要被这些看似吓人的符号唬住,这些都是纸老虎。
如果你暂时没兴趣看,也不要紧。到后面做到时,再反过来,有目的的看就好多了。

希望大家积极指出我的错误第二节:RealFlow Python脚本基础(2) - 豆芽兵 - 豆芽兵的天地

  评论这张
 
阅读(3488)| 评论(2)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017