Menemukan objek dalam sudut tertentu dari objek lain

Saya sedang menulis simulasi dengan Python, yang mencakup agen yang dapat melakukan perjalanan di lingkungan, dan memiliki vektor kecepatan v. lingkungan juga mencakup jenis objek lain (makanan). Saya ingin agen "melihat" hanya makanan yang berada dalam jarak r dari agen, dan hanya ketika sudut antara makanan dan sumbu x positif, theta, berada dalam "bidang pandang" tertentu yang didefinisikan sebagai +-alpha derajat dari sudut beta antara vektor kecepatan dan sumbu X positif.

Dalam ilustrasi yang saya tambahkan di sini, panah biru adalah vektor kecepatan, membentuk sudut beta dengan sumbu x positif, dan saya ingin agen hanya melihat titik merah. ketika saya hanya memeriksa apakah beta-alpha‹=theta‹=beta+alpha Saya tidak mendapatkan hasil yang benar ketika rentang (beta-alpha , beta+alpha) mencakup transisi dari sudut negatif ke positif atau dari 2pi ke 0 dan sebaliknya sebaliknya.

Kode:

dx = food.x - agent.x
dy = food.y - agent.y
theta = atan2(dy,dx)
alpha = pi/6.
Vx,Vy = agent.velocity[0], agent.velocity[1]
beta = atan2(Vy,Vx)
if (beta-alpha<=theta and theta<=beta+alpha):
    food.color = (255,0,0)
else:
    food.color = (0,0,0)

masukkan deskripsi gambar di sini


person user1767774    schedule 04.05.2014    source sumber
comment
Dimana kodemu? Hasil apa yang apa Anda dapatkan?   -  person jonrsharpe    schedule 04.05.2014
comment
Tidak mengerti poin ini : only when the angle between the food and the positive x axis, theta. Sudut apa itu? Makanan itu sebuah titik kan, apa yang dimaksud dengan sudut antara titik dan garis? Dua garis manakah yang membentuk sudut theta?   -  person gaganbm    schedule 04.05.2014
comment
Anda benar, saya tidak menjelaskannya dengan benar. Maksud saya sudut antara vektor yang menghubungkan agen dan makanan ke sumbu x positif. jonrsharpe: Seperti yang saya sebutkan, saya tidak mendapatkan hasil yang akurat ketika rentang (beta-alpha, beta+alpha) mencakup transisi dari sudut negatif ke positif atau dari 2pi ke 0   -  person user1767774    schedule 04.05.2014


Jawaban (2)


Coba perbaiki kondisi batas di mana alpha+beta dan beta-alpha terletak di kedua sisi sumbu x positif. Dengan asumsi semua sudut Anda, beta dan theta terletak pada kisaran (0, 2*Pi), ini mungkin berhasil:

def checkMargingForTheta(alpha, beta, theta):
    low = beta - alpha
    high = beta + alpha

    if(high > 2*pi):
        high = high - 2*pi
    if(low < 0):
        low = 2*pi + low
    if(low > high):
        return (theta > low)
    else:
        return (low < theta and high > theta)
person gaganbm    schedule 04.05.2014
comment
Terima kasih, kelihatannya menjanjikan, tapi...apakah beta dan theta berada di kisaran (0,2pi)? Saya tidak yakin tetapi sejauh yang saya ingat atan2 mengembalikan jawaban antara -pi ke pi...Saya berasumsi saya harus memetakannya ke kisaran (0,2pi)? - person user1767774; 04.05.2014
comment
Saya tidak yakin bagaimana atan2 berperilaku. Namun jika sudutnya selalu positif, maka harus berada pada kisaran 0 hingga 2PI. Bagaimanapun, jika negatif, dapat dikonversi ke rentang 0 hingga 2PI hanya dengan menambahkan 2PI. - person gaganbm; 04.05.2014

Terima kasih, gaganbm! untuk pembaca selanjutnya, jawaban akuratnya adalah:

  def Atan2(y,x): #changing atan2() range to (0,2pi)
   a = atan2(y,x)
   if (a<0):
    a+=2*PI
   return a

  def checkMargingForTheta(alpha, beta, theta):
    low = beta - alpha
    high = beta + alpha

    if(high > 2*pi):
        high = high - 2*pi
    if(low < 0):
        low = 2*pi + low
    if(low > high):
        if (theta > high):
          return (theta>low)  
        else:
          return (True)
    else:
        return (low < theta and high > theta)
person user1767774    schedule 05.05.2014