亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取兩點之間xyz坐標列表的最快方法

獲取兩點之間xyz坐標列表的最快方法

大話西游666 2023-06-13 19:13:59
我有 2 個點 A 和 B 以及它們的 xyz 坐標。我需要在這兩個點之間的線上的所有 xyz 點的列表。Bresenham 的線算法對我來說太慢了。A 和 B 的示例 xyz:p = np.array([[ 275.5, 244.2, -27.3],           [ 153.2, 184.3,  -0.3]])預期輸出:x3 = p[0,0] + t*(p[1,0]-p[0,0])y3 = p[0,1] + t*(p[1,1]-p[0,1])z3 = p[0,2] + t*(p[1,2]-p[0,2])p3 = [x3,y3,z3]二維有一個非??焖俚姆椒ǎ篸ef connect(ends):    d0, d1 = np.diff(ends, axis=0)[0]    if np.abs(d0) > np.abs(d1):         return np.c_[np.arange(ends[0, 0], ends[1,0] + np.sign(d0), np.sign(d0), dtype=np.int32),                     np.arange(ends[0, 1] * np.abs(d0) + np.abs(d0)//2,                               ends[0, 1] * np.abs(d0) + np.abs(d0)//2 + (np.abs(d0)+1) * d1, d1, dtype=np.int32) // np.abs(d0)]    else:        return np.c_[np.arange(ends[0, 0] * np.abs(d1) + np.abs(d1)//2,                               ends[0, 0] * np.abs(d1) + np.abs(d1)//2 + (np.abs(d1)+1) * d0, d0, dtype=np.int32) // np.abs(d1),                     np.arange(ends[0, 1], ends[1,1] + np.sign(d1), np.sign(d1), dtype=np.int32)]
查看完整描述

2 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

不可能在一條線上給出“所有”點,因為有無數個點。不過,您可以對整數等離散數據類型執行此操作。如您的示例所示,我的回答采用浮點數。


從技術上講,浮點數以固定寬度的二進制格式存儲,因此它們是離散的,但我會忽略這一事實,因為它很可能不是你想要的。


正如您已經輸入的問題,該行上的每個點 P 都滿足此等式:


P = P1 + t * (P2 - P1), 0 < t < 1


我的版本使用 numpy 廣播來規避顯式循環。


import numpy as np


p = np.array([[ 275.5, 244.2, -27.3],

              [ 153.2, 184.3,  -0.3]])


def connect(points, n_points):

    p1, p2 = points

    diff = p2 - p1

    t = np.linspace(0, 1, n_points+2)[1:-1]

    return p1[np.newaxis, :] + t[:, np.newaxis] * diff[np.newaxis, :]



print(connect(p, n_points=4))

# [[251.04 232.22 -21.9 ]

#  [226.58 220.24 -16.5 ]

#  [202.12 208.26 -11.1 ]

#  [177.66 196.28  -5.7 ]]


查看完整回答
反對 回復 2023-06-13
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

也許我在這里誤解了一些東西,但你不能只創建一個函數(就像你已經為一個點所做的那樣)然后根據你想要多少點來創建一個點列表?


我的意思是 2 點之間是無限數量的其他點,所以你必須定義一個數字或直接使用函數,它描述了點的位置。


import numpy as np


p = np.array([[ 275.5, 244.2, -27.3],

           [ 153.2, 184.3, -0.3]])


def gen_line(p, n):


    points = []

    stepsize = 1/n

    for t in np.arange(0,1,stepsize):

        x = (p[1,0]-p[0,0])

        y = (p[1,1]-p[0,1])

        z = (p[1,2]-p[0,2])

        px = p[0,0]

        py = p[0,1]

        pz = p[0,2]

        

        x3 = px + t*x

        y3 = py + t*y

        z3 = pz + t*z

        points.append([x3,y3,z3])

    return points


# generates list of 30k points

gen_line(p, 30000)


查看完整回答
反對 回復 2023-06-13
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號