如何计算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)
,您可以计算 t
,0
和1
之间的一个值代表PF
在向量P1->P2
上的遍历如下:
def calculate():
t = (XF - X1) / (X2 - X1)
或:
def calculate():
t = (YF - Y1) / (Y2 - Y1)
您可以使用 X
或 Y
。如果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
在线外,两个方程(使用 X
或 Y
)可能会产生不同的 t
值。此外,如果该点位于“扩展”线上,您可能会得到小于零或大于一的 t
值。
我需要知道我的点(蓝点)所在的直线轨迹(红线)的百分比。 抽象地说,试着想象一条街道,不管它有多长,这条街的起点总是 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)
,您可以计算 t
,0
和1
之间的一个值代表PF
在向量P1->P2
上的遍历如下:
def calculate():
t = (XF - X1) / (X2 - X1)
或:
def calculate():
t = (YF - Y1) / (Y2 - Y1)
您可以使用 X
或 Y
。如果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
在线外,两个方程(使用 X
或 Y
)可能会产生不同的 t
值。此外,如果该点位于“扩展”线上,您可能会得到小于零或大于一的 t
值。