【澳门威尼斯赌场】0语言巩固学习笔记,0语言新性格之Lambda表明式

by admin on 2019年5月5日

安插参数

  • 叁脚架类型:快装板
  • 别的属性:对应云台:KX G D类别 适用相机型号:D3 D三X
  • 外形设计:黑色

翻开完整参数>>

      前面复习了”隐式类型局地变量”,”增加方法”,”对象和汇集起头化器”,”匿有名的模特式”知识点。见C#
3.0言语巩固学习笔记(一)

原著出处:

OpenCascade BRep Format Description

eryar@163.com

摘要Abstract:本文结合OpenCascade的BRep格式描述文书档案和源程序,对BRep格式进行分析,详细表达BRep的数据组织方式。结合源程序,能够对OpenCascade中Modeling
Data模块中的模型数据结构实行精晓。 

关键字Key Words:OpenCascade, BRep Format, ModelingData 

  

此地大家其余复习C# 三.0的别的新特色:Lambda表明式

在C#贰.0中引入了匿名格局,允许在盼望现身委托的时候以“内联”的代码代替之。就算无名情势提供了函数式编制程序语言中的诸多表明技能,但佚名格局的语法实在是太罗嗦了,并且很不自然。Lambda表明式为书写佚名方式提供了1种越发简便易行、越发函数化的语法。

一、引言 Introduction

OpenCascade中的BRep格式首要用来存款和储蓄3D模型,也可用来存款和储蓄由下列成分结合的模型:vertices,
edges, wires, faces, shells, solids, compsolids, compounds, edge
triangulations, face triangulations, polylines on triangulations, space
location and orientation. 

本格式的目标便是为着便于明白,也使用了近似BNF的概念形式。以下章节皆以按上面包车型地铁格式组织的: 

l 该有的的言传身教; 

l 该部分的类BNF定义; 

l 该片段的详实表达; 

l 该片段的源程序片段。 

  

初识Lambda表达式:

实际上Lambda表达式的面目是佚名格局,也便是当编写翻译大家的程序代码时,编写翻译器会自动帮大家将Lambda表明式调换为佚名格局。

2、通用结构 Format Common Structure

BRep格式文件的读写采纳了ASCII的编码格局,该格式的数码都以文本形式储存。 

BRep格式使用了上面包车型大巴BNF术语: 

1) <\n>:换行; 

2) <_\n>: 

3) <_>:空格; 

4) <flag>:标志位:0和1; 

5) <int>:整数,范围-231到231-1; 

6)
<real>:实数,范围-1.7976931348623159X10308到1.7976931348623158X10308; 

七) <二D point>:二维点,七个实数; 

八) <3D point>:三个维度点,多少个实数; 

玖) <二D
direction>:2维方向矢量,三个实数,平方和为1,即为单位方向矢量; 

十) <3D
direction>:三个维度方向矢量,八个实数,平方和为一,即为单位方向矢量; 

11) <+> 

BRep格式包涵以下一些: 

1) <content type> 

2) <version> 

3) <locations> 

4) <geometry> 

5) <shapes> 

<content type>部分: 

澳门威尼斯赌场 1

<content type>也能够有其余的值。 

<version>部分: 

澳门威尼斯赌场 2

分歧版本之间的分别将会在本文书档案中表达。 

  

使用C# 二.0中的无名氏形式找出”内部含有abc子串的装有字符串”: 

20.5.1 创建Lambda表达式

Lambda表明式的书写情势是2个参数列表后跟“=>”暗号,然后跟二个表明式或3个语句块,即拉姆da表明式的语法格式为:

参数列 => 语句或语句块

拉姆da表达式例子如下所示:

delegate int del(int i);

 …

 del myDelegate = x => x * x;

 int j = myDelegate(5); //j = 25

至于“参数列”,拉姆da表达式的参数列能够拥有显式的或隐式的类型。在二个享有显式类型的参数列表中,每一种参数的门类都以显式注明的。在1个负有隐式类型的参数列表中,参数的品种是从Lambda表达式出现的上下文中预计出来的——具体来讲,是当拉姆da表明式被更改为三个相配的委托项目时,该委托类型提供了参数的连串。

当Lambda表明式唯有3个颇具隐式类型的参数时,参数列表中的括号能够回顾。即:

(param) => expr

【澳门威尼斯赌场】0语言巩固学习笔记,0语言新性格之Lambda表明式。能够简写为:

param => expr

最后,参数列中可含蓄自由个参数(与寄托对应),即使参数列中有0个或二个以上参数,则必须使用括号括住参数列,如下:

() => Console.Write(“0个参数”);

 i => Console.Write(“一个参数时参数列中可省略括号,值为:{0}”, i);

 (x, y) => Console.Write(“包含2个参数,值为:{0}:{1}”, x, y);

而“语句或语句块”中只要唯有一条语句,则足以不用大括号括住,不可是必须使用大括号,如下所示:

 i => Console.Write(“唯有一条语句”);

 i => { Console.Write(“使用大括号的表明式”); };

 //两条语句时务要求大括号

i => { i++; Console.Write(“两条语句的状态”); };

尽管“语句或语句块”有再次来到值时,假如唯有一条语句则足以不写“return”语句,编译器会自行管理,不然必须抬高,如下示例:

class Test

    {

        delegate int AddHandler(int
x, int y);

        static void Print(AddHandler add)

        {

            Console.Write(add(1,
3));

        }

        static void Main()

        {

            Print((x, y) => x + y);

            Print((x, y) => { int v = x * 10; return y + v; });

            Console.Read();

        }

    }

Lambda表达式是委托的贯彻情势,所以必须听从以下规则:

l         拉姆da表明式的参数数量必须和信托的参数数量同样;

l         假如委托的参数中包涵有ref或out修饰符,则拉姆da表达式的参数列中也务必回顾有修饰符;

 

大家来看如下例子:

 

class Test

    {

        delegate void OutHandler(out int x);

        static void Print(OutHandler test)

        {

            int i;

            test(out i);

            Console.Write(i);

        }

        static void Main()

        {

            Print((out int x) => x = 3);

            Console.Read();

        }

    }

l         假诺委托有重返类型,则Lambda表明式的讲话或语句块中也不可能不重临同样类其他多寡;

l         假诺委托有两种数据类型格式而在拉姆da表明式中编写翻译器不能测算具体数据类型时,则必须手动鲜明数据类型。

由地点可知,C# 二.0正式中关系的无名格局标准一样适用于兰姆da表明式。Lambda表达式是无名氏格局在职能行上的超集,提供了下列附加的职能:

l         拉姆da表明式允许省略参数类型并对其举行推理,而无名氏形式要求参数类型必须显式地宣称。

l         Lambda表明式体能够是说明式或语句块,而无名方法体只可以是语句块。

l         在等级次序参数推导和方法重载抉择时,拉姆da表明式能够被当作参数字传送递。

l         以1个表明式作为发挥式体的Lambda表明式能够被转换为发挥式树。

三、<locations>部分 Section <locations>

示例: 

澳门威尼斯赌场 3

BNF 定义: 

澳门威尼斯赌场 4

详尽表明: 

<location data
一>定义了3X四的矩阵Q,描述了三维空间的线性别变化换,并满足如下约定: 

澳门威尼斯赌场 5

矩阵Q是线性转变矩阵,它能够由此矩阵乘法将一个点(x, y,
z)转换来此外一些(u, v, w): 

澳门威尼斯赌场 6

Q也大概是以下基本转移矩阵的3结合: 

1) 平移转变矩阵: 

澳门威尼斯赌场 7

二) 绕放四轴旋转的转变矩阵,轴的方向为D(Dx, Dy, Dz),旋转角度ψ: 

澳门威尼斯赌场 8

三) 缩放调换矩阵: 

澳门威尼斯赌场 9

肆) 宗旨对称转换矩阵: 

澳门威尼斯赌场 10

5) 轴对称转变矩阵: 

澳门威尼斯赌场 11

陆) 平面对称转换矩阵: 

澳门威尼斯赌场 12

<location data 2>解释为组合转换的幂。<location data
2>是整数对li, pi的队列。那些行列将被解释为: 

澳门威尼斯赌场 13

Lli是<location record>部分的转移矩阵。 

读取<locations>部分的类为TopTools_LocationSet,程序代码如下所示:

 1 //=======================================================================
 2 //function : Read
 3 //purpose  : 
 4 //=======================================================================
 5 void  TopTools_LocationSet::Read(Standard_IStream& IS)
 6 {
 7   myMap.Clear();
 8 
 9   char buffer[255];
10   Standard_Integer l1,p;
11 
12   IS >> buffer;
13   if (strcmp(buffer,"Locations")) {
14     cout << "Not a location table "<<endl;
15     return;
16   }
17 
18   Standard_Integer i, nbLoc;
19   IS >> nbLoc;
20   
21   TopLoc_Location L;
22   gp_Trsf T;
23     
24   //OCC19559
25   Message_ProgressSentry PS(GetProgress(), "Locations", 0, nbLoc, 1);
26   for (i = 1; i <= nbLoc&& PS.More(); i++, PS.Next()) {
27     if ( !GetProgress().IsNull() ) 
28       GetProgress()->Show();
29 
30     Standard_Integer typLoc;
31     IS >> typLoc;
32     
33     if (typLoc == 1) {
34       ReadTrsf(T,IS);
35       L = T;
36     }
37 
38     else if (typLoc == 2) {
39       L = TopLoc_Location();
40       IS >> l1;
41       while (l1 != 0) { 
42     IS >> p;
43     TopLoc_Location L1 = myMap(l1);
44     L = L1.Powered(p) *L;
45     IS >> l1;
46       }
47     }
48     
49     if (!L.IsIdentity()) myMap.Add(L);
50   }
51 }

就算如此代码风格倒霉,缩进、括号如何的都不整齐,看起来很棘手,然而结合源程序,对地点的详尽表明的驾驭依然很有扶持的。 

里头变量nbLoc是<location record
count>的值,成员变量myMap是TopLoc_Location的一个map。当是<location
record 1>时把<location data
1>都放到TopLoc_Location的map中。当是<location record
二>时将li的转变矩阵TopLoc_Location乘pi次方。<flag>0表示<location
data 2>的结束。 

  

List.FindAll(
      delegate(string s){
      return s.Indexof(“abc”)>0}
)

20.伍.二 拉姆da表明式调换

和佚名情势表明式类似,Lambda表达式能够分类为壹种具备一定转变规则的值。那种值未有项目,但足以被隐式地转换为2个格外的信托项目。尤其地,当满意下列原则时,委托项目D包容于拉姆da表明式L:

l         D和L具备同样数量的参数;

l         如若L具有显式类型的参数列表,D中种种参数的门类和修饰符必须和L中相应的参数完全一致;

l         若是L具备隐式类型的参数列表,则D中不能够有ref或out参数;

l         即使D具备void再次回到值类型,并且L的公布式体是三个表明式,若L的各个参数的项目与D的参数壹致,则L的表述式体必须是叁个可接受为statement-expression的灵光表明式;

l         即便D具备void再次来到值类型,并且L的表明式体是一个语句块,若L的各类参数的门类与D的参数1致,则L的发表式体必须是3个实用语句块,并且该语句块中不能够有隐含表明式的return语句;

l         若是D的回到值类型不是void,并且L的发挥式体是叁个表明式,若L的每一种参数的类型与D的参数一致,则L的表达式体必须是1个方可隐式转变为D的回到值类型的有效性表明式;

l         假若D的回到值类型不是void,并且L的公布式体是1个语句块,若L的种种参数的类型与D的参数一致,则L的表述式体必须是一个卓有功能的语句块,该语句块不可能有可达的终极(即必须有return语句),并且种种return语句中的表明式都必须能够隐式调换为D的回来值类型。

末端的例证将动用二个范型委托F<U,
T>表示一个函数,它有着三个门类为U的参数u,再次来到值类型为T:

delegate T F<U, T>(U u);

咱俩得以像在底下这样赋值:

F<int, int> f1 =
x => x + 1;          

 F<int, double> f2 = x => x + 1;

各样Lambda表达式的参数和再次回到值类型通过将Lambda表明式赋给的变量的项目来检查测试。第三个赋值将拉姆da表明式成功地转移为了委托项目Func<int,
int>,因为x的花色是int,x + 一是贰个行之有效的表明式,并且能够被隐式地调换为int。同样,第3个赋值成功地将拉姆da表明式转换为了委托项目Func<int,
double>,因为x + 一的结果(类型为int)可以被隐式地改变为double类型。

来看如下代码,借使这么赋值会怎么?

F<double, int>
f3 = x => x + 1;

咱俩运维方面包车型地铁代码,编写翻译器会报如下两条错误:

(1)无法将品种“double”隐式调换为“int”。存在一个显式转变(是不是贫乏强制转变?)。

(2)不能够将Lambda表明式转变为委托项目“F<double,int>”,原因是块中的有些重回类型无法隐式转变为委托重回类型。

实在爆发三个编写翻译期错误原因是,x给定的花色是double,x + 1的结果(类型为double)不可能被隐式地更改为int。

四、<geometry>部分

<geometry>包蕴以下子部分: 

1.<2D curves> 

2.<3D curves> 

3.<3D polygons> 

4.<polygons on triangulations> 

5.<surfaces> 

6.<triangulations> 

读取<geometry>部分的类为BRepTools_ShapeSet,程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadGeometry
 3 //purpose  : 
 4 //=======================================================================
 5 void  BRepTools_ShapeSet::ReadGeometry(Standard_IStream& IS)
 6 {
 7   //OCC19559
 8   myCurves2d.SetProgress(GetProgress());
 9   myCurves.SetProgress(GetProgress());
10   mySurfaces.SetProgress(GetProgress());
11 
12   if ( !GetProgress().IsNull()) {
13     if( GetProgress()->UserBreak() ) return;
14     GetProgress()->NewScope ( 15, "2D Curves" );
15   }
16   myCurves2d.Read(IS);
17 
18   if ( !GetProgress().IsNull()) {
19     if( GetProgress()->UserBreak() ) return;
20     GetProgress()->EndScope();
21     GetProgress()->Show();
22     
23     GetProgress()->NewScope ( 15, "3D Curves" );
24   }
25   myCurves.Read(IS);
26 
27   if ( !GetProgress().IsNull()) {
28     if( GetProgress()->UserBreak() ) return;
29     GetProgress()->EndScope();
30     GetProgress()->Show();
31     
32     GetProgress()->NewScope ( 10, "3D Polygons" );
33   }
34   ReadPolygon3D(IS);
35   if ( !GetProgress().IsNull() ) {
36     if( GetProgress()->UserBreak() ) return;
37     GetProgress()->EndScope();
38     GetProgress()->Show();
39 
40     GetProgress()->NewScope ( 10, "Polygons On Triangulation" );
41   }
42   ReadPolygonOnTriangulation(IS);
43   if ( !GetProgress().IsNull()) {
44     if( GetProgress()->UserBreak() ) return;
45     GetProgress()->EndScope();
46     GetProgress()->Show();
47     
48     GetProgress()->NewScope ( 10, "Surfaces" );
49   }
50   mySurfaces.Read(IS);
51   if ( !GetProgress().IsNull() ) {
52     if( GetProgress()->UserBreak() ) return;
53     GetProgress()->EndScope();
54     GetProgress()->Show();
55 
56     GetProgress()->NewScope ( 15, "Triangulations" );
57   }
58   ReadTriangulation(IS);
59   if ( !GetProgress().IsNull()) {
60     if( GetProgress()->UserBreak() ) return;
61     GetProgress()->EndScope();
62     GetProgress()->Show();
63   }
64 }

 

 使用C# 三.0中的Lambda表达式查找”内部含有abc子串的具备字符串”:

20.伍.三 类型估算

当在并未有点名项目参数的景况下调用三个范型方法时,二个项目推测进程会去品味为该调用测度类型参数。被用作参数字传送递给范型方法的Lambda表明式也会参加这几个类别估量进度。

第叁产生的项目猜想独立于具有参数。在这一个伊始阶段,不会从作为参数的Lambda表明式估计出其余东西。可是,在始发阶段之后,将通过1个迭代进程从拉姆da表明式实行推理。越发地,当下列条件之1为真时将会形成推测:

l         参数是1个Lambda表明式,今后简称为L,从中间未获取任何推断;

l         相应参数的品类,今后简称为P,是三个寄托项目,其再次回到值类型包罗了二个或八个主意类型参数;

l         P和L具备一样数量的参数,P中各样参数的修饰符与L中相应的参数一致,可能若是L具备隐式类型的参数列表时,未有参数修饰符;

l         P的参数类型不分包方法类型参数,或仅包蕴于已经推测出来的品种参数相相配的壹组项目参数;

l         假使L具备显式类型的参数列表,当预计出来的类型被P中的章程类型参数替代了时,P中的各个参数应该具备和L中相应参数1致的项目。

l         若是L具备隐式类型的参数列表,当猜测出来的种类被P中的办法类型参数替代了并且作为结果的参数类型赋给了L时,L的表明式体必须是二个实惠的表明式或语句块。

l         可认为L预计3个回到值类型。

对此每四个如此的参数,都是通过关联P的归来值类型和从L推断出的归来值类型来从其上实行推理的,并且新的推论将被增添到储存的测算会集中。那些历程一向重复,直到无法展开愈来愈多的估算甘休。

在档案的次序估算和重载抉择中,Lambda表明式L的“猜测出来的回到值类型”通过以下步骤进行检验:

l         假如L的抒发式体是三个表明式,则该表明式的花色正是L的测度出来的回到值类型。

l         假若L的发挥式体是3个语句块,若由该块中的return语句中的表达式的项目形成的会集中正好含有二个项目,使得该集结中的各种项目都能隐式地变换为该项目,并且该品种不是1个空类型,则该品种正是L的估计出来的归来值类型。

l         除此而外,不能够从L预计出一个回去值类型。

用作包涵了拉姆da表明式的花色推测的例子,请思索System.Query.Sequence类中宣称的Select扩充方法:

namespace System.Query

    {

        public static class Sequence

        {

            public static IEnumerable<S> Select<T, S>(

                this IEnumerable<T> source,

                Func<T, S>
selector)

            {

                foreach (T element
in source) yield return selector(element);

            }

        }

    }

设若使用using语句导入了System.Query命名空间,并且定义了3个Customer类,具有二个项目为string的习性Name,Select方法能够用于从三个Customer列表中甄选名字:

List<Customer> customers =
GetCustomerList();

 IEnumerable<string> names = customers.Select(c =>
c.Name);

对扩充方法Select的调用将被拍卖为四个静态方法调用:

IEnumerable<string> names = Sequence.Select(customers, c
=> c.Name);

是因为并未有显式地钦点项目参数,将通过项目推断来演绎类型参数。首先,customers参数被提到到source参数,T被预计为Customer。然后采纳方面提到的Lamb达表明式类型揣度过程,C的体系是Customer,表明式c.Name将被波及到selector参数的回来值类型,因而估量S是string。因而,那个调用等价于:

Sequence.Select<Customer, string>(customers, (Customer c) =>
c.Name);

并且其再次回到值类型为IEnumerable<string>。

上面包车型客车事例演示了Lambda表明式的种类预计是怎么允许类型新闻在贰个范型方法调用的参数之间“流动”的。对于给定的不二等秘书诀:

static Z F<X, Y, Z>(X value,
Func<X, Y> f1, Func<Y, Z> f2) { return f2(f1(value)); }

先天我们来写这么一个调用,来探视它的猜想进度:

double seconds = F(“1:15:30”, s => TimeSpan.Parse(s), t =>
TotalSeconds);

体系揣摸进程是那样的:首先,参数”一:1五:30″被提到到value参数,测度X为string。然后,第贰个Lambda表达式的参数s具备算计出来的品种string,表达式TimeSpan.Parse(s)被提到到f1的回来值类型,推断Y是System.TimeSpan。最后,第壹个Lambda表明式的参数t拥有揣摸出来的档案的次序System.TimeSpan,并且表明式t.TotalSeconds被波及到f二的归来值类型,揣测Z为double。由此那么些调用的结果类型是double。

4.1 子部分<3D curves>

示例: 

澳门威尼斯赌场 14

BNF定义: 

澳门威尼斯赌场 15

详见表明: 

由Curves开端,前边是曲线的数据,再下边是每条曲线的实际数目。 

读取<curves>部分的类为吉优mTools_CurveSet,程序代码如下所示:

 1 #define LINE      1
  2 #define CIRCLE    2
  3 #define ELLIPSE   3
  4 #define PARABOLA  4
  5 #define HYPERBOLA 5
  6 #define BEZIER    6
  7 #define BSPLINE   7
  8 #define TRIMMED   8
  9 #define OFFSET    9
 10 //=======================================================================
 11 //function : ReadCurve
 12 //purpose  : 
 13 //=======================================================================
 14 Standard_IStream& GeomTools_CurveSet::ReadCurve(Standard_IStream& IS,
 15                         Handle(Geom_Curve)& C)
 16 {
 17   Standard_Integer ctype;
 18 
 19   try {
 20     OCC_CATCH_SIGNALS
 21     IS >> ctype;
 22     switch (ctype) {
 23 
 24     case LINE :
 25       {
 26         Handle(Geom_Line) CC;
 27         IS >> CC;
 28         C = CC;
 29       }
 30       break;
 31 
 32     case CIRCLE :
 33       {
 34         Handle(Geom_Circle) CC;
 35         IS >> CC;
 36         C = CC;
 37       }
 38       break;
 39 
 40     case ELLIPSE :
 41       {
 42         Handle(Geom_Ellipse) CC;
 43         IS >> CC;
 44         C = CC;
 45       }
 46       break;
 47 
 48     case PARABOLA :
 49       {
 50         Handle(Geom_Parabola) CC;
 51         IS >> CC;
 52         C = CC;
 53       }
 54       break;
 55 
 56     case HYPERBOLA :
 57       {
 58         Handle(Geom_Hyperbola) CC;
 59         IS >> CC;
 60         C = CC;
 61       }
 62       break;
 63 
 64     case BEZIER :
 65       {
 66         Handle(Geom_BezierCurve) CC;
 67         IS >> CC;
 68         C = CC;
 69       }
 70       break;
 71 
 72     case BSPLINE :
 73       {
 74         Handle(Geom_BSplineCurve) CC;
 75         IS >> CC;
 76         C = CC;
 77       }
 78       break;
 79 
 80     case TRIMMED :
 81       {
 82         Handle(Geom_TrimmedCurve) CC;
 83         IS >> CC;
 84         C = CC;
 85       }
 86       break;
 87 
 88     case OFFSET :
 89       {
 90         Handle(Geom_OffsetCurve) CC;
 91         IS >> CC;
 92         C = CC;
 93       }
 94       break;
 95       
 96     default:
 97       {
 98         Handle(Geom_Curve) CC;
 99         GeomTools::GetUndefinedTypeHandler()->ReadCurve(ctype,IS,CC);
100         C = CC;
101       }
102     }
103   }
104   catch(Standard_Failure) {
105 #ifdef DEB
106     Handle(Standard_Failure) anExc = Standard_Failure::Caught();
107     cout <<"EXCEPTION in GeomTools_CurveSet::ReadCurve(..)!!!" << endl;
108     cout << anExc << endl;
109 #endif
110     C = NULL;
111   }
112   return IS;
113 }

 

因为重载了操作符>>,使差别的类调用了不一样的管理函数。 

因为读取点和动向用得很频仍,所以将读取点和方向的函数程序先列出如下所示:

1 //=======================================================================
 2 //function : ReadPnt
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Pnt& P)
 6 {
 7   Standard_Real X=0.,Y=0.,Z=0.;
 8   IS >> X >> Y >> Z;
 9   P.SetCoord(X,Y,Z);
10   return IS;
11 }
12 
13 //=======================================================================
14 //function : ReadDir
15 //purpose  : 
16 //=======================================================================
17 static Standard_IStream& operator>>(Standard_IStream& IS, gp_Dir& D)
18 {
19   Standard_Real X=0.,Y=0.,Z=0.;
20   IS >> X >> Y >> Z;
21   D.SetCoord(X,Y,Z);
22   return IS;
23 }

 

List.FindAll(s=>s.IndexOf(“abc”)>0)

20.五.四 重载抉择

参数列表中的Lambda表明式将震慑到一定情景下的重载抉择(也称重载分析,重载解析等,即从多少个重载方法中精选最合适的情势开始展览调用的经过)。

下边是新扩展长的规则:

对于拉姆da表明式L,且其颇具预计出来的回到值类型,当委托项目D壹和嘱托项目D2具有完全一样的参数列表,并且将L的推理出来的回到值类型隐式转变为D一的回到值类型要优化将L的推论出来的归来值类型隐式调换为D二的归来值类型时,称L到D1的隐式转换优于L到D二的隐式转变。若是那么些规则都不为真,则五个转移都不是最优的。

4.1.1 <3D curve record 1>-Line

示例: 

澳门威尼斯赌场 16

BNF定义: 

澳门威尼斯赌场 17

详细表明: 

<3D curve record
1>定义了直线。直线数据由多个三维点P和二个三个维度倾向矢量D组成。通过点P且来势为D的直线由上边包车型客车参数方程来定义: 

澳门威尼斯赌场 18

示范数据表示的直线为经过点P(一,0,3),方向D(0,一,0),获得的参数方程为: 

澳门威尼斯赌场 19

读取直线部分的程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_Line)& L)
 7 {
 8   gp_Pnt P(0.,0.,0.);
 9   gp_Dir AX(1.,0.,0.);
10   IS >> P >> AX;
11   L = new Geom_Line(P,AX);
12   return IS;
13 }

 

 

20.5.五 表明式树

表达式树允许将Lambda表明式表现为数据结构而不是可进行代码。2个能够调换为委托类型D的拉姆da表明式,也足以转移为三个品种为System.Linq.Expressions.
Expression<D>的表述式树。将贰个Lambda表明式调换为委托项目导致可施行代码被信托所生成和引用,而将其转移为一个表明式树类型将招致创设了表达式树实例的代码被产生。表达式树是拉姆da表明式的1种高效的内部存款和储蓄器中数据表现方式,并且使得表明式的结构变得透明和明朗。

如上边包车型地铁事例将2个Lambda表达式分别显示为了可施行代码和表述式树。由于存在到Func<int,
int>的调换,因而存在到Expression<Func<int,
int>>的调换。代码如下所示:

using System.Linq.Expressions;

// 代码

 Func<int, int> f = x => x + 1;

 // 数据

 Expression<Func<int, int>> e = x => x + 1;

在那个赋值完毕今后,委托f标记一个回到x + 壹的措施,而表明式树e表示2个叙述了表达式x + 1的数据结构。

4.1.2 <3D curve record 2>-Circle

示例: 

澳门威尼斯赌场 20

BNF定义: 

澳门威尼斯赌场 21

详见表达: 

<3D curve record
二>定义了圆。圆的数量包涵多少个三个维度点P,三个正交坐标系的四个轴的方向N,Dx,Dy,还有一个非负的实数r。个中式点心P为圆心坐标,圆位于平面包车型地铁法向量为N的平面上,圆的半径为r。圆的参数方程如下所示: 

澳门威尼斯赌场 22

示范数据表示的圆为:圆心P(一,二,3),位于平面的法向量N(0,0,一),圆的倾向Dx=(一,0,-0),Dy=(-0,一,0),半径r=四,其参数方向为: 

澳门威尼斯赌场 23

读取圆部分的程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_Circle)& C)
 7 {
 8   gp_Pnt P(0.,0.,0.);
 9   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
10   Standard_Real R=0.;
11   IS >> P >> A >> AX >> AY >> R;
12   C = new Geom_Circle(gp_Ax2(P,A,AX),R);
13   return IS;
14 }

 

拉姆da表明式简单介绍

4.1.3 <3D curve record 3>-Ellipse

示例: 

澳门威尼斯赌场 24

BNF定义: 

澳门威尼斯赌场 25

详尽表明: 

<3D curve record
叁>定义了椭圆。椭圆的数码包罗三个维度点P,三个维度正交坐标系N、Dmaj、Dmin和多少个非负实数rmaj和rmin,且rmin<=rmaj。椭圆位于中央点P,法向量为N的平面上,且长轴、短轴的动向分别为Dmaj,
Dmin,长轴、短轴上的半径分别为rmaj, rmin。椭圆的参数方程定义如下所示: 

澳门威尼斯赌场 26

以身作则数据表示的扁圆形的为主点P=(壹,2,3),平面包车型客车法向量N=(0,0,1),长轴方向Dmaj=(1,0,-0),短轴方向Dmin=(-0,1,0),长轴半径为5,短轴半径为四, 

澳门威尼斯赌场 27

读取椭圆部分的程序代码如下所示:

1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_Ellipse)& E)
 7 {
 8   gp_Pnt P(0.,0.,0.);
 9   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
10   Standard_Real R1=0.,R2=0.;
11   IS >> P >> A >> AX >> AY >> R1 >> R2;
12   E = new Geom_Ellipse(gp_Ax2(P,A,AX),R1,R2);
13   return IS;
14 }

 

 

怎么Lambda表明式比匿有名的模特式更加好?

4.1.4 <3D curve record 4>-Parabola

示例: 

澳门威尼斯赌场 28

BNF定义: 

澳门威尼斯赌场 29

详细表明: 

<3D curve record
四>定义了抛物线。抛物线数据包罗三个维度点P,三维正交坐标系坐标轴方向N,Dx,Dy和2个非负的实数f。抛物线通过点P,且位于法向量为N的平面上,主旨长度为f,其参数方程如下所示: 

澳门威尼斯赌场 30

以身作则数据表示的抛物线过点P=(壹,贰,叁),位于平面包车型大巴法向N=(0,0,1),抛物线的另多个轴方向Dx=(壹,0,-0),Dy=(-0,一,0),大旨长度f=1六。参数方程为: 

澳门威尼斯赌场 31

读取抛物线部分的程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_Parabola)& C)
 7 {
 8   gp_Pnt P(0.,0.,0.);
 9   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
10   Standard_Real R1=0.;
11   IS >> P >> A >> AX >> AY >> R1;
12   C = new Geom_Parabola(gp_Ax2(P,A,AX),R1);
13   return IS;
14 }

 

 

C# 二.0的无名格局允许大家以内联的秘诀来促成委托实例,而C#
三.0的Lambda表明式运营我们选用1种更接近人的沉思,更自然的格局来促成类似于佚名方式一致的效应。

4.1.5 <3D curve record 5>-Hyperbola

示例: 

澳门威尼斯赌场 32

BNF定义: 

澳门威尼斯赌场 33

详尽表明: 

<3D curve record
5>定义了双曲线。双曲线定义数占领空间维度点P,三个维度正交坐标系坐标轴方向为N,Dx,Dy和八个非负实数Kx,Ky。双曲线过P点且法向量为N的平面上,其参数方程如下所示: 

澳门威尼斯赌场 34

以身作则数据表示的双曲线过点P=(一,贰,叁)且位于的平面包车型大巴法向N=(0,0,一),别的的多寡Dx=(一,0,-0),Dy=(-0,1,0),Kx=5和Ky=四。其参数方程为: 

澳门威尼斯赌场 35

读取双曲线部分的程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_Hyperbola)& H)
 7 {
 8   gp_Pnt P(0.,0.,0.);
 9   gp_Dir A(1.,0.,0.),AX(1.,0.,0.),AY(1.,0.,0.);
10   Standard_Real R1=0.,R2=0.;
11   IS >> P >> A >> AX >> AY >> R1 >> R2;
12   H = new Geom_Hyperbola(gp_Ax2(P,A,AX),R1,R2);
13   return IS;
14 }

 

 

拉姆da表明式格式

4.1.6 <3D curve record 6>-Bezier Curve

示例: 

澳门威尼斯赌场 36

BNF定义: 

澳门威尼斯赌场 37

详见表达: 

<3D curve record
陆>定义了Bezier曲线。Bezier曲线数据包罗有理标记r,曲线的次数m(degree
m <=
25查看源代码可见OpenCascade可管理的B样条次数不超过贰伍)和带权的调控点(weight
poles)。当有理标记位r=0时,weight
poles就是m+1个三维点:B0,B一…Bn;当有理标识位r=一时,weight
poles正是带权的调控点B0 h0… Bm
hm。Bi是三个维度点,hi是[0,m]正实数,即权因子。当有理标志位r=0时,即不是有理Bezier曲线时,hi=一。Bezier曲线参数方程如下所示: 

澳门威尼斯赌场 38

演示数据表示的Bezier曲线是有理Bezier曲线,因其有理标记位r=1,次数m=二,带权调节点及权因子分别为:B0=(0,1,0),h0=四,B1=(一,-二,0),h1=伍,B二=(二,叁,0),h2=6。Bezier曲线的参数方程如下所示: 

澳门威尼斯赌场 39

读取Bezier曲线部分的程序代码如下所示:

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_BezierCurve)& B)
 7 {
 8   Standard_Boolean rational=Standard_False;
 9   IS >> rational;
10 
11   // poles and weights
12   Standard_Integer i=0,degree=0;
13   IS >> degree;
14 
15   TColgp_Array1OfPnt poles(1,degree+1);
16   TColStd_Array1OfReal weights(1,degree+1);
17   
18   for (i = 1; i <= degree+1; i++) {
19     IS >> poles(i);
20     if (rational)
21       IS >> weights(i);
22   }
23 
24   if (rational)
25     B = new Geom_BezierCurve(poles,weights);
26   else
27     B = new Geom_BezierCurve(poles);
28 
29   return IS;
30 }

 

(参数列表)=>表明式或然语句块

4.1.7 <3D curve record 7>-B-Spline curve

示例: 

澳门威尼斯赌场 40

BNF定义: 

澳门威尼斯赌场 41

详尽表明: 

<3D curve record
七>定义了B-Spline曲线。B-Spline曲线包涵了创制标记位r,曲线次数m<=二伍,调节点数n>=二,重节点数k,带权调控点wieght
poles和重节点multiplicity knots。 

当有理标记位r=0时,是非有理B样条曲线,weight
poles有n个三个维度点B1,…,Bn;当有理标识位r=壹时,是有理B样条曲线,weight
poles是n个带权调节点对:B壹, h一, …. Bn,
hn。这里Bi表示二个三个维度点,hi表示2个[0,1]正实数。当有理标记位r=0时,hi=一。 

重节点有k对u一, q一, … uk, qk。这里ui是重复度为qi>=一的节点。 

澳门威尼斯赌场 42

B-Spline曲线的参数方程如下所示: 

澳门威尼斯赌场 43

中间Ni,j有如下的递归定义: 

澳门威尼斯赌场 44

澳门威尼斯赌场 45

澳门威尼斯赌场 ,以身作则数据表示的B样条曲线为:有理标记位r=一,次数m=1,调控点数n=三,重节点数k=伍,带权调整点:B一=(0,一,0),h一=4,B二=(壹,-二,0),h贰=伍,B三=(二,三,0),h3=六;重节点u一=0,q一=一,u二=0.贰伍,q二=壹,u三=0.5,q3=一,u四=0.75,q四=一,u伍=1,q五=1。B-Spline曲线的参数方程如下所示: 

澳门威尼斯赌场 46

读取B-Spline曲线部分的程序代码如下所示: 

 

 1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_BSplineCurve)& B)
 7 {
 8 
 9   Standard_Boolean rational=Standard_False,periodic=Standard_False;
10   IS >> rational >> periodic;
11 
12   // poles and weights
13   Standard_Integer i=0,degree=0,nbpoles=0,nbknots=0;
14   IS >> degree >> nbpoles >> nbknots;
15 
16   TColgp_Array1OfPnt poles(1,nbpoles);
17   TColStd_Array1OfReal weights(1,nbpoles);
18   
19   for (i = 1; i <= nbpoles; i++) {
20     IS >> poles(i);
21     if (rational)
22       IS >> weights(i);
23   }
24 
25   TColStd_Array1OfReal knots(1,nbknots);
26   TColStd_Array1OfInteger mults(1,nbknots);
27 
28   for (i = 1; i <= nbknots; i++) {
29     IS >> knots(i) >> mults(i);
30   }
31 
32   if (rational)
33     B = new Geom_BSplineCurve(poles,weights,knots,mults,degree,periodic);
34   else
35     B = new Geom_BSplineCurve(poles,knots,mults,degree,periodic);
36   
37   return IS;
38 }

 

能够有多个参数,多少个参数,大概无参数。参数类型能够隐式恐怕显式。比方:

4.1.8 <3D curve record 8>-Trimmed Curve

示例: 

澳门威尼斯赌场 47

BNF定义: 

澳门威尼斯赌场 48

详细表达: 

<3D curve record 八>定义了裁剪曲线(trimmed
curve)。裁剪曲线数据包罗:八个实数umin,umax和<3D curve
record>,且umin<umax。裁剪曲线是将<3D curve
record>描述的曲线B限制在[umin,umax]。裁剪曲线的参数方程如下所示: 

澳门威尼斯赌场 49

以身作则数据表示的剪裁曲线为:umin=-肆,umax=伍,曲线B(u)=(一,二,三)+u(一,0,0)。裁剪曲线的参数方程如下所示: 

澳门威尼斯赌场 50

读取裁剪曲线部分的程序代码如下所示: 

 

1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 
 6 static Standard_IStream& operator>>(Standard_IStream& IS,
 7                     Handle(Geom_TrimmedCurve)& C)
 8 {
 9   Standard_Real p1=0.,p2=0.;
10   IS >> p1 >> p2;
11   Handle(Geom_Curve) BC;
12   GeomTools_CurveSet::ReadCurve(IS,BC);
13   C = new Geom_TrimmedCurve(BC,p1,p2);
14   return IS;
15 }

 

(x,y)=>x*y //多参数,隐式类型=>表明式
x=>x*十 //单参数,隐式类型=>表明式
x=>{return x*十} //单参数,隐式类型=>语句块
(int x) => x*十 //单参数,显式类型=>表明式
(int x) =>{return x*10} //单参数,显示等级次序=>语句块
()=>{Console.WriteLine()}//无参数

4.1.9 <3D curve record 9>-Offset Curve

示例: 

澳门威尼斯赌场 51

BNF定义: 

澳门威尼斯赌场 52

详见表达: 

<3D curve record 九>定义了偏移曲线(offset
curve)。偏移曲线的数据包蕴偏移距离d,偏移方向D和曲线数据<3D curve
record>。偏移曲线是将<3D curve
record>描述的曲线沿矢量澳门威尼斯赌场 53舞狮距离d后的结果。偏移曲线的参数方程如下所示: 

澳门威尼斯赌场 54

以身作则数据表示的偏移曲线为偏移距离d=2,方向D=(0,一,0),基曲线B(u)=(一,二,三)+u(一,0,0),其参数方程如下所示: 

澳门威尼斯赌场 55

读取偏移曲线部分程序代码如下所示:

1 //=======================================================================
 2 //function : ReadCurve
 3 //purpose  : 
 4 //=======================================================================
 5 static Standard_IStream& operator>>(Standard_IStream& IS,
 6                     Handle(Geom_OffsetCurve)& C)
 7 {
 8   Standard_Real p=0.;
 9   IS >> p;
10   gp_Dir D(1.,0.,0.);
11   IS >> D;
12   Handle(Geom_Curve) BC;
13   GeomTools_CurveSet::ReadCurve(IS,BC);
14   C = new Geom_OffsetCurve(BC,p,D);
15   return IS;
16 }

 

未完,待续……

 

注意:

一.Lambda表达式的参数类型能够省略,因为能够依照使用上下文实行测算。

二.Lambda表明式的主脑(body)可以是表明式,也得以是语句块。

三.拉姆da表明式传入的实参将参加项目预计,以及艺术重载辨析。

④.Lambda表达式表明式和表明式体能够被转变到表达式树。

 

拉姆da表达式与寄托项目

拉姆da表明式L能够被转变到委托类型D,必要满足以下条件:

壹.L和D具有一样的参数个数

贰.L参数类型要与D参数类型一样。注意隐式类型要参加项目辨析。

3.D的归来类型与L一样,无论L是表达式,依然语句块。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图