[英]How to convert a numpy array [(x1,y1),(x2,y2),(x3,y3),…(xn,yn)] to [(x1,y1,x1^2,y1^2),(x2,y2,x2^2,y2^2),…(xn,yn,xn^2,yn^2)]
[英]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
,一個介於0
和1
表示PF
在向量P1->P2
上的遍歷如下:
def calculate():
t = (XF - X1) / (X2 - X1)
或者:
def calculate():
t = (YF - Y1) / (Y2 - Y1)
您可以使用X
或Y
。 如果點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
在線外,則兩個方程(使用X
或Y
)可能會產生不同的t
值。 此外,如果該點位於“延長”線上,您可能會得到小於零或大於一的t
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.