» »

[Java-matematika] Računanje relativnega horizontalnega in vertikalnega kota v 3D

[Java-matematika] Računanje relativnega horizontalnega in vertikalnega kota v 3D

LightBit ::

Imam bolj matematični problem.
Rad bi izračunal horizontalen in vertikalen kot med dvema točkama v 3D prostoru, ampak ne znam matematike ;((.

To imam sedaj, vendar ne deluje pravilno (v nekaterih primerih je prav):
public class Position
{
    public double X; // meters
    public double Y; // meters
    public double Z; // meters
    public double HorizontalAngle; // -180 > 180
    public double VerticalAngle; // -180 > 180
    
    public Position(double x, double y, double z)
    {
        X = x;
        Y = y;
        Z = z;
    }
    
    public Position(double x, double y, double z, double horizontalAngle, double verticalAngle)
    {
        X = x;
        Y = y;
        Z = z;
        HorizontalAngle = horizontalAngle;
        VerticalAngle = verticalAngle;
    }
    
    public double horizontalAngle(Position p)
    {
        return Math.toDegrees(Math.atan2(p.X - X, (p.Y - Y) + (p.Z - Z) * Math.sin(VerticalAngle))) - HorizontalAngle;
    }
    
    public double verticalAngle(Position p)
    {
        return Math.toDegrees(Math.atan2(p.Z - Z, (p.Y - Y) + (p.X - X) * Math.sin(HorizontalAngle))) - VerticalAngle;
    }
}


Testi (pričakovano delovanje):
import org.junit.Test;
import static org.junit.Assert.*;

public class PositionTest
{
    @Test
    public void horizontalAngle_1()
    {
        Position a = new Position(1, 1, 1, 0, 0);
        Position b = new Position(1, 2, 1);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_2()
    {
        Position a = new Position(1, 1, 1, 0, 45);
        Position b = new Position(1, 2, 2);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_3()
    {
        Position a = new Position(1, 1, 1, 0, 90);
        Position b = new Position(1, 1, 2);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_4()
    {
        Position a = new Position(1, 1, 1, 0, 180);
        Position b = new Position(1, 0, 1);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_5()
    {
        Position a = new Position(1, 1, 1, 0, -45);
        Position b = new Position(1, 0, 0);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_6()
    {
        Position a = new Position(1, 1, 1, 0, -90);
        Position b = new Position(1, 1, 0);
        assertEquals(0, a.horizontalAngle(b), 0);
    }
    
    @Test
    public void horizontalAngle_7()
    {
        Position a = new Position(1, 1, 1, 0, -180);
        Position b = new Position(1, 0, 1);
        assertEquals(0, a.horizontalAngle(b), 0);
    }

    @Test
    public void horizontalAngle_8()
    {
        Position a = new Position(1, 1, 1, 0, -180);
        Position b = new Position(1, 2, 1);
        assertEquals(-180, a.horizontalAngle(b), 0);
    }

    @Test
    public void verticalAngle_1()
    {
        Position a = new Position(1, 1, 1, 0, 0);
        Position b = new Position(1, 2, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_2()
    {
        Position a = new Position(1, 1, 1, 45, 0);
        Position b = new Position(2, 2, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_3()
    {
        Position a = new Position(1, 1, 1, 90, 0);
        Position b = new Position(1, 2, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_4()
    {
        Position a = new Position(1, 1, 1, 180, 0);
        Position b = new Position(1, 0, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_5()
    {
        Position a = new Position(1, 1, 1, -45, 0);
        Position b = new Position(0, 0, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_6()
    {
        Position a = new Position(1, 1, 1, -90, 0);
        Position b = new Position(0, 1, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }
    
    @Test
    public void verticalAngle_7()
    {
        Position a = new Position(1, 1, 1, -180, 0);
        Position b = new Position(1, 0, 1);
        assertEquals(0, a.verticalAngle(b), 0);
    }

    @Test
    public void verticalAngle_8()
    {
        Position a = new Position(1, 1, 1, 180, 0);
        Position b = new Position(1, 2, 1);
        assertEquals(180, a.verticalAngle(b), 0);
    }
}

PositionTest.verticalAngle_4:117 expected:0.0 but was:180.0
PositionTest.verticalAngle_5:125 expected:0.0 but was:180.0
PositionTest.verticalAngle_7:141 expected:0.0 but was:180.0
PositionTest.verticalAngle_8:149 expected:180.0 but was:0.0
PositionTest.horizontalAngle_4:53 expected:0.0 but was:180.0
PositionTest.horizontalAngle_5:61 expected:0.0 but was:180.0
PositionTest.horizontalAngle_7:77 expected:0.0 but was:180.0
PositionTest.horizontalAngle_8:85 expected:-180.0 but was:0.0

Randomness ::

Rad bi izračunal horizontalen in vertikalen kot med dvema točkama v 3D prostoru
Tole boš moral malo bolje definirati, ker kot med dvema točkama načeloma ne obstaja.

otago ::

Lahko izracunas kot med koordinatnim sistemom (3-2-1, Bezugssystem) in 3D tocko, oz. razliko med koti.

LightBit ::

Ups, ja točka nima usmerjenosti.
Torej gre za usmerjen predmet.
Recimo na prvi poziciji je televizija, druga pozicija je pozicija gledalca. Rad bi pa izračunal pod kakšnim horizontalnim in vertikalnim kotom gledalec gleda televizijo.

LightBit ::

otago je izjavil:

Lahko izracunas kot med koordinatnim sistemom (3-2-1, Bezugssystem) in 3D tocko, oz. razliko med koti.

Ali dobim lahko posamezno horizontalni in vertikalni kot?
Za skupen kot sem našel.

zavtom ::

Najprej projeciraj na ravnino in nato irazunas kot v ravnini. Svincnik v roko pa gasa


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Android zamenjava pogledov

Oddelek: Programiranje
61086 (907) c00L3r
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
72119 (1924) darkolord
»

Glasbeni izrazi v angleščini

Oddelek: Sedem umetnosti
176501 (6115) embe
»

[c#] enostavna Igrca -> poraba procesorja 95%

Oddelek: Programiranje
192167 (1531) elKaktus
»

Kateri monitor?

Oddelek: Kaj kupiti
161584 (1435) boštjan

Več podobnih tem