NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:9.12.2016 19:13

Zdravím, mám problém. Kreslím pomocí C# na jeden canvas a ocitl jsem se před jedním problémem: Mám čtverec (resp. obdélník) o stranách a, b. V levém horním rohu jsou souřadnice [0, 0] a v pravém dolním [a, b]. Dále mám kružnici o známem r a se středem v [a/2, b/2]. Poté mám počet bodů, které chci na kružnici umístit v pravidelných intervalech. Už delší dobu si hraju s goniometrickými fcemi, ale pořád to nedokáže vyřešit. Sice to kreslí zajímavé útvary a patvary, ale nikdy nic, co by šlo použít.

Kód:

double stupen = 0.0;
                for (int j = 0; j <= nmbrs[i]; j++)
                {
                    double x = Math.Abs(Math.Cos(stupen) * r);
                    double y = Math.Abs(Math.Sin(stupen) * r);

                    if (stupen < 180)
                        x = x + canvas.Width / 2;
                    else
                        x = canvas.Width / 2 - x;

                    if (stupen > 90 && stupen < 270)
                        y = canvas.Height / 2 + y;
                    else
                        y = canvas.Height / 2 - y;


                    ctx.BeginPath();
                    ctx.Rect(x, y, xBodu, yBodu);
                    ctx.Stroke();
                    ctx.ClosePath();

                    stupen += 360 / nmbrs.Length;
                }

Přikládám screenshot s výsledkem:
http://prntscr.com/dhen58

 
Odpovědět
9.12.2016 19:13
Avatar
Neaktivní uživatel:9.12.2016 19:42

Jsou tam potřeba ty podmínky pro stupně? Já bych dal prostě:

x = X-středu + sin(stupeň);
y = Y-středu + cos(stupeň);

Dále, Funkce Sin a Cos berou v radiánech, ne ve stupních. A dále, myslím že máš prohozené funkce - Sin má být u X, Cos u Y.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.12.2016 19:42
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:9.12.2016 19:48

Zapomněl jsem - samozřejmě

sin(úhel) * poloměr;
Nahoru Odpovědět
9.12.2016 19:48
Neaktivní uživatelský účet
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Šťastný:9.12.2016 20:05

Pořád to blbne.

http://prntscr.com/dhfbq8

double radiany = 2 * Math.PI / 360 / stupen;
double x = Math.Cos(radiany) * r + canvas.Width / 2;
double y = Math.Sin(radiany) * r + canvas.Height / 2;

Prohození Sin a Cos nepomáhá, jenom se ty čtverečky vykreslují dolů místo doprava. Ale stejně díky :-)

 
Nahoru Odpovědět
9.12.2016 20:05
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:10.12.2016 10:59

Už jsem to vyřešil. Jednak jsem špatně počítal to rozložení a druhak jsem špatně počítal stupně :) Kdyby někdo někdy měl podobný problém, tady je řešení:

int r = 0;
            for (int i = 0; i < nmbrs.Length; i++)
            {
                r += ((canvas.Height - (canvas.Height / 100) * 5) / 2) / (nmbrs.Length);
                ctx.BeginPath();
                ctx.Arc(canvas.Width / 2, canvas.Height / 2, r, 0, 360);
                ctx.Stroke();
                ctx.ClosePath();

                List<double> stupen = new List<double>();
                stupen.Add(0);
                for (int j = 1; j < nmbrs[i]; j++)
                {
                    stupen.Add(stupen[stupen.Count - 1] + (360 / nmbrs[i]));
                }

                posByDegree(canvas, ctx, stupen.ToArray(), r, xBodu, yBodu);
            }

posByDegree:

foreach (int i in degrees)
            {
                double radiany = i * Math.PI / 180;
                double x = Math.Cos(radiany) * r + canvas.Width / 2;
                double y = Math.Sin(radiany) * r + canvas.Height / 2;


                ctx.BeginPath();
                ctx.Rect(x, y, xBodu, yBodu);
                ctx.Stroke();
                ctx.ClosePath();

            }

I když to při vysokých počtech bodů pro umístění (>500) trochu blbne, už je to mnohem lepší a použitelné. Děkuji za spolupráci :-)

 
Nahoru Odpovědět
10.12.2016 10:59
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 5 zpráv z 5.