Actionscript 3 使用直线坡度在直线端点处绘制箭头
我正在开发一个白板应用程序,它允许用户使用箭头画线(有些类似于Microsoft Word line的箭头功能)。我正在使用graphics属性和lineTo()方法绘制一条线。现在我必须在最后一点画一个有角度的箭头。我通过连接最后一个点周围的点来绘制箭头。因为360线可以通过该点,每条线可以有不同的箭头角度。请建议我如何计算最后一个点附近的这些点。如果存储直线的起点和终点,添加箭头应该相对简单。如果从起点坐标减去终点坐标,将得到箭头方向向量(我们称之为D)。使用此向量,可以确定两点之间直线上的任何点 因此,要绘制箭头,需要确定线段上与端点有特定距离(d1)的点(P1),确定穿过该点并与D垂直的线。最后获得与先前确定的点有一定距离(d2)的点(P2)。然后,您可以确定相对于D与P2对称的点 因此,您将拥有一个长度为d1的箭头和一个长度为2*d2的底座Actionscript 3 使用直线坡度在直线端点处绘制箭头,actionscript-3,Actionscript 3,我正在开发一个白板应用程序,它允许用户使用箭头画线(有些类似于Microsoft Word line的箭头功能)。我正在使用graphics属性和lineTo()方法绘制一条线。现在我必须在最后一点画一个有角度的箭头。我通过连接最后一个点周围的点来绘制箭头。因为360线可以通过该点,每条线可以有不同的箭头角度。请建议我如何计算最后一个点附近的这些点。如果存储直线的起点和终点,添加箭头应该相对简单。如果从起点坐标减去终点坐标,将得到箭头方向向量(我们称之为D)。使用此向量,可以确定两点之间直线上的
这里有一些附加信息和一些代码示例:我自己也在做一些事情,我需要它看起来比三角形更好,并且使用相对便宜的计算(尽可能少地调用其他函数,如数学三角)。这是:
public static function DrawArrow(ax:int, ay:int, bx:int, by:int):void
{
// a is beginning, b is the arrow tip.
var abx:int, aby:int, ab:int, cx:Number, cy:Number, dx:Number, dy:Number, ex:Number, ey:Number, fx:Number, fy:Number;
var size:Number = 8, ratio:Number = 2, fullness1:Number = 2, fullness2:Number = 3; // these can be adjusted as needed
abx = bx - ax;
aby = by - ay;
ab = Math.sqrt(abx * abx + aby * aby);
cx = bx - size * abx / ab;
cy = by - size * aby / ab;
dx = cx + (by - cy) / ratio;
dy = cy + (cx - bx) / ratio;
ex = cx - (by - cy) / ratio;
ey = cy - (cx - bx) / ratio;
fx = (fullness1 * cx + bx) / fullness2;
fy = (fullness1 * cy + by) / fullness2;
// draw lines and apply fill: a -> b -> d -> f -> e -> b
// replace "sprite" with the name of your sprite
sprite.graphics.clear();
sprite.graphics.beginFill(0xffffff);
sprite.graphics.lineStyle(1, 0xffffff);
sprite.graphics.moveTo(ax, ay);
sprite.graphics.lineTo(bx, by);
sprite.graphics.lineTo(dx, dy);
sprite.graphics.lineTo(fx, fy);
sprite.graphics.lineTo(ex, ey);
sprite.graphics.lineTo(bx, by);
sprite.graphics.endFill();
}
您还可以将线条颜色和厚度添加到参数列表中,或者将其作为扩展Sprite的成员函数,并且您有一个非常好的、多功能的函数:)您还可以对数字进行一些处理,以获得不同的形状和大小(丰满度的微小变化会导致外观的疯狂变化,请小心:))。注意不要将比率或fullness2设置为零 就像罗米说的,但有代码。获取箭头的方向
var dir:Point=new Point(end.x-start.x,end.y-start.y)代码>右法线:var normalR:Point=新点(-dir.y,dir.x)代码>左法线:var normalL:Point=新点(dir.y,-dir.x)
您可以使用normalise(1.0)
命令将它们全部标准化,这样您就可以创建所需的长度(例如normalR.x*10.0
等)。标准化方向可用于获取箭头。e、 g.如果您希望箭头的高度为10.0px,则其新点(end.x-dirN.x*10.0,end.y-dirN.y*10.0)代码>这将给出箭头在直线上的起始点