IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
švrčajs
Člen
Avatar
švrčajs:21.4.2017 11:25

Zdravím, potřeboval bych hint ohledně jedné věci, mám napsat metodu, která mi určí směr pohybu po kružnici, jedná se o appku, kde jezdím myší po nakreslené kružnici a potřebuju určit, směr... Začal jsem na tom makat, ale zasekl jsem se na výpočtu směru. Zatím mám napsané toto:

public class Direction
        {
            //délka strany, předpoklad. že se jedná o čtverec
            double length;
            //souřadnice středu
            int cX;
            int cY;

            //nastavení šířky "kruhu", po kterém lze kroužit..
            double r;
            double insideR;


            //potřebuju min 3 body, startovací, mezibod a koncový bod
            List<List<int>> points;
            public Direction(double length, int cX, int cY)
            {
                this.length = length;
                this.cX = cX;
                this.cY = cY;
                r = length / 2;
                insideR = r - 2;
                points = new List<List<int>>();
            }

            private double DistanceTwoPoint(int aX, int aY, int bX, int bY)
            {
                double distance = Math.Pow((bX - aX), 2) + Math.Pow((bY - aY), 2);
                distance = Math.Sqrt(distance);
                distance = Math.Abs(distance);
                return distance;
            }
            private int WhereIs(int x, int y)
            {
                //1 = q1 2 = q2 3 = q3 4 = q4

                if (x >= cX && x <= cX + r && y >= cY && y <= cY + r) return 1;
                if (x >= cX && x <= cX - r && y >= cY && y <= cY + r) return 2;
                if (x >= cX && x <= cX - r && y >= cY && y <= cY - r) return 3;
                if (x >= cX && x <= cX + r && y >= cY && y <= cY - r) return 4;
                return 0;
            }

            public int TryGetDirection(int x, int y)
            {
                //není dostatečný počet bodů, přídám si jen bod a vrátím 0
                if(points.Count() < 3)
                {
                    var dist = DistanceTwoPoint(cX, cY, x, y);
                    //ověření, zda je ve vymezeném kruhu
                    //případně, když není, vymazat obsah listu a začít znovu ??
                    if (dist <= r && dist >= insideR)
                    {
                        points.Add(new List<int>{ x, y});
                    }
                    return 0;
                }

                var p1 = WhereIs(points[0][0], points[0][1]);
                var p2 = WhereIs(points[1][0], points[1][1]);
                var p3 = WhereIs(points[2][0], points[2][1]);
            }
        }

Rozdělil jsem si kružnici do 4 dílů a přiřadím bodům, v jakém dílu se nachází, ale teď vůbec nevím, jak určit směr, protože může nastat, že budou všechny 3 body v jednom dílku (to by nebylo tak zlé :D), ale celkově je těch možností moc. Nemáte někdo prosím nápad, jak to co nejvíc zjednodušit ?

 
Odpovědět
21.4.2017 11:25
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na švrčajs
gcx11:21.4.2017 14:09

Ahoj, jestli to chápu dobře, chceš zkoumat, zda-li se uživatel při pohybu myší drží té kružnice? IMHO ty body bylo lepší ukládat jako struct.

struct Point{
      public int x, y;
      public Point(int x, int y){
            this.x = x;
            this.y = y;
}
 
Nahoru Odpovědět
21.4.2017 14:09
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na švrčajs
gcx11:21.4.2017 14:12

Já bych převedl ty body na polární souřadnice. Potom, pokud se úhel zvyšuje -> jeden směr, jinak druhý. Poloměr Ti pak udává, jak moc je uživatel mimo od tvé kružnice.

 
Nahoru Odpovědět
21.4.2017 14:12
Avatar
Odpovídá na švrčajs
Antonín Tonini:21.4.2017 14:30

Myslím, že k určení toho směru pohybu by stačilo pouze využít geometrického významu determinantu. (v našem případě nám stačí počáteční A a koncový bod B, kde souřadnice tvoří matici 2x2).
Determinant spočítáš jako A.x*B.y - B.x*A.y. Pokud je kladný, tak je pohyb proti směru hodinových ručiček, pokud záporný, tak po směru hodinových ruriček. Nulový znamená pohyb od nebo směrem do středu kružnice. Samozřejmě musíš vzít v úvahu směr os. Ve výše zmíněném případě by x-ová osa šla doprava a y-ová nahoru. V grafice je ale často y-ová osa dolů, takže to bude naopak. Pokud je determinant kladný, tak je pohyb po směru hodinových ručiček, pokud záporný, tak proti směru.

 
Nahoru Odpovědět
21.4.2017 14:30
Avatar
švrčajs
Člen
Avatar
Odpovídá na Antonín Tonini
švrčajs:25.4.2017 9:35

No, každopádně :D průser je v tom, že když přesáhnu s cílovým bodem půlku obvodu kružnice, bere to tak, že jsem jel druhou stranou :D

 
Nahoru Odpovědět
25.4.2017 9:35
Avatar
Odpovídá na švrčajs
Antonín Tonini:25.4.2017 14:49

Tady jsem se zapomněl zmínit, že musíš brát ohled na počátek. Tady se pohybujeme po kružnici s počátkem v bodě [0,0]. Náš počátek je ale fixovaný v jednom rohu. Program to bere tak, že se pohybuješ jen po části kružnice v III. kvadrantu, takže když se pohybuješ po směru, tak je to ok, ale když začneš hýbat kurzorem nahoru, tak se pohybuješ proti směru.
Potřebuješ tedy znát střed toho kruhu.Tu novou souřadnici pak namapuješ na systém s počátkem [0,0], kde je střed kružnice. (jednoduše posuneš souřadnice nového bodu o souřadnice středu kružnice. [newpoint.X - center.X, newpoint.Y - center.Y]). Pak už by to mělo fungovat.

 
Nahoru Odpovědět
25.4.2017 14:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.