2012-11-04 4 views
0

캔버스에 두 개체 사이의 거리를 찾는 방법을 알아 내려고 노력했지만 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() 

답변

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의 세그먼트를 반복 한 다음 가장 작은 것을 찾습니다.

코드 안에 마법 번호를 사용하지 마십시오. 그 반경은 좋지 않습니다.

+0

가장 큰 문제는 코딩에 익숙하지 않고 이와 같은 복잡한 코드를 이해하는 데 어려움이 있습니다. 인터넷상의 대부분의 자원은 이해하기에 코딩하기에 너무 복잡합니다. 나는 그것에 대해 어떻게 가야하는지에 대한 간단한 철저한 설명을 찾고있다. – Clockwork

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 단계는 (라인에 가장 가까운 지점을 찾기 라인 = 라인

에 대한이자의 지점과 가장 가까운 지점까지 거리 방법을 적용 (200200)) (이것은 아마도 그 자체의 문제이다. http://nic-gamedev.blogspot.com/2011/11/using-vector-mathematics-and-bit-of_08.html)

3 단계에 (100100) 691,363,210 또 다른 측면 노트에

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

... 당신의 타원은 원처럼 엄청 많이보고 ...

+2

OP의 참조로 위키 백과에서 [피타고라스 정리] (https://en.wikipedia.org/wiki/Pythagorean_theorem)라고 부르는 경우가 있습니다. – Lethargy

+0

흠, 나는 그렇지 않습니다. 그 코드를 잘 이해하고 있습니다. 코딩에 익숙하지 않고 꽤 나쁜 것입니다. 그게 어디서 왔는지 설명해 주시겠습니까? – Clockwork

+0

수학에서 나옵니다. '**'는 지수입니다. 'math.sqrt'는 ** sq ** uare ** r ** oo ** t **를 사용하고 있습니다. –