編集 再考しました:各ブロックが最大 4 つの隣接ブロックを持つことができるように、グリッドを使用してツリー構造を実装するのがはるかに簡単になるようにします。
この花の茎(一連のブロック)にブロックを取り付けようとしています。緑色のブロックは既存の茎で、青色のブロックはマウスに取り付けられたものです。
マウスに取り付けられたブロックは、最も近いエッジに正しくスナップします (今のところ、対角線を許可しています)。ただし、ブロックは、上または下のブロックにスナップすることで、ストーク (画像 2) の「内側」に移動することもできます。
私の質問は、どうすればこれを止めることができますか? 私は考慮した
- リストをもう一度繰り返しますが、アタッチしようとしたブロックは無視します。これは、茎の「内側」にある別のブロックに接続することによって、実際には同じ問題を引き起こすだけだと思います。
- 交差しているブロックを見つけて、そこから別の接続ポイントを取得し、交差がなくなるまで繰り返します。これはより良いオプションのようですが、一度に複数のブロックを交差させると非常に面倒になる可能性があります
任意に端にスナップするだけでなく、よりスムーズなスナップを計画していることに注意してください。そのため、グリッドはほとんど問題になりません。私はエレガントな解決策があるに違いないと確信していますが、私はそれを見ていません!
現在のスナップコードは次のとおりです
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;
}