Náhodný pravoúhlý trojúhelník   zodpovězená otázka

VB.NET, Algoritmy

Dobrý den,

V mé aplikaci generuji náhodné trojúhelníky. Je možnost vybrat typ trojúhelníku např. pravoúhlý. Mám problém s generováním pravoúhlého trojúhelníku.

Zde je kód:

Imports System.Math
Public Class Form1
    Dim s(2), u(2) As Double
    Dim ran As New Random
    Private Sub PravTroj(ByRef a As Double, ByRef b As Double, ByVal c As Double)
        s(0) = a
        s(1) = b 'kod nize je zkopirovany z jine fce, proto tyto 3 radky. Prosim nenadavejte.
        s(2) = c
        If s(0) + s(1) > s(2) And s(1) + s(2) > s(0) And s(0) + s(2) > s(1) Then
            u(0) = Acos(((s(1) ^ 2) + (s(2) ^ 2) - (s(0) ^ 2)) / (2 * s(1) * s(2)))
            u(1) = Acos(((s(0) ^ 2) + (s(2) ^ 2) - (s(1) ^ 2)) / (2 * s(0) * s(2)))
            u(2) = Acos(((s(0) ^ 2) + (s(1) ^ 2) - (s(2) ^ 2)) / (2 * s(0) * s(1)))
        End If
        While Not u(0) = PI / 2
            PravTroj(ran.Next(1, 50), ran.Next(1, 50), ran.Next(1, 50))
        End While
        TextBox1.Text = s(0)
        TextBox2.Text = s(1)
        TextBox3.Text = s(2)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PravTroj(ran.Next(1, 50), ran.Next(1, 50), ran.Next(1, 50))
    End Sub
End Class

Myslím si že, cyklus který kontroluje strany trojúhelníku, je špatně. A i když dám jako podmínku cyklu jen u(0) funguje jen někdy. Nastává chyba StackOverflowException was unhandled.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechce se mi se probírat těmi vzorečky z arccosiny, ale

1) test pravoúhlosti trojúhelníka je mnohem rychlejší a jednodušší přes pythagorovu větu

2) a hlavně, díky pythagorovce vám pro nagenerování pravoúhlého trojúhelníka stačí nagenerovat 2 strany (odvěsny) a přeponu pak spočítat jako sqrt(a*a+b*b). Mělo by platit, že trojúhelník je jednoznačně zadaný, když máme délky 2 stran a úhel mezi nima (tady π/2).

Váš postup má nekonečnou složitost, neboť tím, že třetí stranu máte jednoznačně zadanou, tak se musíte tím náhodným generátorem trefit přímo do ní, což je v podstatě nulová pravděpodobnost (přesněji lim_n->∞ (1 / n)).

Druhý problém je v u(0) = PI / 2 - díky zaokrouhlovacím chybám vám toto (prakticky) nikdy nevyjde. V praxi, pokud chci porovnávat 2 reálná čísla x a y, tak dělám něco jako if (Math.Abs(x - y) < δ), kde δ je nějaké malé číslo, dost malé na to, aby neprošly rozdílná čísla, ale dost velké na to, aby se eliminovaly chyby vzniké zaokrouhlením.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak tak. Nejjednodušší bude toto:

1. Nagenerujte dva body P1, P2 a spočítejte si vektor mezi nimi - dvojice (x1 - x2, y1 - y2).

2. Vytvořte vektor, který je k tomu spočítanému kolmý - k (a, b) je kolmý (-b, a), takže k (x1 - x2, y1 - y2) bude kolmý třeba (y2 - y1, x1 - x2).

3. Nagenerujte náhodné číslo (kladné i záporné z nějakého rozumného rozsahu). Vynásobte vektor tímto číslem a přičtěte ho k souřadnicím prvního bodu. A máte třetí bod P3, přičemž vektory P3, P1 a P1, P2 jsou kolmé.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Mockrát děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback