iCAx开思工具箱

标题: 急用!求open API中询问两条直线夹角得函数 [打印本页]

作者: dchl0301    时间: 2006-8-28 10:11
标题: 急用!求open API中询问两条直线夹角得函数
要求,已知两条直线的TAG
有没有根据两条直线的TAG求夹角的函数啊??
忘指教,急用!
作者: wgwang    时间: 2006-8-28 14:16
UF_CURVE_ask_line_data,得到line得端点,然后用端点减得到line的vec
UF_VEC3_angle_between得到两个VEC得夹角
作者: dchl0301    时间: 2006-8-28 15:31
原贴由发表:
UF_CURVE_ask_line_data,得到line得端点,然后用端点减得到line的vec
UF_VEC3_a

我按照你的意思调试了一下,但是误差有点大,比如我问到的角是5.1度,但是用UG的Analysis 功能问出来的是5度(实际造型的时候也是5度),相差太多了。还有没有其他的方法呀?
谢谢继续指教!:》
作者: wgwang    时间: 2006-8-29 10:53
不会有这么大的误差,那是你自己程序的问题,仔细检查一下
作者: dchl0301    时间: 2006-8-29 14:58
三维条件下还是误差很大,我在求直线矢量的时候,矢量加A+(-B),矢量减A-B都用过了,结果还是没有改变。但是在转成二维条件下(drafting模块下)时,结果的误差却变小了,真是不知道其中原因啊。 ??
作者: wgwang    时间: 2006-8-29 16:34
我试过在modeling里面两条直线做出来误差不超过0.001啊
作者: wgwang    时间: 2006-8-29 16:37
char *part_name="D:\\linetest\\ttt.prt";
         tag_t part;
         UF_PART_load_status_t  error_status;
         int errorno;
     int type=UF_line_type;
         int object[2]={0,0};
         tag_t line_tag=NULL_TAG;
         int i=0;
     UF_CURVE_line_t line_coords[2];
         double Line_Vec[2][3];
         double angle;
         double vec_ccw[3];

    /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) )
    {
        /* Failed to initialize */
        return;
    }
   
    /* TODO: Add your application code here */
   
         errorno=UF_PART_open (part_name,&part,&error_status );

       
    //obtain the line tags
        do
                {
                        UF_CALL( UF_OBJ_cycle_objs_in_part( part,type, &line_tag ) );
                        if( line_tag == NULL_TAG )
                                break;
                        object[i++]=line_tag;

                }while( line_tag != NULL_TAG );


        //obtain the vertex of the two lines
               
                UF_CALL(UF_CURVE_ask_line_data (object[0],&line_coords[0] ));
            UF_CALL(UF_CURVE_ask_line_data (object[1],&line_coords[1] ));
   
                Line_Vec[0][0]=line_coords[0].end_point[0]-line_coords[0].start_point[0];
                Line_Vec[0][1]=line_coords[0].end_point[1]-line_coords[0].start_point[1];
                Line_Vec[0][2]=line_coords[0].end_point[2]-line_coords[0].start_point[2];
                Line_Vec[1][0]=line_coords[1].end_point[0]-line_coords[1].start_point[0];
                Line_Vec[1][1]=line_coords[1].end_point[1]-line_coords[1].start_point[1];
                Line_Vec[1][2]=line_coords[1].end_point[2]-line_coords[1].start_point[2];


       
            UF_VEC3_cross(Line_Vec[0], Line_Vec[1], vec_ccw);
                UF_VEC3_angle_between (Line_Vec[0], Line_Vec[1],vec_ccw,&angle );

                angle=angle*180/PI;

               
    /* Terminate the API environment */
    UF_CALL(UF_terminate());
作者: dchl0301    时间: 2006-8-30 10:04
谢谢你耐心的解答啊!
我和你继续讨论一个问题行吗?
一条直线的矢量能否这样求啊,连接原点和直线的两个端点分别够成两条直线,而且这两条直线的矢量坐标就是原直线的两个端点(对吧:>)。这时原直线的矢量就可以由这两个从端点出发的矢量作矢量差来得到(仍然正确吧:>)
作者: dchl0301    时间: 2006-8-30 10:10
于是有
直线1矢量:
UF_VEC3_sub(line_coords[0].end_point,line_coords[0].start_point, vec_diff0);
直线2矢量:
UF_VEC3_sub(line_coords[1].end_point,line_coords[1].start_point, vec_diff1);
此时求两条直线得夹角是:
UF_MODL_ask_vector_angle (vec_diff0, vec_diff1, &small_angle, &large_angle);
这种做法正确吗?
作者: dchl0301    时间: 2006-8-31 22:38
寻好心的wgwang一起讨论问题 :》
作者: wgwang    时间: 2006-9-4 11:37
你的这种方法也没问题啊,其实算法和我是一样的,只是函数用的不同,你可以自己debug一下,两种方法得到的矢量都是一样的,有什么问题吗?
作者: 7cmm    时间: 2009-4-29 09:39
请问一下,UF_VEC3_angle_between()得到的角度的范围是0-2PI吗?为什么我得到的都是0-PI?还有就是这个角度是怎么得到的,是第一个向量右手法则到第二个向量吗?是否跟视图有关?急!!谢谢
作者: zhangcanwei    时间: 2009-4-29 21:01
两个矢量夹角用余弦定理自己也可以计算出来。计算结果在0-180度。要想得到0-360度,得先用叉积来定义一个坐标面做参考。否则就谈不上0-360
作者: 7cmm    时间: 2009-5-5 09:11
13#
作者: 7cmm    时间: 2009-5-5 10:10
11#  



向您请教个问题,我的其中一个向量是一定的,另一个是变化的,根据两个向量叉乘得到的第三个参数是变化的,所以得到的角度是0-180?我现在想得到0-360的角度,关键问题是我怎么样才能固定第三个参数,不知道您有没有什么好的方法?谢谢。我刚接触UG二次开发不久,问题很急,我的邮箱是ming.liu.lk@gmail.com,您有什么好的建议我们可以通过邮箱交流,非常感谢。
作者: printsimp    时间: 2010-1-8 23:05
右手螺旋定则




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3