画带箭头的线段

#deifne F_EQU 0.0000001

#define M_PI  3.1415926

需要注意显示时的设备坐标系和逻辑坐标系,还需要考虑缩放比例。


坐标系:

设备坐标系的原点在左上角,x从左到右变大,y从上到下变大。

逻辑坐标系的原点在左下角,x从左到右变大,y从下到上变大。

计算时只考虑逻辑坐标系,显示时再转换成设备坐标系。


缩放比例:

如下的srcX,不一定是真实的x坐标。加入显示时一个像素代表一个单位,则srcX是真实的x坐标,否则srcX*scale才是真实的x坐标,scale代表缩放比例,比如一个像素代表50mm,则x坐标的真实数据是:srcX*50,单位为mm。


假定有点A(srcX,srcY),B(desX,desY)。有一线段从点A到点B。

则正常显示画线从点A到点B即可。

假如点A和点B是圆圈,需要从圆圈外部连线,而不是两个圆心之间连,则需要计算两个圆圈外部的坐标A1(src1X,src1Y),B1(des1X,des1Y)。

AB线段的角度正切值: tanAB=(desY-srcY)/(desX-srcX)

z=atan(tanAB)


正切函数图像如上。


正弦函数图像如上。


余弦函数图像如上。

假定显示时A点和B点圆圈半径为 r。

 因为正切函数无法像正弦,余弦那样表达4个像限,所以通过反正切求线段AB的角度时需要针对4种情况做处理:

情况1:

srcX

z=z;


情况2:

srcX>desX,srcY

z=M_PI-z;


情况3:

srcX>desX,srcY>desY

z=M_PI+z;


情况4:

srcXdesY

z=2*M_PI-z;


最终计算圆圈上点坐标的公式如下:

src1X=srcX+cos(z)*r*scale

src1Y=srcY+sin(z)*r*scale

des1X=desX-cos(z)*r*scale

des1Y=desY-sin(z)*r*scale


此时假定以(des1X,des1Y)为顶点画一个顶点角度为30度的锐角三角形。

则三角形另外2个点的坐标t1(t1X,t1Y),t2(t2X,t2Y)

B=M_PI/2-z-(15*M_PI)/180.0

C=M_PI/2-z+(15*M_PI)/180.0

t1X=des1X-sin(B)*15*scale

t1Y=des1Y-cos(B)*15*scale

t2X=des2X-sin(C)*15*scale

t2Y=des2Y-cos(C)*15*scale

你可能感兴趣的:(画带箭头的线段)