2016-04-25 7 views
2

内にあるかどうかをチェックし、現在私は、ベクターおよび暴徒が実際の三角形の内側にある場合は、チェックを除き、必要なすべてのツールを持っています。さらに詳しい情報が必要な場合は、付属の写真を見てください。サークルについて心配しないで、私はすでにカバーしています。 A picture briefly explaining what I want the code to do and how I want it to work(Java)のベクトルの問題 - モンスターが3つのベクトル

現在、私のコードは次のようになります。現在のコードでは、彼らは三角形の内部であれば、円は既に覆われている私は、三角形のための3つのベクターを必要とする、と私はチェックが必要

public void cleaveCone(Player damager, LivingEntity victim, int level) { 
    for(Entity lentity : damager.getNearbyEntities(3, 2, 3)) { 
     if(!(lentity instanceof LivingEntity)) continue; 
     LivingEntity entity = (LivingEntity) lentity; 
    } 
} 

、ゾンビはエンティティになり、プレイヤーはダメージを与えます。

+0

私たちはあなたがすでに持っているもののいくつかのコードが必要です。 – RAnders00

+0

メインポストを編集しました。コードは現在表示されています。私はまた、コードの下にいくつかの説明を追加しました。 –

+0

ポイントが三角形(2D)内にあるかどうかをチェックする方法については、[この回答](http://stackoverflow.com/a/2049712/4464702)をご覧ください。 – RAnders00

答えて

2

あなたには、いくつかの三角法とプレイヤーのyawを使用することができ、三角形の3点の座標や頂点を取得します。あなたのイメージによると、三角形の頂点の1つは、プレーヤーのLocationです。プレイヤーから突出する三角形の2辺が、全体の三角形を定義している時間を定義し、その時点での三角形とlength、内部angle。これらの2つの値が定義されると、三角形の残りの2つの頂点の座標を見つけることができます。

enter image description here

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の三角形の行を可視化するために、いくつかの粒子を使用する:

enter image description here

あなたがいるかどうか確認するために使用できる一つの方法ポイントは二次元三角形の内側にあり、これは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の座標、v2v3を持っていたら

あるいは、あなたはもちろん、言及JoopのようにJavaFXのPolygonを作成するためにそれらを使用してエンティティが内部にあるかどうかを確認するために、そのcontainsメソッドを使用することができます重心座標法を使用する代わりに三角形を使用します。

+0

これは私が必要としていたものです。ありがとうございました。いいぞ –

0

Polygonを作成し、それを確認してください。 訂正:JavaFXのPolygonを使用 - ダブルポイントのために。

より低いレベル:三角形のために3つのベクトルa -> b -> c -> aを有し、点ベクトルを有する製品中の全ての正又はようなものであることを確認してください。

+0

私はbとcのベクトルを作ろうとしていましたが、私は式を理解できないので成功しませんでした。 –

+0

ポリゴンとその含有物を試してください。それは、x、yの点で動作します。 –

+0

Minecraftは場所を示すために 'double'値を使用しています。三角形はいくつかのブロックにしか渡らないので、私は三角座標を正確にする必要があります。 –

関連する問題