Równanie dwusiecznej kąta w 3D
Równanie dwusiecznej kąta w 3D
Cześć. Mój problem wygląda następująco. Mam współrzędne x,y,z trzech punktów w układzie kartezjańskim. Zadanie polega na podaniu współrzędnych punktu oddalonego o jakąś odległość D od punktu nr 2, który leżałby na linii wyznaczającej dwusieczną kąta pomiędzy punktami 1, 2 i 3. Wydaje mi się że zadanie ogranicza się do wyznaczenia równania dwusiecznej. W jaki sposób to zrobić i czy ewentualnie istnieje jakiś prostszy sposób na znalezienie rozwiązania. Dzięki!
-
- Użytkownik
- Posty: 2727
- Rejestracja: 14 paź 2004, o 16:26
- Płeć: Mężczyzna
- Lokalizacja: podkarpacie
- Podziękował: 3 razy
- Pomógł: 945 razy
Równanie dwusiecznej kąta w 3D
Da się to zrobić zarówno w 3D, 2D oraz ogólnie w \(\displaystyle{ \mathbb{R}^n,\ n\ge2}\).
Najpierw może ogólnie (wszystkie rozważania można sobie ilustrować na kartce ).
Mamy trzy punkty \(\displaystyle{ A,B,C}\) w przestrzeni (nie ważne ile ma wymiarów). Naszym zadaniem jest znalezienie punktu \(\displaystyle{ D}\) leżącego na dwusiecznej kąta \(\displaystyle{ \sphericalangle ABC}\) i takiego, żeby odległość \(\displaystyle{ |BD|=d}\).
Tworzymy wektory \(\displaystyle{ \stackrel{\longrightarrow}{BA}}\) i \(\displaystyle{ \stackrel{\longrightarrow}{BC}}\). Gdybyśmy dodali te wektory, to otrzymalibyśmy wektor, który leżałby pomiędzy nimi, ale raczej nie leżałby na dwusiecznej. Dlaczego? Powodem jest tu różna długość wektorów \(\displaystyle{ \stackrel{\longrightarrow}{BA}}\) i \(\displaystyle{ \stackrel{\longrightarrow}{BC}}\). Gdyby te długości byłyby takie same, to znaleziony wektor pokrywałby się z dwusieczną. Spróbujmy te długości wyrównać, najprostszą metodą jest tzw. znormalizowanie wektorów, czyli doprowadzenie do sytuacji, że ich długość będzie wynosić \(\displaystyle{ 1}\). Robimy to następująco: \(\displaystyle{ \stackrel{\longrightarrow}{BA}_n=\frac{\stackrel{\longrightarrow}{BA}}{\left|\stackrel{\longrightarrow}{BA}\right|}\ \ \stackrel{\longrightarrow}{BC}_n=\frac{\stackrel{\longrightarrow}{BC}}{\left|\stackrel{\longrightarrow}{BC}\right|}}\)
Teraz gdy dodamy te znormalizowane wektory, to dostaniemy wektor \(\displaystyle{ \stackrel{\longrightarrow}{BD'}}\), który pokrywa się z dwusieczną. Wystarczy go jedynie odpowiednio "wydłużyć" lub "skrócić" aby jego koniec stał się szukanym punktem \(\displaystyle{ D}\). Jak to uzyskać? Normalizujemy wektor \(\displaystyle{ \stackrel{\longrightarrow}{BD'}}\) i mnożymy go przez zadaną odległość \(\displaystyle{ d}\). Ostatecznie
\(\displaystyle{ \stackrel{\longrightarrow}{BD}=d\cdot \stackrel{\longrightarrow}{BD}_n=d\cdot\frac{\stackrel{\longrightarrow}{BD'}}{\left|\stackrel{\longrightarrow}{BD'}\right|}}\)
Zabrzmiało strasznie, ale w praktyce idzie to znacznie szybciej.
Przykład (dla \(\displaystyle{ n=3}\)).
\(\displaystyle{ A=(6,6,10),\ B=(2,2,8),\ C=(2,-2,5)}\), zadana odległość to \(\displaystyle{ 4}\).
Wektory \(\displaystyle{ \stackrel{\longrightarrow}{BA}=[4,4,2],\ \stackrel{\longrightarrow}{BC}=[0,-4,-3]}\) normalizujemy, dzieląc pierwszy przez \(\displaystyle{ \sqrt{4^2+4^2+2^2}=\sqrt{36}=6}\), drugi przez \(\displaystyle{ \sqrt{0^2+(-4)^2+(-3)^2}=\sqrt{25}=5}\), otrzymując wektory znormalizowane \(\displaystyle{ \stackrel{\longrightarrow}{BA}_n=\left[1,1,\frac{5}{3}\right],\ \stackrel{\longrightarrow}{BC}_n=\left[0,-\frac{4}{5},-\frac{3}{5}\right]}\).
Dodajemy te wektory do siebie otrzymując \(\displaystyle{ \stackrel{\longrightarrow}{BD'}=\left[1,\frac{1}{5},\frac{16}{15}\right]}\), normalizujemy go, dzieląc przez \(\displaystyle{ \sqrt{1+\frac{1}{25}+\frac{256}{225}}=\sqrt{\frac{225+9+256}{225}}=\sqrt{\frac{490}{225}}=\frac{7\sqrt{10}}{15}}\), czyli mnożąc przez \(\displaystyle{ \frac{15}{7\sqrt{10}}=\frac{3\sqrt{10}}{14}}\). Otrzymamy
\(\displaystyle{ \stackrel{\longrightarrow}{BD}_n=\left[\frac{3\sqrt{10}}{14},\frac{3\sqrt{10}}{70},\frac{48\sqrt{10}}{210}\right]}\)
No i na koniec otrzymujemy
\(\displaystyle{ D=\left( 2+4\cdot\frac{3\sqrt{10}}{14},2+4\cdot\frac{3\sqrt{10}}{70},8+4\cdot\frac{48\sqrt{10}}{210}\right)=\left(\frac{28+12\sqrt{10}}{14},\frac{140+12\sqrt{10}}{70},\frac{1680+192\sqrt{10}}{210}\right)}\)
Mam nadzieję, że w swoje zadanie będziesz liczył na kompie, napisanie algorytmu jest tu bardzo proste.
Najpierw może ogólnie (wszystkie rozważania można sobie ilustrować na kartce ).
Mamy trzy punkty \(\displaystyle{ A,B,C}\) w przestrzeni (nie ważne ile ma wymiarów). Naszym zadaniem jest znalezienie punktu \(\displaystyle{ D}\) leżącego na dwusiecznej kąta \(\displaystyle{ \sphericalangle ABC}\) i takiego, żeby odległość \(\displaystyle{ |BD|=d}\).
Tworzymy wektory \(\displaystyle{ \stackrel{\longrightarrow}{BA}}\) i \(\displaystyle{ \stackrel{\longrightarrow}{BC}}\). Gdybyśmy dodali te wektory, to otrzymalibyśmy wektor, który leżałby pomiędzy nimi, ale raczej nie leżałby na dwusiecznej. Dlaczego? Powodem jest tu różna długość wektorów \(\displaystyle{ \stackrel{\longrightarrow}{BA}}\) i \(\displaystyle{ \stackrel{\longrightarrow}{BC}}\). Gdyby te długości byłyby takie same, to znaleziony wektor pokrywałby się z dwusieczną. Spróbujmy te długości wyrównać, najprostszą metodą jest tzw. znormalizowanie wektorów, czyli doprowadzenie do sytuacji, że ich długość będzie wynosić \(\displaystyle{ 1}\). Robimy to następująco: \(\displaystyle{ \stackrel{\longrightarrow}{BA}_n=\frac{\stackrel{\longrightarrow}{BA}}{\left|\stackrel{\longrightarrow}{BA}\right|}\ \ \stackrel{\longrightarrow}{BC}_n=\frac{\stackrel{\longrightarrow}{BC}}{\left|\stackrel{\longrightarrow}{BC}\right|}}\)
Teraz gdy dodamy te znormalizowane wektory, to dostaniemy wektor \(\displaystyle{ \stackrel{\longrightarrow}{BD'}}\), który pokrywa się z dwusieczną. Wystarczy go jedynie odpowiednio "wydłużyć" lub "skrócić" aby jego koniec stał się szukanym punktem \(\displaystyle{ D}\). Jak to uzyskać? Normalizujemy wektor \(\displaystyle{ \stackrel{\longrightarrow}{BD'}}\) i mnożymy go przez zadaną odległość \(\displaystyle{ d}\). Ostatecznie
\(\displaystyle{ \stackrel{\longrightarrow}{BD}=d\cdot \stackrel{\longrightarrow}{BD}_n=d\cdot\frac{\stackrel{\longrightarrow}{BD'}}{\left|\stackrel{\longrightarrow}{BD'}\right|}}\)
Zabrzmiało strasznie, ale w praktyce idzie to znacznie szybciej.
Przykład (dla \(\displaystyle{ n=3}\)).
\(\displaystyle{ A=(6,6,10),\ B=(2,2,8),\ C=(2,-2,5)}\), zadana odległość to \(\displaystyle{ 4}\).
Wektory \(\displaystyle{ \stackrel{\longrightarrow}{BA}=[4,4,2],\ \stackrel{\longrightarrow}{BC}=[0,-4,-3]}\) normalizujemy, dzieląc pierwszy przez \(\displaystyle{ \sqrt{4^2+4^2+2^2}=\sqrt{36}=6}\), drugi przez \(\displaystyle{ \sqrt{0^2+(-4)^2+(-3)^2}=\sqrt{25}=5}\), otrzymując wektory znormalizowane \(\displaystyle{ \stackrel{\longrightarrow}{BA}_n=\left[1,1,\frac{5}{3}\right],\ \stackrel{\longrightarrow}{BC}_n=\left[0,-\frac{4}{5},-\frac{3}{5}\right]}\).
Dodajemy te wektory do siebie otrzymując \(\displaystyle{ \stackrel{\longrightarrow}{BD'}=\left[1,\frac{1}{5},\frac{16}{15}\right]}\), normalizujemy go, dzieląc przez \(\displaystyle{ \sqrt{1+\frac{1}{25}+\frac{256}{225}}=\sqrt{\frac{225+9+256}{225}}=\sqrt{\frac{490}{225}}=\frac{7\sqrt{10}}{15}}\), czyli mnożąc przez \(\displaystyle{ \frac{15}{7\sqrt{10}}=\frac{3\sqrt{10}}{14}}\). Otrzymamy
\(\displaystyle{ \stackrel{\longrightarrow}{BD}_n=\left[\frac{3\sqrt{10}}{14},\frac{3\sqrt{10}}{70},\frac{48\sqrt{10}}{210}\right]}\)
No i na koniec otrzymujemy
\(\displaystyle{ D=\left( 2+4\cdot\frac{3\sqrt{10}}{14},2+4\cdot\frac{3\sqrt{10}}{70},8+4\cdot\frac{48\sqrt{10}}{210}\right)=\left(\frac{28+12\sqrt{10}}{14},\frac{140+12\sqrt{10}}{70},\frac{1680+192\sqrt{10}}{210}\right)}\)
Mam nadzieję, że w swoje zadanie będziesz liczył na kompie, napisanie algorytmu jest tu bardzo proste.