【发布时间】:2014-12-13 06:46:45
【问题描述】:
我正在学习 java+android 和这个主题 Draw in Canvas by finger, Android 帮助我很多,让用户画线。但是,在我的应用程序中,我想为每一行添加一个箭头。它尝试使用 Path.lineTo 添加一个三角形,但问题是我无法将它旋转到正确的方向。
寻求帮助
【问题讨论】:
标签: android html5-canvas drawing
我正在学习 java+android 和这个主题 Draw in Canvas by finger, Android 帮助我很多,让用户画线。但是,在我的应用程序中,我想为每一行添加一个箭头。它尝试使用 Path.lineTo 添加一个三角形,但问题是我无法将它旋转到正确的方向。
寻求帮助
【问题讨论】:
标签: android html5-canvas drawing
您将不得不做一些数学运算。假设你的线的最后一个点是 A,最后一个是 B。那么我们必须计算一个方向向量 D 作为 A-B。该向量应该被归一化,即除以它自己的长度,然后拉伸到你想要的箭头线的长度。对 A、B 和 D 使用 Androids PointF 类,它应该看起来像这样:
PointF a = <initialize with last point of your line>
PointF b = <initialize with last but one point of your line>
// difference vector
PointF d = new PointF(a.x-b.x, a.y-b.y);
// normalize
d.set(d.x / d.length(), d.y / d.length());
// stretch to, say, 10 units
d.set(10.0f * d.x, 10.0f * d.y);
现在是旋转部分。我们要旋转 3/4*pi,一次顺时针,一次逆时针。我们可以使用rotation matrix 来做到这一点。对于二维的情况,很简单:
float angle = 0.75f * Math.PI;
PointF dLeft = new PointF(+d.x*Math.cos(-angle)-d.y*Math.sin(-angle),+d.x*Math.sin(-angle)+d.y*Math.cos(-angle));
PointF dRight = new PointF(+d.x*Math.cos(+angle)-d.y*Math.sin(+angle),+d.x*Math.sin(+angle)+d.y*Math.cos(+angle));
注意 dLeft 和 dRight 是方向向量。要计算箭头线的两个端点,您必须将它们添加到 A。因此,在伪(非 java)代码中您可以这样做:
moveTo(A);
lineTo(A+dLeft);
moveTo(A);
lineTo(A+dRight);
希望这会奏效;祝你好运!
【讨论】: