画带箭头的线段

2023-02-01  本文已影响0人  xuxiang

#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<desX,srcY<desY

z=z;

情况2:

srcX>desX,srcY<desY

z=M_PI-z;

情况3:

srcX>desX,srcY>desY

z=M_PI+z;

情况4:

srcX<desX,srcY>desY

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

上一篇 下一篇

猜你喜欢

热点阅读