Definire una funzione per un cerchio tappi la fine di un segmento di linea
-
25-09-2019 - |
Domanda
Ho bisogno di una funzione che restituisce i punti su un cerchio in tre dimensioni.
Il cerchio dovrebbe "cap" un segmento di linea definito dai punti A e B e di raggio. ciascun tappo è perpendicolare al segmento di linea. e centrato in uno dei punti finali.
Soluzione
Sia n il versore nella direzione da A a B, cioè, N = (B-A) / lunghezza (A-B). Il primo passo è trovare altre due vettori X e Y tali che {N, X, Y} formano una base. Ciò significa che si desidera più due vettori in modo che tutte le coppie di {N, X, Y} sono perpendicolari l'uno all'altro e anche in modo che siano tutti vettori unitari. Un altro modo di pensare a questo è che si desidera creare un nuovo sistema di coordinate il cui asse X linee con il segmento di linea. Hai bisogno di trovare vettori che puntano nella direzione dell'asse y e z.
Si noti che ci sono infinitamente molte scelte per X e Y. Hai solo bisogno di qualche modo trovare due che di lavoro.
Un modo per farlo è quello primi vettori find {N, W, V} dove N è dall'alto e W e V sono due (1,0,0), (0,1,0), e ( 0,0,1). Scegliere i due vettori di W e V che corrispondono ai minimi coordinate di N. Quindi se N = (.31, .95, 0) allora si prelevamento (1,0,0) e (0,0,1) per W e V. (Math disadattato nota: Questo modo di raccogliere W e V assicura che {N, W, V} campate R ^ 3). Poi si applica il Gram-Schmidt processo per {N, W, V } per ottenere vettori {N, X, Y} come sopra. Si noti che è necessario il vettore N di essere il primo vettore in modo che non venga modificata dal processo.
Così ora avete due vettori che sono perpendicolari al segmento di linea e perpendicolari tra loro. Questi mezzi di punti sulla circonferenza intorno A sono X * cos t + Y * sin t + A dove 0 <= t <2 * pi. Questo è esattamente come il solito descrizione di un cerchio in due dimensioni; è solo scritto nel nuovo sistema di coordinate descritto sopra.
Altri suggerimenti
Come David Norman ha osservato il punto cruciale è quello di trovare due vettori unitari ortogonali X, Y che sono ortogonali al N. Tuttavia credo che un modo più semplice per calcolare questi è di trovare il padrone di casa riflessione Q che mappa N ad un multiplo di (1 , 0,0) e poi prendere come X l'immagine di (0,1,0) in Q e Y come l'immagine di (0,0,1) in Q. Anche se questo suono potrebbe complicato si tratta di:
s = (N [0]> 0.0)? 1.0: -1.0
t = N [0] + s; f = -1.0 / (s * t);
X [0] = f * N [1] * t; X [1] = 1 + f * N [1] * N [1]; X [2] = f * N [1] * N [2];
Y [0] = f * N [2] * t; Y [1] = f * N [1] * N [2]; Y [2] = 1 + f * N [2] * N [2];