0

所以我一直在试图弄清楚如何在画布上找到两个对象之间的距离,并且我已经用尽了谷歌上最相关的链接,但收效甚微。

我正在尝试使它计算绘制的椭圆与画布上的线条之间的距离。

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

两个圈子:

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-矢量数学和位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 回答