Autor Zpráva
Darker
Profil
Potřebuji pro určitou přímku a pod najít vzdálenost pod určitým úhlem. Jedná se o simulaci (testovací emulace vstupu) radaru. Představte si, že radar třeba míří do rohu místnosti, nebo na nějakou jinou hranatou překážku. Chci najít pod každým úhlem od radaru bod ležící v daném objektu.
Vizualizace.
Předpokládám že by to šlo řešit pomocí deskriptivní geometrie - bod a úhel jsou ve 2D dostatečné k zadání přímky. Pak stačí najít průsečík těch přímek. Ale nejdřív se raději poptám po nějakém jednodušším řešení.
neutr
Profil
Nevím, co si pod popsaným problémem alternativního řešení představujete. Klasický radar vysílá signál, který je jakoby vektorem, a když se vrátí odražený, tak se zaznamená (někam na něco) jako bod. Signál je vysílán většnou synchronní. Návrácený odražený je pak asynchronní a z toho lze dovodit vzdálenost. Lokace netopýrů spořívá v tom, že mají dvě uši, a porovnávjí tak směr a sílu odraženého signálu. Lze tedy tvrdit, že vysílaný signál není vektorem, ale polem (na rozdíl od klasického radaru). Vektorem se stane až když ho zachytí uši netopýra. Existuje ještě princip oka. Ten spočívá v tom, že se světlo zachytává na sítnici, která je do jisté míry podobná poli tranzistorů (CCD ap). Tam se relativně současně aktivují všechny body odpovídající detekovanému objektu. Velikost a vzdálenost jsou dány úhlem očí a zaostřením čočky. Podobné je to například u ryb, které místo sítnice užívají část svého těla (je to podélný pruh na boku od hlavy k ocasu). Oči hmyzu jsou jakoby obráceným principem našeho oka. Hmyz má 2 oči, ale každé oko má mnoho jednotlivých "očiček". Směr je dán tím "očičkem", které má nejsilnější (největší) průmět.
Ve výsledku je to pro jednotlivý bod ve 3D tedy vždy nějaký dvojvektor pod úhlem. pro 2D stačí relativně jen 1 vektor. (Původní radary neuměly "spočítat" vzdálenost z doby zpoždění signálu. Body se zaznamenávaly na stínítku a teprve po vykreslení více detailů se z "obrázku" usuzovalo zda je to kormorán, nebo letadlo. Vzdálenost se odvozovala od velikosti vykresleného objektu. První radar byl použit v bitvě o Británii. Tam se vzdálenost určovala na pevnině trigonometricky za pomoci dvou stanic a více. Jediný radar tohle nemohl zjistit. V letadlech byly radary právě tohoto typu.)
Chtěl jsem tím naznačit, že jiná cesta nežli jste popsal ani nemůže být. Zejména při simulaci "radaru" by se měl zobrazovat konstantně rotující vektor v 360°, nebo v jiném úhlu (180) jako "kyvadlo". Jediný problém bych připustil. Buď bude mít zobrazovaný objekt 3D, nebo jen 2D. Ten třetí rozměr pro 3D je dán dejme tomu měřením doby odrazu a návratu signálu.
Ve výsledku je pak pro 2D jen vyznačená kruhová úseč na kružnici (stejný poloměr), nebo jsou body objektu také uvnitř kruhové výseče - 3D. Tam už to není jen křivka, ale plošný útvar deformovaný perspektivou.
Giga
Profil
neutr
Pekný príspevok!
1Pupik1989
Profil
Řekl bych, že pro popisovaný problém bude řešením raycasting. Najít kolizní bod a spočítat vzdálenost dvou bodů v rovině.
Darker
Profil
1Pupik1989:
Najít kolizní bod a spočítat vzdálenost dvou bodů v rovině.
Asi ano, prostě jsem jen doufal, že nebudu muset dělat nějakou funkci pro kolizi dvou přímek. A nebo, že mi někdo už pošle nějakou napsanou. Implementaci deskriptivní geometrie mi nikdy moc nešla, i když je to moje oblíbená část matematiky.

Celou simulaci nedělám proto, že bych dělal hry s radarem, který musí být realistický, ale proto, že mám zařízení, které bude na web streamovat skutečné naměřené hodnoty a já chci mít nějakou simulaci, než bude zařízení v provozu.
1Pupik1989
Profil
Takže pokud jsem to pochopil, je to toto?
Darker
Profil
Přesně. Máš nápad jak si ušetřit práci? Nechce se mi vyjadřovat z rovnic o dvou neznámých a tvořit vzorce, to se mi zatím nikdy neosvědčilo.
Zatím ten radar kreslí pěknou spirálku.
Úhel je vždy time()%180, proto to je i po refreshi stejné.
1Pupik1989
Profil
Štěstí, že jsem to nedávno řešil, mám to samozřejmě v javascriptu. Hodím jen ten čistý úryvek na výpočet průsečíku dvou přímek.

var x1 = 0; //počáteční bod na ose X úsečky "a"
var x2 = 100; //konečný bod na ose X úsečky "a"
var x3 = 100; //počáteční bod na ose X úsečky "b"
var x4 = 0; //konečný bod na ose X úsečky "b"
  
var y1 = 0; //počáteční bod na ose Y úsečky "a"
var y2 = 100; //konečný bod na ose Y úsečky "a"
var y3 = 0; //počáteční bod na ose Y úsečky "b"
var y4 = 100; //konečný bod na ose Y úsečky "b"
 
var x = ((y2-y1)*(x4-x3)*x1 + (x2-x1)*(x4-x3)*(y3-y1) - (y4-y3)*(x2-x1)*x3) /  ((y2-y1)*(x4-x3) - (x2-x1)*(y4-y3))
var y = (x*(y2-y1)+y1*(x2-x1)-x1*(y2-y1)) / (x2-x1);

jedna z úseček bude vlastně vypočítaná bodu X a Y, úhlu a délky. Na to bude stačit matice rotace pro osu Z, čili:

var xA = (x * Math.cos(deg)) - (y * Math.sin(deg));
var yA = (x * Math.sin(deg)) + (y * Math.cos(deg));

Stačí délku přidat k původnímu x.
1Pupik1989
Profil
Pomohlo? ještě jde průsečík počítat od ypsilonu.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: