簡體   English   中英

如何在 3D 空間的圓周上生成隨機點?

[英]How do I generate a random point on a circles circumference in 3D space?

我有一個 position 向量和一個描述平面的法向量。 該平面始終與 position 向量正交。 在這個平面上是一個以 position 向量為圓心的圓。 如何在給定半徑r的圓上生成隨機點? 我知道在二維空間中,我可以做到

x = cos(2 * PI * random) * radius y = sin(2 * PI * random) * radius

但是...我不知道如何將其轉換為平面上的圓圈。

我試圖找到一種使用 position 向量和法線向量生成點的方法,但我就是想不出正確的方法。 我可能對飛機不夠熟悉。

這取決於硬件,最好的答案是嘗試一下。

您的其他選擇是使用單獨的PIC進行步進控制,如您提到的那樣,使用偽線程(用戶域線程,但這在PIC平台的大多數編譯器中通常不可用)。

但是,也許最適合您的是讓軟件的主循環控制步進電機(用於...,移動,睡眠,繼續),然后使用中斷來處理將隨其進入的TCP / IP請求。修改狀態寄存器/變量。

使用中斷是一個好主意,但是當您擁有較高的優先級時,輪詢和循環是更好的選擇。 為了確保一切順利,您將需要確保TCP / IP中斷不會超過xxx個周期(或毫秒,與PIC上的相同),或者向TCP添加步進控制代碼。 / IP中斷處理程序。

現在,如果您的PIC控制器已對中斷進行了優先級排序,則無需執行任何操作。 在這種情況下,只需將步進中斷的優先級設置為高於TCP中斷的優先級,您就可以辦得到。 但是,我不認為PIC具有用戶功能,但是我可能會誤會。 這也可能是一個好主意,遷移到另一個平台, 支持優先級的中斷,因為這會讓大部分清晰的代碼,使您的生活更輕松的整體。

我曾經遇到過同樣的問題,那就是管理微控制器cpu在控制步進電機與從pc和傳感器接收數據之間的時間,但是我通過將控制程序(脈沖)分成每1KB並將其發送到微控制器內存中來解決。 然后我就可以釋放CPU時間。

首先我們需要圓平面上的兩個基向量。

第一個是與法線n正交的任意向量:

選擇幅度最大的法線分量,然后選擇幅度第二的分量。

交換它們的值,取最大的取反,使第三分量為零(注意結果與法線的點積為零,所以它們是正交的)

例如,如果最大的是ny ,其次是nz ,則使

v = (0, n.z, -n.y)

然后使用向量積計算第二個基向量

u = n x v 

歸一化向量vu (單位大小)。

現在我們可以使用中心點c (你的position ,我認為)在圓周上生成一個隨機點:

rho = 2 * PI * random

f.x = c.x + radius * v.x * cos(rho) + radius * u.x * sin(rho)
f.y = c.y + radius * v.y * cos(rho) + radius * u.y * sin(rho)
f.z = c.z + radius * v.z * cos(rho) + radius * u.z * sin(rho)

主機是否需要在0.5 ms的邊界上啟動和​​停止步進器? 我沒有任何數字可以支持這一點,但是我的感覺是,以太網鏈路的可變延遲可能會影響您對命令的響應能力,尤其是在同一網絡上還有其他設備的情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM