Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 使用直线坡度在直线端点处绘制箭头_Actionscript 3 - Fatal编程技术网

Actionscript 3 使用直线坡度在直线端点处绘制箭头

Actionscript 3 使用直线坡度在直线端点处绘制箭头,actionscript-3,Actionscript 3,我正在开发一个白板应用程序,它允许用户使用箭头画线(有些类似于Microsoft Word line的箭头功能)。我正在使用graphics属性和lineTo()方法绘制一条线。现在我必须在最后一点画一个有角度的箭头。我通过连接最后一个点周围的点来绘制箭头。因为360线可以通过该点,每条线可以有不同的箭头角度。请建议我如何计算最后一个点附近的这些点。如果存储直线的起点和终点,添加箭头应该相对简单。如果从起点坐标减去终点坐标,将得到箭头方向向量(我们称之为D)。使用此向量,可以确定两点之间直线上的

我正在开发一个白板应用程序,它允许用户使用箭头画线(有些类似于Microsoft Word line的箭头功能)。我正在使用graphics属性和lineTo()方法绘制一条线。现在我必须在最后一点画一个有角度的箭头。我通过连接最后一个点周围的点来绘制箭头。因为360线可以通过该点,每条线可以有不同的箭头角度。请建议我如何计算最后一个点附近的这些点。

如果存储直线的起点和终点,添加箭头应该相对简单。如果从起点坐标减去终点坐标,将得到箭头方向向量(我们称之为D)。使用此向量,可以确定两点之间直线上的任何点

因此,要绘制箭头,需要确定线段上与端点有特定距离(d1)的点(P1),确定穿过该点并与D垂直的线。最后获得与先前确定的点有一定距离(d2)的点(P2)。然后,您可以确定相对于D与P2对称的点

因此,您将拥有一个长度为d1的箭头和一个长度为2*d2的底座


这里有一些附加信息和一些代码示例:

我自己也在做一些事情,我需要它看起来比三角形更好,并且使用相对便宜的计算(尽可能少地调用其他函数,如数学三角)。这是:

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)这将给出箭头在直线上的起始点