在程序中,根据已知的任意两点(x1,y1),(x2,y2),连接画一线段,现在要给这一线段加上一个箭头,设箭头的长度为20,箭头线与那线段的夹角为20度.画那个箭头需要三个坐标点,一个坐标点不是线段的端点,已知了,求另外两个坐标点(zx1,zy1),(zx2,zy2)怎么求?? 我现在已经算出如果那线段是水平时,箭头的坐标点了.
zx1 = x2-20*cos(20);
zy1 = y2-20*sin(20);

zx2 = x2-20*cos(20);
zy2 = y2+20*sin(20);
然后将这两点点与线段的第二个端点连成两条线就成了箭头了.

但如果那线段不是水平线时,我的箭头的两个坐标点就不知怎么根据斜率来变换了,算了几天,头都算晕了,总是不对,还望各位帮忙看看.
还有,我上面的算法中,让箭头两点的Y一个是加上那个偏量,一个是减去偏量,实际这只是在水平时是这样,如果线很直的时候,两个Y都是比线段的端点大了,不知该如何写?
非常感谢!

解决方案 »

  1.   

    假设现在要在(x1,y1)处画箭头
    我的方法是这样的
    第一步:计算出直线上和(x1,y1)距离为20的点坐标,当然这个点是介于(x1,y1)和(x2,y2)之间的,其目的是要通过第二步中的绕任意点旋转矩阵,旋转之后得到结果,这个应该能求吧,我就不多说了,最后本步得到中间结果:要旋转的点(x',y')第二步:通过图形学中的旋转变化矩阵,对已有的计算出的点进行旋转,旋转基于的是(x1,y1),要旋转的点是(x',y'),有现成的旋转矩阵可用:
    |     cos(20)                       sin(20)                0  |
    |    -sin(20)                       cos(20)                0  |
    |(1-cos(20))*x1+y1*sin(20)  (1-cos(20))*y1-x1*sin(20)      0  |
    设这个矩阵为R(20)
    那么(x',y')乘以R(20)就是所得的点了
    公式如下:(x"  y"  1)  = (x'  y'  1) * R(20)最后所得的(x",y")就是所求的箭头中的其中一个点
    另外一个点可以用(x'  y'  1) * R(-20)得到以上是我的方法,应该可行,具体用程序实现的时候可以把矩阵乘法拆开,用循环实现,比较方便
      

  2.   

    http://www.codeguru.com/gdi/Arrow.html
      

  3.   

    多谢楼上两位老兄了,昨天晚上我又弄了一晚上,根据斜率得出线段的角度后,再用那个角度减20度后得到箭头与Y轴的角度,然后进行坐标计算已经把坐标算出来了.不用所用的计算过程较为繁琐,没有 SeainBlue(爱海) 老兄的旋转那样来得痛快.唉,不是学计算机专业的,这些基础知道不清楚啊,看来一定要补一补了.再请问老兄:如果是水平线时,在一线段的端点我已经画了一个小子图(子图的几十个坐标点,每一个坐标点都是用的相对于线段端点的相对坐标来画的,每个坐标点是已知的).如果我线的方向改变的时候,是不是也只是要做一个旋转变换就行了,该如何个旋转法.对图形旋转这方面概念不太清楚,还望老兄再次指点一二,谢谢!
      

  4.   

    这是图形学的知识,可以参考计算机系开的图形学课程进行学习
    这可是基础啊,没有基础,总是事倍功半用google搜一下图形学的教程,下载好好学一下吧,祝你成功