二維空間中的聲線反射模擬

2021-08-26 22:00:51 字數 1071 閱讀 3535

感覺這個挺有意思的就做了一下,雖然是和虛擬實境沾邊的東西,但說不定以後在資料探勘上也能用來給資料在不同屬性上分類什麼的。

做了個最簡單的:模擬聲音在理想二維空間中的反射,而且假設二維空間是封閉的矩形區域,其中可能有若干的垂直或者水平的牆,將空間分割為若干的子空間,空間中有乙個聲源和乙個接收點。

聲源向四周均勻發射n條聲線,反射深度為m(經過m次反射,強度會衰減到0),空間中公有y條互不交叉的牆壁。

例如下圖是程式的演示效果:

藍色的為牆壁,共有7條,聲源在左上角,向周圍均勻發出10條聲線,最終經過反射,有1條到達接收者。

實現這個的演算法有很多,其中效率比較高的是bsp二叉樹演算法。

bsp樹就是用來對n維空間中的元素進行排序和查詢的二叉樹。bsp樹表示整個空間,bsp樹中的任意乙個接點表示乙個凸的子空間。每個接點包含乙個「超平面」,將這個接點表示的空間分割成兩個子空間。每個接點除了儲存其兩個子接點的引用以外,還可以儲存乙個或多個元素。對於n維空間,超平面為n-1維的物件。通常,用bsp樹來表示二維或者三維空間,這時,空間中的元素分別指的是線段和多邊型。

在二維空間中,就是選擇一條線段作為樹的根節點,被線段分隔開的兩個空間中的線段分別在左右兩棵子樹中。二叉樹調整平衡後查詢的平均時間複雜度為o(log n),所以整個繪製聲線的過程的時間複雜度為n*m*log(y)。

但是建個平衡的bsp二叉樹要寫多少**啊,我就用了個很*****的演算法,壓根沒有去儲存空間資訊,直接存下了所有的牆壁線段,其中求一條聲線的反射線的偽**如下:

輸入:一條聲線l

返回:輸入聲線的反射聲線rl

listwalls;

listpoints;

遍歷所有的牆壁

}遍歷points,找出距離l出射點最近的乙個反射點pr

根據pr和對應的wall求出反射聲線rl,返回rl

用了這個演算法,整個過程的複雜度就是m*n*y了,但是對於幾十條牆壁、幾十條聲線和十幾個反射深度,還是眨眼功夫的事,效果如上圖所示。繪圖用的是gdi+。

二維空間中的聲線模擬

感覺這個挺有意思的就做了一下,雖然是和虛擬實境沾邊的東西,但說不定以後在資料探勘上也能用來給資料在不同屬性上分類什麼的。做了個最簡單的 模擬聲音在理想二維空間中的反射,而且假設二維空間是封閉的矩形區域,其中可能有若干的垂直或者水平的牆,將空間分割為若干的子空間,空間中有乙個聲源和乙個接收點。聲源向四...

三維空間中的圓與二維多段線

已知一段圓弧的起點 終點 弧度和法向,求此段圓弧的引數方程和引數區間。圓的引數方程 字母所代表含義可參見 第六回 occt之package geom的曲線曲面引數方程解析 p u o r cos u xdir r sin u ydir這個問題主要應用於二維多段線中圓弧段的求解。在這裡我先講一下二維多...

三維空間中剛體的旋轉

從零開始一起學習slam 三維空間剛體的旋轉 剛體 本身不會在運動過程中產生形變的物體,運動過程中同乙個向量的長度和夾角都不會發生變化。剛體變換也稱歐式變換。1 是重點!2 旋轉矩陣不是一般矩陣,它有比較強的約束條件。旋轉矩陣r具有正交性,r和r的轉置的乘積是單位陣,且行列式值為1。3 旋轉矩陣r的...