需求是这样的:
    在客户绘制区域任意一条线段A,用户在线段上任意点中一点,在这个点上画一小段(10像素)直线B,该直线B与线段A垂直(90度角),我原来用的是斜率算法,但在实际使用时,感觉用ArcTan速度较慢,并且不稳定,所以我不想使用斜率的算法(也有可能我写的斜率函数有问题)希望得到大家的无私帮助,尽快将此问题解决,在下高分相送。

解决方案 »

  1.   


    1、直线A的斜率k已知吗?若不知道,用斜率公式可求2、直线B的斜率等于 -1/k3、不需要用到什么ArcTan啊4、需要单独讨论直线A平行于你选定的x轴或垂直于x轴的情形
      

  2.   

    计算线段垂直线的直线方程函数:ax+by+c=0
    void CRouteTools::GetVertLine(long x1,long y1,long x2,long y2,EQUATIONPARA& para)
    {
    if(x1 == x2)//垂线
    {
    para.a = 0;
    para.b = 1;
    para.c = -y1;
    return;
    }
    if(y1 == y2)
    {
    para.b = 0;
    para.a = 1;
    para.c = -x1;
    return;
    }
    para.b = 1;
    para.a = ((double)(x2-x1))/(y2-y1);
    para.c = -(para.a*x1+y1);
    }
      

  3.   

    //直线方程式ax+by+c=0的参数结构
    typedef struct _EQUATIONPARA
    {
    double a; //x的参数
    double b; //y的参数(为1或0)
    double c; //常数
    }EQUATIONPARA;
      

  4.   

    to he_sl(he_sl):
    你的思路很好理解,有参考的例程吗?
    多谢。
      

  5.   

    to he_sl(he_sl):
    你的思路很好理解,有参考的例程吗?
    多谢。
      

  6.   

    要是计算角度的话,应该用 atan2 函数更好一些但是就画90度的线来说,用不到这样的麻烦
    假定运来的线段是 AB, 线段上的点为C,从C点引入垂线,长度l,对应新垂线是CD
    那么,先计算一个方向向量v:(B-A), 单位化 v = v/|v|
    那么垂直V的方向W有两个:左边的 W1(-v.y, v.x) 和 右边的W2(v.y, -v.x) D = C + W1 * l  左边的垂线
    D = C + W2 * l  右边的垂线
      

  7.   

    happy__888([顾问团]寻开心): 多谢。