การค้นหาวัตถุภายในมุมเฉพาะจากวัตถุอื่น

ฉันกำลังเขียนการจำลองใน Python ซึ่งรวมถึงตัวแทนที่สามารถเดินทางในสภาพแวดล้อมได้ และมีเวกเตอร์ความเร็ว v สภาพแวดล้อมยังรวมถึงวัตถุประเภทอื่น (อาหาร) ฉันต้องการให้ตัวแทน "เห็น" เฉพาะอาหารที่อยู่ภายในระยะ r จากตัวแทน และเฉพาะเมื่อมุมระหว่างอาหารกับแกน x บวก ทีต้า อยู่ภายใน "ขอบเขตการมองเห็น" บางส่วนที่กำหนดเป็น +-อัลฟา องศาจากมุมเบตาระหว่างเวกเตอร์ความเร็วกับแกน X บวก

ในภาพประกอบที่ฉันเพิ่มเข้าไป ลูกศรสีน้ำเงินคือเวกเตอร์ความเร็ว ซึ่งสร้างมุมบีตาด้วยแกน x บวก และฉันต้องการให้ตัวแทนเห็นเฉพาะจุดสีแดง เมื่อฉันตรวจสอบว่า beta-alpha‹=theta‹=beta+alpha ฉันไม่ได้รับผลลัพธ์ที่ถูกต้องเมื่อช่วง (beta-alpha , beta+alpha) รวมถึงการเปลี่ยนจากมุมลบเป็นมุมบวกหรือจาก 2pi เป็น 0 และรอง ในทางกลับกัน

รหัส:

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)

ป้อนคำอธิบายรูปภาพที่นี่


person user1767774    schedule 04.05.2014    source แหล่งที่มา
comment
รหัสของคุณอยู่ที่ไหน? คุณได้รับผลลัพธ์อะไรทำ?   -  person jonrsharpe    schedule 04.05.2014
comment
ไม่เข้าใจจุดนี้ : only when the angle between the food and the positive x axis, theta เป็นมุมไหนคะ? อาหารเป็นจุดถูก มุมระหว่างจุดกับเส้นหมายความว่าอย่างไร เส้นตรงสองเส้นใดที่ทำให้เป็นมุมทีต้า?   -  person gaganbm    schedule 04.05.2014
comment
คุณพูดถูก ฉันอธิบายไม่ถูก ฉันหมายถึงมุมระหว่างเวกเตอร์ที่เชื่อมต่อสารและอาหารกับแกน x บวก jonrsharpe: อย่างที่ฉันบอกไป ฉันไม่ได้รับผลลัพธ์ที่แม่นยำเมื่อช่วง (เบต้า-อัลฟา , เบต้า+อัลฟา) รวมถึงการเปลี่ยนจากมุมลบเป็นมุมบวก หรือจาก 2pi เป็น 0   -  person user1767774    schedule 04.05.2014


คำตอบ (2)


ลองแก้ไขเงื่อนไขขอบเขตโดยที่ alpha+beta และ beta-alpha อยู่บนด้านใดด้านหนึ่งของแกน x บวก สมมติว่ามุมทั้งหมดของคุณ beta และ theta อยู่ในช่วง (0, 2*Pi) สิ่งนี้อาจใช้ได้:

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
ขอบคุณ มันดูมีแนวโน้มดี แต่...เบต้าและทีต้าอยู่ในช่วง (0,2pi) หรือไม่? ฉันไม่แน่ใจ แต่เท่าที่ฉันจำได้ atan2 ส่งคืนคำตอบระหว่าง -pi ถึง pi... ฉันคิดว่าฉันควรแมปมันให้อยู่ในช่วง (0,2pi) หรือไม่ - person user1767774; 04.05.2014
comment
ฉันไม่แน่ใจว่า atan2 มีพฤติกรรมอย่างไร แต่ถ้าเป็นมุมบวกเสมอก็ควรอยู่ในช่วง 0 ถึง 2PI อย่างไรก็ตาม ในกรณีที่เป็นค่าลบ ก็สามารถแปลงเป็นช่วง 0 ถึง 2PI ได้ง่ายๆ โดยการเพิ่ม 2PI - person gaganbm; 04.05.2014

ขอบคุณ gaganbm! สำหรับผู้อ่านในอนาคต คำตอบที่ถูกต้องคือ:

  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