Çözüm Java Bir nesnenin tamamen diğer nesne içerisinde olduğunu tespit etme

Bu konu bir çözümü açıklamaktadır. Herhangi bir çözüm açıklanmadığını düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
5 Mart 2014
Mesajlar
5.701
Makaleler
12
Çözümler
44
Java:
    public Boolean IsCompletelyInside(Claim OtherClaim) {
        return this.Pos1.PosX >= OtherClaim.Pos1.PosX &&
               this.Pos2.PosX <= OtherClaim.Pos2.PosX &&
               this.Pos1.PosY >= OtherClaim.Pos1.PosY &&
               this.Pos2.PosY <= OtherClaim.Pos2.PosY &&
               this.Pos1.PosZ >= OtherClaim.Pos1.PosZ &&
               this.Pos2.PosZ <= OtherClaim.Pos2.PosZ;
    }

Bu kod bir nesnenin diğer nesne ile çakışıp çakışmadığını belirtiyor. 2 boyutlu ortamda güzel çalışıyor ama işin içine 3. boyut girince karmaşıklaşıyor.

Ben bu kodu şöyle güncellemek istiyorum. X, Y ve Z dahil bir nesne oluşturulduğunda diğer nesne ile karşılaştırma yapılacak. Eğer yeni nesne, karşılaştırma yapılan nesnenin tamamen içinde yer alıyorsa true döndürecek. Denedim fakat düzgün çalışmıyor. Nerede hata yapıyor olabilirim?

Problemi bu kodla çözdüm. Bu sayede 3 boyutlu ortamda bir nesnenin bir nesne içerisinde olduğunu anlayabiliyoruz. Eğer true döndürürse nesne, diğer nesnenin içinde demek.
Java:
public Boolean IsCompletelyInside(Claim OtherClaim)
{
    int xMin = Math.min(OtherClaim.Pos1.PosX, OtherClaim.Pos2.PosX);
    int xMax = Math.max(OtherClaim.Pos1.PosX, OtherClaim.Pos2.PosX);
    int yMin = Math.min(OtherClaim.Pos1.PosY, OtherClaim.Pos2.PosY);
    int yMax = Math.max(OtherClaim.Pos1.PosY, OtherClaim.Pos2.PosY);
    int zMin = Math.min(OtherClaim.Pos1.PosZ, OtherClaim.Pos2.PosZ);
    int zMax = Math.max(OtherClaim.Pos1.PosZ, OtherClaim.Pos2.PosZ);
    return xMax >= this.Pos1.PosX
        && this.Pos1.PosX >= xMin
        && yMax >= this.Pos1.PosY
        && this.Pos1.PosY >= yMin
        && zMax >= this.Pos1.PosZ
        && this.Pos1.PosZ >= zMin
        && xMax >= this.Pos2.PosX
        && this.Pos2.PosX >= xMin
        && yMax >= this.Pos2.PosY
        && this.Pos2.PosY >= yMin
        && zMax >= this.Pos2.PosZ
        && this.Pos2.PosZ >= zMin;
}
 
Son düzenleme:
Java:
    public Boolean IsCompletelyInside(Claim OtherClaim) {
        return this.Pos1.PosX >= OtherClaim.Pos1.PosX &&
               this.Pos2.PosX <= OtherClaim.Pos2.PosX &&
               this.Pos1.PosY >= OtherClaim.Pos1.PosY &&
               this.Pos2.PosY <= OtherClaim.Pos2.PosY &&
               this.Pos1.PosZ >= OtherClaim.Pos1.PosZ &&
               this.Pos2.PosZ <= OtherClaim.Pos2.PosZ;
    }

Bu kod bir nesnenin diğer nesne ile çakışıp çakışmadığını belirtiyor. 2 boyutlu ortamda güzel çalışıyor ama işin içine 3. boyut girince karmaşıklaşıyor.

Ben bu kodu şöyle güncellemek istiyorum. X, Y ve Z dahil bir nesne oluşturulduğunda diğer nesne ile karşılaştırma yapılacak. Eğer yeni nesne, karşılaştırma yapılan nesnenin tamamen içinde yer alıyorsa true döndürecek. Denedim fakat düzgün çalışmıyor. Nerede hata yapıyor olabilirim?

Problemi bu kodla çözdüm. Bu sayede 3 boyutlu ortamda bir nesnenin bir nesne içerisinde olduğunu anlayabiliyoruz. Eğer true döndürürse nesne, diğer nesnenin içinde demek.
Java:
public Boolean IsCompletelyInside(Claim OtherClaim)
{
    int xMin = Math.min(OtherClaim.Pos1.PosX, OtherClaim.Pos2.PosX);
    int xMax = Math.max(OtherClaim.Pos1.PosX, OtherClaim.Pos2.PosX);
    int yMin = Math.min(OtherClaim.Pos1.PosY, OtherClaim.Pos2.PosY);
    int yMax = Math.max(OtherClaim.Pos1.PosY, OtherClaim.Pos2.PosY);
    int zMin = Math.min(OtherClaim.Pos1.PosZ, OtherClaim.Pos2.PosZ);
    int zMax = Math.max(OtherClaim.Pos1.PosZ, OtherClaim.Pos2.PosZ);
    return xMax >= this.Pos1.PosX
        && this.Pos1.PosX >= xMin
        && yMax >= this.Pos1.PosY
        && this.Pos1.PosY >= yMin
        && zMax >= this.Pos1.PosZ
        && this.Pos1.PosZ >= zMin
        && xMax >= this.Pos2.PosX
        && this.Pos2.PosX >= xMin
        && yMax >= this.Pos2.PosY
        && this.Pos2.PosY >= yMin
        && zMax >= this.Pos2.PosZ
        && this.Pos2.PosZ >= zMin;
}
Bu kullandığın şeyin isminin AABB olması lazım, genelde dikdörtgenler için kullanılır ama cidden biraz daha ileri bir şey istiyorsan biraz lineer cebirle daha ileri düzey şeyler yapabilirsin ayrıca nasıl çalıştığını anlaması bazı yerlerinde biraz nokta çarpımı ve 3 boyutlu versiyonunda çapraz çarpımın ne olduğunu gibi bir iki temel lineer cebir bilgisi gerektiriyor ama GJK'ye bakabilirsin textbook bir collision detection algoritması.
 

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı