2017-05-18 1 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両方が

連珠ライン(そのフランス語申し訳ありません)での傾きであるタプルであり、点Iとたいチェックがある場合、POSは、円の中心であります

原産地は、ラインのYの原点である(フランス語も)

teleport_rangeは半径で、私が欲しい定数300

実際のリターンをテストするためにコメントされていますINGの目的

それは円の内側、何もかも大丈夫ですが、それは外であれば、根に負

X =(-B +数学を二乗しようとしているため、エラーが表示場合、私は、それを実行

(2 * A) ValueError:数学的なドメインエラー

2次方程式の平方根は、線の間に衝突点がない場合にのみ負の値になりますしかし、円は、円の中心と点を通るので、2つの衝突点があるはずです。 Iラインは一定であるが、私は修正するときにのみ衝突点が存在することを知って

そのなぜ(B ** 2から4 * 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

関連する問題