2017-05-18 4 views
0

포인트가 특정 원 밖에 있으면 점의 중심이 원의 중심을 통과하고 점이 충돌하는 지점으로 이동하려고합니다. 코드 :이 방정식에서 내가 뭘 잘못하고 있니?

def inside_circle(self, pos): 
    if ((pos[0]-self.pos[0])**2 + (pos[1]-self.pos[1])**2) <= teleport_range**2: 
     return "inside"#pos 
    else: 
     pente = (pos[1]-self.pos[1])/(pos[0]-self.pos[0]) 
     origine = pos[1]-pente*pos[0] 
     A = pente**2 + 1 
     B = 2 * -self.pos[0] + (origine+self.pos[1])*pente*2 
     C = self.pos[0]**2 + (origine+self.pos[1])**2 - teleport_range**2 
     if pos[0] > self.pos[0]: 
      X = (-B + math.sqrt(B**2 - 4*A*C))/(2*A) 
      Y = pente * X + origine 
      return "outside bot"#(X,Y) 
     elif pos[0] < self.pos[0]: 
      X = (-B - math.sqrt(B**2 - 4*A*C))/(2*A) 
      Y = pente * X + origine 
      return "outside top"#(X,Y) 

self.pos은 원의 중심은, POS는 점 I 싶어 검사이고, 모두가 (그 프랑스어 미안에)

pente이 라인의 경사입니다 튜플에게 있습니다입니다

origine 시험용 주석

teleport_range 내가 원하는 일정 300

실제 반환되는 반경이다 (프랑스어) 라인의 Y의 원점 보내고 목적

는 원 내부 everythings 괜찮지 만 외부 경우가 루트에게 부정적인

X = (-B + 수학을 정사각형하려고하기 때문에 오류가 표시 만약 내가 그것을 실행

.sqrt (B ** 2 - 4 * A * C))/(2 * A) ValueError : 수학 영역 오류

2 차 방정식의 제곱근은 라인 사이에 충돌 지점이 없을 때만 음수입니다. 원은 원의 중심과 한 점을 지나치므로 두 개의 충돌 점이 있어야합니다. 나는 라인이 일정하지만 난 해결됩니다 경우에만 충돌 한 지점이있을 수있어

이 나는 ​​이유 (B ** 2-4 * A * C는) 이해할 때 야해 때 음수

I을 누군가가 나를 도와 줘요 수 있다면, 또한 코드가 명확

감사합니다 :) 여기

+1

"해야 할 때"- 가정을 확인하십시오. – duffymo

+1

저는 아무도 끔찍하게 이름 붙여진 변수들을 풀어서 시간을 보내고 싶어하지 않을 것이라고 생각합니다. – Alexander

+0

예 죄송합니다. 내 변수를 잊어 버렸습니다. 프랑스어로 :/ – Tissuebox

답변

1

얻기 쉽고, 짧고, 명확 방법입니다 잃어버린없이 간단하게 할 수 있는지 말해 주저하지 말아, 수학에 좋지입니다 원 위에 원하는 지점.

theta = math.atan2(pos[0] - self.pos[0], pos[1] - self.pos[1]) 
X = self.pos[0] + teleport_range * math.cos(theta) 
Y = self.pos[1] + teleport_range * math.sin(theta) 

이 코드는 먼저 원의 중심에서 점까지의 레이의 경사각을 찾습니다. 그런 다음이 각도를 사용하여 동일한 각도의 원 위에 점을 찾습니다.

이 코드는 원 안에있는 점에 대해서도 작동합니다. 중심에서 동일한 각도의 원 위에 점을 찾습니다. 점이 원의 중심 인 경우 원하는 점이 모호하지만 코드에서 하나의 특정 점을 반환합니다.

+0

고마워요! 사실 Pygame Vector2의 inbuilt 함수를 사용하여 문제를 푸는 비슷한 방법으로 작업하고있었습니다. 이전의 방식은 분명히 너무 복잡했기 때문에 이차 방정식이 필요하지 않았습니다. 다시 한 번 감사드립니다. :) – Tissuebox

관련 문제