在程序中,根据已知的任意两点(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都是比线段的端点大了,不知该如何写?
非常感谢!
zx1 = x2-20*cos(20);
zy1 = y2-20*sin(20);
zx2 = x2-20*cos(20);
zy2 = y2+20*sin(20);
然后将这两点点与线段的第二个端点连成两条线就成了箭头了.
但如果那线段不是水平线时,我的箭头的两个坐标点就不知怎么根据斜率来变换了,算了几天,头都算晕了,总是不对,还望各位帮忙看看.
还有,我上面的算法中,让箭头两点的Y一个是加上那个偏量,一个是减去偏量,实际这只是在水平时是这样,如果线很直的时候,两个Y都是比线段的端点大了,不知该如何写?
非常感谢!
解决方案 »
- 这路径是什么问题?
- 请教几个基础问题
- 如何关闭调用dll的应用程序
- 请问各位高手 CBN_SELCHANGE是什么类型的消息,这种消息的响应函数用来做什么
- 请问使用ADO方法取记录集值时,不用字段名取,而用指定的第几列来取,如何实现?谢谢!!
- 我知道continue语句的功用,但我还想知道这句话怎么翻译。
- xml文件导入到数据库
- 绝对有难度,CControlBar ,CToolBarCtrl?????
- 使用 CFile类创建一个对象,然后 open(sFilename,CFile::modeRead)),打开的是一硬盘上的文件----是对硬盘读写操作还是对内存文件操作?
- 急!自定义消息...
- 如何用TC++在Win32 SDK的基础上编译程序 ?
- vc与SQLserver2000?
我的方法是这样的
第一步:计算出直线上和(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)得到以上是我的方法,应该可行,具体用程序实现的时候可以把矩阵乘法拆开,用循环实现,比较方便
这可是基础啊,没有基础,总是事倍功半用google搜一下图形学的教程,下载好好学一下吧,祝你成功