あなたには、いくつかの三角法とプレイヤーのyaw
を使用することができ、三角形の3点の座標や頂点を取得します。あなたのイメージによると、三角形の頂点の1つは、プレーヤーのLocation
です。プレイヤーから突出する三角形の2辺が、全体の三角形を定義している時間を定義し、その時点での三角形とlength
、内部angle
。これらの2つの値が定義されると、三角形の残りの2つの頂点の座標を見つけることができます。
2つの頂点のLocation
S取得する方法の例:
double angle = 90; // An example angle of 90 degrees
double length = 5; // An example length of 5
Location v1 = player.getLocation(); // The first vertex of the triangle, the player's location
double yaw = v1.getYaw(); // The player's yaw (in degrees) between 0º and 360º
World world = player.getWorld(); // The player's world
Location v2 = new Location(world, (-Math.sin(Math.toRadians(yaw - (angle/2))) * distance) + v1.getX(), 0, (Math.cos(Math.toRadians(yaw - (angle/2))) * distance) + v1.getZ()); // The second vertex
Location v3 = new Location(world, (-Math.sin(Math.toRadians(yaw + (angle/2))) * distance) + v1.getX(), 0, (Math.cos(Math.toRadians(yaw + (angle/2))) * distance) + v1.getZ()); // The third vertex
ラジアン単位の角度の負の正弦座標Xに使用され、ここでラフスケッチでありますラジアン単位の角度のコサインがZ座標に使用されます。
私はこの1つは5の長さと90度の角度を有し、Minecraftの三角形の行を可視化するために、いくつかの粒子を使用する:
あなたがいるかどうか確認するために使用できる一つの方法ポイントは二次元三角形の内側にあり、これはquestionの答えとして掲示され、重心座標を使用します。 Bukkit/Spigotに適応したメソッドの例を次に示します。
// v1, v2 and v3 are the vertices of the triangle, in no specific order
// The Y coordinates are ignored (two dimensional)
public static boolean isLocationInTriangle(Location location, Location v1, Location v2, Location v3) {
// Bunch of math...
double a = 0.5 * (-v2.getZ() * v3.getX() + v1.getZ() * (-v2.getX() + v3.getX()) + v1.getX() * (v2.getZ() - v3.getZ()) + v2.getX() * v3.getZ());
int sign = a < 0 ? -1 : 1;
double s = (v1.getZ() * v3.getX() - v1.getX() * v3.getZ() + (v3.getZ() - v1.getZ()) * location.getX() + (v1.getX() - v3.getX()) * location.getZ()) * sign;
double t = (v1.getX() * v2.getZ() - v1.getZ() * v2.getX() + (v1.getZ() - v2.getZ()) * location.getX() + (v2.getX() - v1.getX()) * location.getZ()) * sign;
return s > 0 && t > 0 && (s + t) < 2 * a * sign;
}
私はこれを使っていくつかのテストを行い、それはかなりうまくいくようです。
あなたはとてもようにあなたの方法でこれを使用することもできますIsLocationInTriangle
方法は、(それが2次元のチェックだから)Y座標または高さは無視されていても
List<Entity> nearbyEntities = player.getNearbyEntities(8, 2, 8); // Get entities within 16x4x16 box centered around player
for (Entity entity : nearbyEntities) { // For each Entity found
if (entity instanceof LivingEntity) { // If the Entity is an instance of a LivingEntity
LivingEntity living = (LivingEntity) entity; // Cast
if (isLocationInTriangle(living.getLocation(), player.getLocation(), v2, v3)) { // If the LivingEntity is inside the triangle
living.damage(6); // Damage the entity (just as an example)
}
}
}
注意を、getNearbyEntities
方法は、内部エンティティを探しますこの例では、ボックスは4ブロックの高さを持ち、中心はプレーヤーの位置にあります。したがって、プレイヤーの上または下の2ブロックを超えるエンティティはチェックされません。あなたは3点の三角形v1
の座標、v2
とv3
を持っていたら
あるいは、あなたはもちろん、言及JoopのようにJavaFXのPolygon
を作成するためにそれらを使用してエンティティが内部にあるかどうかを確認するために、そのcontains
メソッドを使用することができます重心座標法を使用する代わりに三角形を使用します。
私たちはあなたがすでに持っているもののいくつかのコードが必要です。 – RAnders00
メインポストを編集しました。コードは現在表示されています。私はまた、コードの下にいくつかの説明を追加しました。 –
ポイントが三角形(2D)内にあるかどうかをチェックする方法については、[この回答](http://stackoverflow.com/a/2049712/4464702)をご覧ください。 – RAnders00