在HDevelop中,除了tuples和iconic objects这两种变量类型之外,还有第三种变量类型:vector。
注:iconic objects数据类型即图标对象,指的是 图像、区域和XLD数据的总称
向量是可以容纳任意数量元素的容器,所有元素都必须具有完全相同的变量类型(即元组、图标对象或向量)。
HDevelop中的向量与C++标准模板库中的向量相同。
演示代码:
dev_close_window () dev_update_off () dev_open_window (0, 0, 512, 512, 'black', WindowHandle) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') Message := 'This program gives an overview of' Message[1] := 'vector variables and how to use them.' Message[2] := 'Please' Message[3] := ' - step through the program,' Message[4] := ' - read the comments,' Message[5] := ' - and check the variable view.' disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true') stop () * *向量构造: *写向量最简单的方法是放一个(逗号分隔) *在花括号之间的元素列表。 Vector1 := {1,2} * *注意,{[1,2]}与{1,2}不同: Vector2 := {[1,2]} *向量元素可以是常量(表达式)也可以是变量。 Tuple1 := [5,6] Tuple2 := 'eight' Vector3 := {Tuple1,Tuple2} * 向量也可以包含图标对象: read_image (ImageFabrik, 'fabrik') read_image (ImagePatras, 'patras') ImageVector := {ImageFabrik,ImagePatras} *可以使用多维向量: Vector2dim := {{1,2},Vector3} Vector3dim := {Vector2dim,{Vector1,Vector2}} *注意,向量的所有元素必须具有相同的类型。 * 下面是错误的示例 * InvalidExpression := {Vector1,Vector2dim} * * 向量元素读写: *向量元素读写使用.at() 表达式 Tuple := Vector3.at(0) Image := ImageVector.at(1) * .at() expressions may as well serve as l-values. * E.g., they can be used as output parameters. Vector4.at(0) := Tuple *允许写入不存在的向量元素。如有必要, *向量将自动填充空元素。 Vector5.at(4) := Tuple * 向量元素可以用作运算符或过程的参数 for I := 0 to ImageVector.length() - 1 by 1 sobel_amp (ImageVector.at(I), ImageVectorSobel.at(I), 'sum_abs', 3) endfor *还可以组合多个.at()表达式来访问 *多维向量的子元素。 Vector3dim.at(1).at(0) := {5,6} * 即使是以下情况也是可能的(尽管不完全推荐) Vector3dim.at(0).at(1).at(1)[0] := 8 * * 取向量长度: Length := Vector1.length() * * 移除向量全部元素 Vector3dimCopy := Vector3dim Vector3dimCopy.clear() *注意,清除的向量仍然保持其变量类型。这个 *下列赋值导致类型冲突,因此无效! * Vector3dimCopy.at(0) := 1 * Vector3dimCopy.at(0) := {1} * .remove() removes an element with given index from a vector. Vector5.remove(0) * * .insert() inserts at the given position one vector element into a vector. Vector5.insert(1,2) * Again, the vector gets filled up with empty elements where necessary. Vector5.insert(8,10) * * 向量转换: * 转换tuple为一维向量 Tuple3 := [1,2,3,4,5,6,7,8] convert_tuple_to_vector_1d (Tuple3, 1, Vector1FromTuple3) convert_tuple_to_vector_1d (Tuple3, 2, Vector2FromTuple3) * 任意维的输入向量,并将其存储在单个输出元组中 convert_vector_to_tuple (Vector5, TupleFromVector5) convert_vector_to_tuple (Vector2dim, TupleFromVector2dim) * *算子dev_inspect_ctrl弹出一个变量视图可用于检查向量变量 dev_inspect_ctrl ([Tuple3,Vector1FromTuple3,Vector2FromTuple3,Vector5,TupleFromVector5,Vector2dim,TupleFromVector2dim,Vector3dim])
那么, halcon中这个向量跟数学中的平面向量有什么关系?
如下图,勇哥按数学上的定义计算一下向量p3:
向量p1=(35-0,35-0)=p1(35,35)
向量p2=(80-0,15-0)=p2(80,15)
向量p3=向量p1+向量p2=p2(35+80,35+15)=p2(115,50)
用halcon试试,可以看到是不允许两个向量相加的。
勇哥也查了一下C++的标准模板库中的向量,一般认为可以理解为它是数组的加强版,即是一种自动分配内存的容器。
有人说,C++中的向量叫vector这个名字,主要是因为当年标准委员会智障。
实际上并不支持向量的加减乘除运算,所以跟数学上的平面向量毛的关系都没有。
也许halcon就是照着C++的vector照搬的吧。
在勇哥的netMarketing类库中有向量类Vecter。
private void button13_Click_1(object sender, EventArgs e) { Vecter p1 = new Vecter(2); p1.ele[0] = 35; p1.ele[1] = 35; Vecter p2 = new Vecter(2); p2.ele[0] = 80; p2.ele[1] = 15; var p3 = p1 + p2; }
可以看到,运算的结果是正确的。
我们知道矩阵也可以看成一组向量的集合,因此向量运算是矩阵运算的基础,也是非常常用的。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

