#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)
![](https://img.haomeiwen.com/i4960880/ca62ffc54c073b3c.png)
正切函数图像如上。
![](https://img.haomeiwen.com/i4960880/189f3a74fc3b87f4.png)
正弦函数图像如上。
![](https://img.haomeiwen.com/i4960880/61e8770b3693951c.png)
余弦函数图像如上。
假定显示时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
网友评论