簡體   English   中英

如何計算x,y坐標的點相對於直線的比例百分比(也有x1,y1,x2,y2)

[英]How to calculate the proportional percentage of a point of an x,y coordinate with respect to a line (also with x1, y1, x2, y2)

我需要知道我的點(藍點)所在的線軌跡(紅線)的百分比。 抽象地想一想一條街道,無論它有多長,起點總是 0%,終點總是這條街的 100%。 如果我碰巧在這條街的任何地方停下來,我走了這條街的多少百分比。

那么以(X1,Y1)為“起點”,(X2和Y2)為“終點”的線(可以是直線,也可以是任意角度的對角線),如何得到“遍歷”的百分比同一直線上的點。 所有的點實際上都是鼠標坐標第一次點擊設置線的開始,第二次點擊設置線的結束第三次點擊設置我想知道開始和結束之間的百分比值的點隊伍的盡頭

不是直線

我的意思概述

到目前為止,我已經通過觀看一些 Python 視頻來做到這一點

from tkinter import *
clique = 0
X1=0
Y1=0
X2=0
Y2=0
XF=0
YF=0
ready = False   
def getCoord(event):
    global clique
    global X1
    global Y1
    global X2
    global Y2
    global XF
    global YF

    if clique == 0:
        myLabel['text'] = f'Starting point: x = {event.x} y= {event.y}'
        clique=1
        X1 = event.x
        Y1 = event.y
        return
    if clique == 1:
        myLabel2['text'] = f'Ending point: x = {event.x} y= {event.y}'
        clique=2
        X2 = event.x
        Y2 = event.y
        drawLine()
        return
    else:
        myLabel3['text'] = f'Dot point: x = {event.x} y= {event.y}'
        XF=event.x
        YF=event.y
        drawDot()
        clique = 0
        print(str(calculate()))
        return

def drawDot():
    myCanvas.create_rectangle(XF, YF, XF, YF, fill='blue', width=4, outline='blue')
def drawLine():
    myCanvas.create_line(X1,Y1,X2,Y2, fill='red', width=5)
        
def calculate():
  
    return "I have 0 ideas"

myWindow = Tk()
myCanvas = Canvas(myWindow, width=1270,height=720,background='black')
myLabel = Label(bd=2, relief='solid', font='Times 22 bold', bg='white', fg='blue')
myLabel2 = Label(bd=2, relief='solid', font='Times 22 bold', bg='white', fg='blue')
myLabel3 = Label(bd=2, relief='solid', font='Times 22 bold', bg='white', fg='blue')
myCanvas.bind('<Button-1>', getCoord)
myCanvas.grid(row=0,column=0)
myLabel.grid(row=1, column=0)
myLabel2.grid(row=2, column=0)
myLabel3.grid(row=3, column=0)
myWindow.mainloop()```

此答案中解釋了找到“百分比”的方程式的數學推導。

給定描述直線P1=(X1,Y1)P2=(X2,Y2)的兩個點,以及位於直線上的第三個點PF=(XF,YF)您可以計算t ,一個介於01表示PF在向量P1->P2上的遍歷如下:

def calculate():
    t = (XF - X1) / (X2 - X1)

或者:

def calculate():
    t = (YF - Y1) / (Y2 - Y1)

您可以使用XY 如果點PF實際上在線上,則它們都將給出相同的t

現在,有一種特殊情況,當線是 vertical 或 horizontal 時,我們最終可能會除以零。 因此,最好的方法是使用分母較大的方程。 也就是說,如果(X2-X1)大於(Y2-Y1) ,我們將使用第一個方程除以更大的數。

因此,最終代碼將如下所示:

def calculate():
    dx = X2-X1
    dy = Y2-Y1
    if dx>dy:
        t = (XF - X1) / dx
    else:
        t = (YF - Y1) / dy

這將適用於所有情況。 您可以將t乘以100以獲得百分比(介於0%100%之間)

現在,如果點PF在線外,則兩個方程(使用XY )可能會產生不同的t值。 此外,如果該點位於“延長”線上,您可能會得到小於零或大於一的t值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM