需求是这样的:
在客户绘制区域任意一条线段A,用户在线段上任意点中一点,在这个点上画一小段(10像素)直线B,该直线B与线段A垂直(90度角),我原来用的是斜率算法,但在实际使用时,感觉用ArcTan速度较慢,并且不稳定,所以我不想使用斜率的算法(也有可能我写的斜率函数有问题)希望得到大家的无私帮助,尽快将此问题解决,在下高分相送。
在客户绘制区域任意一条线段A,用户在线段上任意点中一点,在这个点上画一小段(10像素)直线B,该直线B与线段A垂直(90度角),我原来用的是斜率算法,但在实际使用时,感觉用ArcTan速度较慢,并且不稳定,所以我不想使用斜率的算法(也有可能我写的斜率函数有问题)希望得到大家的无私帮助,尽快将此问题解决,在下高分相送。
1、直线A的斜率k已知吗?若不知道,用斜率公式可求2、直线B的斜率等于 -1/k3、不需要用到什么ArcTan啊4、需要单独讨论直线A平行于你选定的x轴或垂直于x轴的情形
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);
}
typedef struct _EQUATIONPARA
{
double a; //x的参数
double b; //y的参数(为1或0)
double c; //常数
}EQUATIONPARA;
你的思路很好理解,有参考的例程吗?
多谢。
你的思路很好理解,有参考的例程吗?
多谢。
假定运来的线段是 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 右边的垂线