0

だから私はキャンバス上の2つのオブジェクト間の距離を見つける方法を見つけようとしてきましたが、Googleで最も関連性の高いリンクを使い果たしましたがほとんど成功しませんでした。

描かれた楕円とキャンバス上の線の間の距離を計算するようにしようとしています。

from __future__ import division
from Tkinter import *
import tkMessageBox

class MyApp(object):
    def __init__(self):
        self.root = Tk()
        self.root.wm_title("Escape")
        self.canvas = Canvas(self.root, width=800, height=800, bg='white')
        self.canvas.pack()
        self.canvas.create_line(100, 100, 200, 200, fill='black')
        self.canvas.bind("<B1-Motion>", self.tracer)
        self.root.mainloop()

    def tracer(self, e):
        self.canvas.create_oval(e.x-5, e.y-5, e.x+5, e.y+5, fill='blue', outline='blue')
        rx = "%d" % (e.x)
        ry = "%d" % (e.y)
        print rx, ry
MyApp()
4

2 に答える 2

1

2 つの円:

dist = math.sqrt((circle1.x-circle2.x)**2 + (circle1.y-circle2.y)**2) - circle1.r - circle2.r

当然のことながら、ユークリッド距離はピタゴラスの定理を使用して計算されます。

ポイント/セグメント:

 a = segment[1].y - segment[0].y
 b = segment[0].x - segment[1].x
 c = - segment[0].x * a - segment[0].y * b 
 dx = segment[1].x - segment[0].x
 dy = segment[1].y - segment[0].y
 nc0 = - segment[0].x * dx - segment[0].y * dy
 nc1 = - segment[1].x * dx - segment[1].y * dy
 if ((dx * x + dy * y + nc0) < 0) dist = math.sqrt((x-segment[0].x)**2 + (y-segment[0].y)**2)
 elif((dx * x + dy * y + nc1) < 0) dist = math.sqrt((x-segment[1].x)**2 + (y-segment[1].y)**2)
 else dist = (a*x + b*y + c) / math.sqrt(a**2 + b**2)

円/セグメント - ポイント/セグメントと同じですが、円の半径を差し引くだけです

ポリゴン/ポリゴン - ポリゴン 1 の各頂点とポリゴン 2 のセグメントをループし、次にポリゴン 2 の各頂点とポリゴン 1 のセグメントをループして、最小のものを見つけます。

コード内でマジック ナンバーを使用しないでください。その半径 5 は適切ではありません。

于 2012-11-04T21:10:36.340 に答える
0
dist = math.sqrt((oval.x-point.x)**2 + (oval.y-point.y)**2)

これがあなたの質問に答えるかどうかは本当にわかりませんが、これは距離の式です

元の質問にはいくつかの問題があります。

  1. どの時点で距離を見つけようとしていますか?

  2. 楕円形の位置を保存していないので、後で調べるのは非常に困難です

  3. なぜ距離をとろうとしているのですか?/それで何をするつもりですか?

  4. 端までの距離または中心までの距離を見つけようとしていますか?

def trace一般的に、関数で取得したいと思います

ステップ1.興味のあるポイントは(e.x,e.y

ステップ2.線上で最も近い点を見つけます(線=(100,100)から(200,200))(これはおそらくそれ自体が質問です。http://nic-gamedev.blogspot.com/2011/11/using- vector-mathematics-and-bit-of_08.html

ステップ3.距離法を関心のあるポイントとライン上の最も近いポイントに適用します

def dist(pt1,pt2):
    return ((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)**.5

別の注意点として...あなたの楕円は円のようにひどく見えます...

于 2012-11-04T20:04:04.157 に答える