2

编辑我有一个重新考虑:我将使用一个更容易实现带有网格的树结构,这样每个块最多可以有 4 个邻居。

几个街区,一个蓝色的老鼠

阻止'内部'茎

我正在尝试将块连接到这朵花的茎(一系列块)上。绿色块是现有的茎,蓝色块是附着在鼠标上的。

附着在鼠标上的方块将正确地捕捉到最近的边缘(我现在允许对角线),但是通过捕捉到上方或下方的方块,方块也能够进入茎杆的“内部”(图 2)。

我的问题是,我怎样才能阻止这种情况?我考虑过

  • 再次迭代列表,但忽略我刚刚尝试附加的块;我认为通过附加到茎“内部”的另一个块,这只会导致同样的问题。
  • 找到我正在相交的块并从中获取另一个连接点,重复直到没有交叉点;这似乎是更好的选择,但在一次相交超过 1 个块时可能会非常混乱

我应该注意,我计划有一个更平滑的捕捉,而不仅仅是任意边缘,所以网格几乎是不可能的。我非常有信心必须有一个优雅的解决方案,我只是没有看到它!

这是我目前的快照代码

var mousePos:Point = new Point(mouseX, mouseY);// new Point(e.stageX, e.stageY);
var nearestPoint:Point = null;
var nearestDistance:Number = 0;

for (var i:int = 0; i < mPlant.length; ++i) {
    var part:PlantPart = mPlant[i];

    if (part is Stalk) {
        var connectionPoint:Point = (part as Stalk).getNearestConnectionPoint(mousePos);            
        var distance:Number = Point.distance(mousePos, connectionPoint);

        if (nearestPoint == null || distance < nearestDistance) {
            nearestPoint = connectionPoint;
            nearestDistance = distance;
        }
    }
}

if (nearestPoint != null) {
    mMousePointer.x = nearestPoint.x;
    mMousePointer.y = nearestPoint.y;
}
4

1 回答 1

0

您始终可以预先计算茎的边界矩形,然后对该矩形进行捕捉检查。

可以使用类似这样的方法来计算 Rectangle(不过,未经测试的代码)

var _bounding:Rectangle = new Rectangle(int.MAX_VALUE, int.MAX_VALUE,0,0);
for each( var part:PlantPart in mPlant)
{
    if(part is Stalk)
    {
        _bounding.width    = part.width;    // Width will always be the same
        _bounding.height   = Math.max( _bounding.height, part.y );
        _bounding.x        = Math.min( _bounding.x, part.x );
        _bounding.y        = Math.min( _bounding.y, part.y );
    }
}
于 2013-05-18T16:11:24.060 回答