先来段代码。
angle_ll (Row1, Column1, Row, Column,Row1, Column1, Row5-RT_Y, Column5+RT_X, Angle1) disp_line(200000, Row1, Column1, Row, Column) disp_line(200000, Row1, Column1, Row5-RT_Y, Column5+RT_X) tuple_deg(Angle1, Deg1) angle_ll (Row1, Column1, Row, Column,Row1, Column1, Row5-RB_Y, Column5+RB_X, Angle2) disp_line(200000, Row1, Column1, Row, Column) disp_line(200000, Row1, Column1, Row5-RB_Y, Column5+RB_X) tuple_deg(Angle2, Deg2) angle_ll (Row1, Column1, Row, Column,Row1, Column1, Row5-LB_Y, Column5+LB_X, Angle3) disp_line(200000, Row1, Column1, Row, Column) disp_line(200000,Row1, Column1, Row5-LB_Y, Column5+LB_X) tuple_deg(Angle3, Deg3) angle_ll (Row1, Column1, Row, Column,Row1, Column1, Row5-LT_Y, Column5+LT_X, Angle4) disp_line(200000, Row1, Column1, Row, Column) disp_line(200000,Row1, Column1, Row5-LT_Y, Column5+LT_X) tuple_deg(Angle4, Deg4)
(图1)
angle_ll算子计算两条边的夹角。
上面代码中disp_line(200000, Row1, Column1, Row, Column) 这条边是电池两极耳中间那根绿线。
这条边顺时针与边1,2,3,4构成的4个角,其角度值如下:
Deg1=-50.298 Deg2=-154.89 Deg3=155.3 Deg4=50.3169
现在的问题是,angle_ll算子的角度是如何表示的?如何区分正负?
为了搞清楚这个问题,我们先来看看算子angle_lx是怎么样表示角度的。
之前勇哥写了一篇angle_lx算子的角度表示的问题,请参见下面的贴子:
这里为了方便查看,勇哥把贴子的内容再改编引用一下。
先上一段代码:
dev_close_window() ******************************************************************* 範例 *第一向限 gen_image_const(Image, 'byte', 1024, 1024) dev_open_window(0, 0, 1024, 1024, 'black', WindowHandle) Row_1 := 500 Col_1 := 400 Row_2 := 200 Col_2 := 500 angle_lx(Row_1, Col_1, Row_2, Col_2, Angle1) dev_set_color('green') dev_set_draw('fill') disp_line(WindowHandle, Row_1, Col_1, Row_2, Col_2) dev_set_color('red') dev_set_draw('fill') disp_circle(WindowHandle, Row_1, Col_1, 5) disp_message(WindowHandle, '第一點 (Row_1 : ' + Row_1 + ', Col_1 : ' + Col_1 + ')', 'image', Row_1 + 10, Col_1 + 10, 'black', 'true') dev_set_color('blue') dev_set_draw('fill') disp_circle(WindowHandle, Row_2, Col_2, 5) disp_message(WindowHandle, '第二點 (Row_2 : ' + Row_2 + ', Col_2 : ' + Col_2 + ')', 'image', Row_2 + 10, Col_2 + 10, 'black', 'true') ********************** *第二向限 Row_2 := 199 Col_2 := 158 angle_lx(Row_1, Col_1, Row_2, Col_2, Angle2) dev_set_color('green') dev_set_draw('fill') disp_line(WindowHandle, Row_1, Col_1, Row_2, Col_2) dev_set_color('blue') dev_set_draw('fill') disp_circle(WindowHandle, Row_2, Col_2, 5) disp_message(WindowHandle, '第二點 (Row_2 : ' + Row_2 + ', Col_2 : ' + Col_2 + ')', 'image', Row_2 + 10, Col_2 + 10, 'black', 'true') ********************** *第三向限 Row_2 := 707 Col_2 := 155 angle_lx(Row_1, Col_1, Row_2, Col_2, Angle3) dev_set_color('green') dev_set_draw('fill') disp_line(WindowHandle, Row_1, Col_1, Row_2, Col_2) dev_set_color('blue') dev_set_draw('fill') disp_circle(WindowHandle, Row_2, Col_2, 5) disp_message(WindowHandle, '第二點 (Row_2 : ' + Row_2 + ', Col_2 : ' + Col_2 + ')', 'image', Row_2 + 10, Col_2 + 10, 'black', 'true') ********************** *第四向限 Row_2 := 623 Col_2 := 752 angle_lx(Row_1, Col_1, Row_2, Col_2, Angle4) dev_set_color('green') dev_set_draw('fill') disp_line(WindowHandle, Row_1, Col_1, Row_2, Col_2) dev_set_color('blue') dev_set_draw('fill') disp_circle(WindowHandle, Row_2, Col_2, 5) disp_message(WindowHandle, '第二點 (Row_2 : ' + Row_2 + ', Col_2 : ' + Col_2 + ')', 'image', Row_2 + 10, Col_2 + 10, 'black', 'true') ********************** *把第一根线的第一点与第二点换个位置试试 Row_1 := 450 Col_1 := 400+100 Row_2 := 180 Col_2 := 500+100 angle_lx(Row_2, Col_2,Row_1, Col_1, Angle5) dev_set_color('green') dev_set_draw('fill') disp_line(WindowHandle, Row_2, Col_2, Row_1, Col_1) dev_set_color('red') dev_set_draw('fill') disp_circle(WindowHandle, Row_2, Col_2, 5) disp_message(WindowHandle, '第一點 R(ow_1 : ' + Row_2 + ', Col_1 : ' + Col_2 + ')', 'image', Row_2 + 10, Col_2 + 10, 'black', 'true') dev_set_color('blue') dev_set_draw('fill') disp_circle(WindowHandle, Row_1, Col_1, 5) disp_message(WindowHandle, '第二點 (Row_2 : ' + Row_2 + ', Col_1 : ' + Col_2 + ')', 'image', Row_1, Col_1 + 10, 'black', 'true') degree1 := deg(Angle1) degree2 := deg(Angle2) degree3 := deg(Angle3) degree4 := deg(Angle4) degree5 := deg(Angle5) disp_message(WindowHandle, '角度 = ' + degree1+','+degree2 +','+degree3+','+degree4+ ','+degree5+' 度', 'window', 20, 20, 'black', 'true')
结果如下图。
其中线1,2,3,4的起点都是中间那个红点, 线5是勇哥故意让起点反过来,以观察角度的变化。
图片左上角显示的是线1,2,3,4,5的角度。
(图2)
angle_lx算子表示角度的规律如下图所示。
第一象限:x1<x2, y1>y2
第二象限:x1>x2,y1>y2
第三象限:x1>x2,y1<y2
第四象限:x1<x2,y1<y2
还有不位于任何象限的四组角度:
0度: x1<x2,y1=y2
90度: x1=x2,y1>y2
-180(或180度) : x1>x2,y1=y2
-90度:x1=x2,y1<y2
你可以按照(图2)的结果代入上面的关系式中验证。
当你看(图3)的时候,注意不要按数学上的坐标系来想象,现在的坐标系原点在左上角,向下是row增大,向右是col增大。
如果你按数学上的坐标系来解释,则下面的关系是不成立的。
第一象限:x1<x2, y1>y2
(图3)
我们在回过头看angle_ll算子。
angle_ll算子
计算两条直线之间的角度。作为输入,第一行(RowA1,ColumnA1,RowA2,ColumnA2)和第二行(RowB1,ColumnB1,RowB2,ColumnB2)。
计算过程如下:我们将直线解释为向量,起点分别为RowA1、ColumnA1和RowB1、ColumnB1和终点分别为RowA2、ColumnA2和RowB2、ColumnB2。将向量A逆时针旋转到向量B上(旋转的中心是两条直线的交点)产生角度。结果取决于点的顺序和线的顺序。参数Angle返回以弧度为单位的角度,范围为-pi<=Angle<=pi。
再次引用一下(图1)和结果如下:
Deg1=-50.298 Deg2=-154.89 Deg3=155.3 Deg4=50.3169
因为:
两线夹角取值范围范围为-pi<=Angle<=pi, 即在+-180之间
逆时针为正,顺时针为负
所以:
5线到1线的夹角为顺时针计算,负
5线到2线的夹角为顺针针计算,负
5线到3线的夹角为逆时针计算,正
5线到4线的夹角为逆时针计算,正
因此算子angle_lx,和angle_ll 算子的角度判定方式是不一样的。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

