如何计算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)为“终点”的直线(可以是直线,也可以是任意角度的对角线),如何得到同一直线上的点“穿过”的百分比。 所有的点实际上都是鼠标坐标 第一次单击设置行的开头,第二次单击设置行的结尾,第三次单击设置我想知道行首和行尾之间的百分比值的点

Not straight lines

Overview of what I mean

到目前为止,我已经通过观看一些 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()```

计算“百分比”的方程式的数学推导是explained in this answer

给定描述直线 P1=(X1,Y1)P2=(X2,Y2) 的两个点,以及位于直线上的第三个点 PF=(XF,YF)您可以计算 t01之间的一个值代表PF在向量P1->P2上的遍历如下:

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

或:

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

您可以使用 XY。如果PF这个点真的在线上,那么他们两个都会给出相同的t.

现在,有一个特殊情况,当直线是垂直或水平的,我们可能最终除以零。因此,最好的方法是使用分母较大的方程。也就是说,如果(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 值。