コード例 #1
0
        public Pravac(Tocka t1, Tocka t2)
        {
            T1 = t1;
            T2 = t2;
            if ((T2.t.X - T1.t.X) != 0)
            {
                koef_smjera = (float)(T2.t.Y - T1.t.Y) / (float)(T2.t.X - T1.t.X);
            }
            else
            {
                koef_smjera = 0;
            }

            if (T2.t.Y - T1.t.Y != 0)
            {
                koef_smjera_poY = (float)(T2.t.X - T1.t.X) / (T2.t.Y - T1.t.Y);
            }
            else
            {
                koef_smjera_poY = 0;
            }

            sin = ((t2.t.Y - t1.t.Y) * (t2.t.Y - t1.t.Y)) / (t1.Distanca(t2) * t1.Distanca(t2));
            cos = ((t2.t.X - t1.t.X) * (t2.t.X - t1.t.X)) / (t1.Distanca(t2) * t1.Distanca(t2));
        }
コード例 #2
0
        private void button5_Click_2(object sender, EventArgs e)
        {
            Pen    blackPen = new Pen(Color.Black);
            Pravac test1    = new Pravac(new Tocka(new Point(200, 100)), new Tocka(new Point(300, 150)));
            Pravac test2    = new Pravac(new Tocka(new Point(200, 200)), new Tocka(new Point(350, 50)));
            Pravac test3    = new Pravac(test2, new Tocka(new Point(100, 50)));

            Tocka sjec = test3.sjeciste_pravaca(test2);

            sjec.Draw(drawArea, blackPen);

            //Tocka z = test1.sjeciste_pravaca(test2);

            //test1.Draw(drawArea, blackPen);
            //test2.Draw(drawArea, blackPen);
            //test3.Draw(drawArea, blackPen);
            //test3.T1.Draw(drawArea, blackPen);
            Tocka testna = new Tocka(new Point((int)Math.Round(test3.T1.t.X + Math.Sqrt(test3.cos * 10000)), (int)Math.Round(test3.T1.t.Y + Math.Sqrt(test3.sin * 10000))));

            MessageBox.Show(test3.T1.Distanca(testna).ToString());


            //testna.DrawZuto(drawArea, blackPen);

            //z.Draw(drawArea, blackPen);
        }
コード例 #3
0
 public Pravac(Pravac p, Tocka toc)
 {
     koef_smjera     = -1 / p.koef_smjera;
     koef_smjera_poY = -1 / p.koef_smjera_poY;
     T1  = toc;
     T2  = new Tocka(new Point(T1.t.X + 1000, (int)(this.IzracunajYza(T1.t.X + 1000))));
     sin = ((T2.t.Y - T1.t.Y) * (T2.t.Y - T1.t.Y)) / (T1.Distanca(T2) * T1.Distanca(T2));
     cos = ((T2.t.X - T1.t.X) * (T2.t.X - T1.t.X)) / (T1.Distanca(T2) * T1.Distanca(T2));
 }
コード例 #4
0
        public float Distanca(Tocka X)
        {
            double razlika_X = (X.t.X - t.X) * (X.t.X - t.X);
            double razlika_y = (X.t.Y - t.Y) * (X.t.Y - t.Y);
            double razlika   = razlika_X + razlika_y;

            double rez = Math.Sqrt(razlika);

            return((float)rez);
        }
コード例 #5
0
        float Prosjecni_Kosi_Y(List <Pravac> lst, int x, Tocka poc, Pravac kosi, Tocka rubA, Tocka krajB)
        {
            float rjesenje = 0;
            int   koliko   = 0;

            x += poc.t.X;


            foreach (Pravac pravac in lst)
            {
                if (pravac.T1.x <= x && x <= pravac.T2.x)
                {
                }
            }



            return(rjesenje);
        }
コード例 #6
0
        //metoda ima problem kad je pravac vertikalan , JEDNA solucija je da se sustav postavi po tom pravcu u horizontalnom polozaju
        //                                              DRUGA solucija je da se izgradi funkcija koja bi vracala (X,Y) u odnosu na pravac (s obzirom na kut--->omjer)
        float Prosjecni_Y(List <Pravac> lst, int x, Tocka poc)
        {
            float rjesenje = 0;
            int   koliko   = 0;

            x += poc.t.X;

            foreach (Pravac pravac in lst)
            {
                //ovaj uvjet je blesav kad je pravac vertikalan
                if (pravac.T1.x <= x && x <= pravac.T2.x)
                {
                    rjesenje += pravac.IzracunajYza(x);
                    koliko++;
                }
            }

            rjesenje = (int)rjesenje / koliko;
            return(rjesenje);
        }
コード例 #7
0
        public Tocka sjeciste_pravaca(Pravac p)
        {
            double[] prva_jednadzba   = this.Segmentni_oblik();
            double[] druga_jednandzba = p.Segmentni_oblik();

            double[] temp = new double[3];

            double Ykvota_prve  = prva_jednadzba[0];
            double Ykvota_druge = druga_jednandzba[0];

            for (int i = 0; i < 3; i++)
            {
                prva_jednadzba[i]   *= Ykvota_druge;
                druga_jednandzba[i] *= Ykvota_prve;
            }

            if (prva_jednadzba[0] == druga_jednandzba[0])
            {
                for (int i = 0; i < 3; i++)
                {
                    druga_jednandzba[i] *= -1;
                }
            }

            for (int i = 0; i < 3; i++)
            {
                prva_jednadzba[i] += druga_jednandzba[i];
            }



            double X = -prva_jednadzba[2] / prva_jednadzba[1];
            double Y = -(druga_jednandzba[1] * X + druga_jednandzba[2]) / druga_jednandzba[0];

            Tocka sjec = new Tocka(new Point((int)Math.Round(X), (int)Math.Round(Y)));

            return(sjec);
        }
コード例 #8
0
        public List <Tocka> Rjesi(List <Tocka> put, List <Tocka> niz_Tocaka)
        {
            int   pozicija = 0;
            Tocka min      = niz_Tocaka[0];
            float mini     = 2000;
            Tocka A        = null;
            Tocka B        = null;

            //petlja provjerava svaku dionicu sadasnjeg puta
            for (int j = 0; j < put.Count - 1; j++)
            {
                A = put[j];
                B = put[j + 1];
                Pravac p = new Pravac(A, B);
                lista_crta.Add(p);

                for (int i = 0; i < niz_Tocaka.Count(); i++)
                {
                    lista_crta.Add(new Pravac(A, niz_Tocaka[i]));
                    lista_crta.Add(new Pravac(niz_Tocaka[i], B));
                }


                //slaže se niz točaka prosjecne_krivulje (izbiveni_vektor)
                int     udaljenost_AB = Math.Abs(B.t.X - A.t.X);
                Tocka[] niz_tocaka_izbivenog_vektora = new Tocka[udaljenost_AB];


                for (int i = 0; i < udaljenost_AB; i++)
                {
                    niz_tocaka_izbivenog_vektora[i] = new Tocka(new Point(A.t.X + i, (int)Prosjecni_Y(lista_crta, i, A)));
                }
                //----


                //provjerava koja je tocka najblize izbivenom vektoru (krivulji)
                foreach (Tocka t in niz_Tocaka)
                {
                    foreach (Tocka s in niz_tocaka_izbivenog_vektora)
                    {
                        if (s.Distanca(t) < mini)
                        {
                            mini     = s.Distanca(t);
                            min      = t;
                            pozicija = j + 1;
                        }
                    }
                }
            }


            //nasa je tocku , gleda ima li boljeg pravca za nju

            float min_produzetak = put[pozicija - 1].Distanca(min) + put[pozicija].Distanca(min) - put[pozicija - 1].Distanca(put[pozicija]);

            for (int h = 1; h < put.Count - 1; h++)
            {
                float produzetak = put[h - 1].Distanca(min) + put[h].Distanca(min) - put[h - 1].Distanca(put[h]);
                if (produzetak < min_produzetak)
                {
                    min_produzetak = produzetak;
                    pozicija       = h;
                }
            }

            //zavrsi posao
            list_Tocaka.Remove(min);
            put.Insert(pozicija, min);

            return(put);
        }
コード例 #9
0
        private void button7_Click(object sender, EventArgs e)
        {
            Pen    blackPen = new Pen(Color.Black);
            Pravac p        = new Pravac(AA, BB);

            AA.Draw(drawArea, blackPen);
            BB.Draw(drawArea, blackPen);
            p.Draw(drawArea, blackPen);


            Pravac ort = new Pravac(p, BB);

            Tocka OB = new Tocka(new Point((int)ort.IzracunajXza(AA.t.Y), AA.t.Y));

            OB.Draw(drawArea, blackPen);


            int udaljenost_AB       = BB.t.X - AA.t.X;
            int udaljenost_na_X_osi = OB.t.X - AA.t.X;

            float korak            = (float)udaljenost_na_X_osi / (float)udaljenost_AB;
            int   broj_ponavljanja = (int)(Math.Round(udaljenost_na_X_osi / korak));

            //skenopostav

            lista_crta.Clear();

            drawArea.Clear(Color.White);
            Random r = new Random();



            niz_Tocaka = new Tocka[10];
            lista_crta.Add(p);
            for (int i = 0; i < 10; i++)
            {
                niz_Tocaka[i] = new Tocka(new Point(r.Next(50, 400), r.Next(0, 260)));
                lista_crta.Add(new Pravac(AA, niz_Tocaka[i]));
                lista_crta.Add(new Pravac(niz_Tocaka[i], BB));
                niz_Tocaka[i].Draw(drawArea, blackPen);
            }

            foreach (Pravac prav in lista_crta)
            {
                prav.Draw(drawArea, blackPen);
            }



            Tocka[] niz_tocaka_izbivenog_vektora = new Tocka[udaljenost_AB];



            float X_os = AA.t.X;

            for (int i = 0; i < udaljenost_AB; i++)
            {
                float finalna_udaljenost = 0;
                bool  unutra;
                int   koliko = 0;
                X_os += korak;
                Pravac ort_virtualna  = new Pravac(p, new Tocka(new Point((int)Math.Round(X_os), AA.t.Y)));
                Tocka  sjec_na_kosini = ort_virtualna.sjeciste_pravaca(p);



                foreach (Pravac virt_prav in lista_crta)
                {
                    unutra = false;

                    Tocka virt_sjeciste = ort_virtualna.sjeciste_pravaca(virt_prav);

                    Pravac gran_ort_a = new Pravac(p, virt_prav.T1);
                    Pravac gran_ort_b = new Pravac(p, virt_prav.T2);

                    float granica_A_vrijednost = gran_ort_a.IzracunajXza(virt_sjeciste.t.Y);
                    float granica_B_vrijednost = gran_ort_b.IzracunajXza(virt_sjeciste.t.Y);



                    if (virt_sjeciste.t.X > granica_A_vrijednost && virt_sjeciste.t.X <= granica_B_vrijednost)
                    {
                        unutra = true;
                    }

                    if (unutra)
                    {
                        koliko++;
                        if (virt_sjeciste.t.X < sjec_na_kosini.t.X)
                        {
                            finalna_udaljenost += sjec_na_kosini.Distanca(virt_sjeciste);
                        }
                        else
                        {
                            finalna_udaljenost -= sjec_na_kosini.Distanca(virt_sjeciste);
                        }
                    }
                }
                if (koliko != 11)
                {
                    MessageBox.Show(koliko.ToString());
                }
                finalna_udaljenost = finalna_udaljenost / koliko;



                double finalni_X;
                double finalni_Y;
                if (finalna_udaljenost > 0)
                {
                    finalna_udaljenost *= finalna_udaljenost;
                    //Math.Round(test3.T1.t.X+Math.Sqrt(test3.cos*10000)),(int)Math.Round(test3.T1.t.Y+Math.Sqrt(test3.sin*10000)))
                    finalni_X = sjec_na_kosini.t.X - Math.Sqrt(ort_virtualna.cos * finalna_udaljenost);
                    finalni_Y = sjec_na_kosini.t.Y - Math.Sqrt(ort_virtualna.sin * finalna_udaljenost);
                }
                else
                {
                    finalna_udaljenost *= finalna_udaljenost;
                    finalni_X           = sjec_na_kosini.t.X + Math.Sqrt(ort_virtualna.cos * finalna_udaljenost);
                    finalni_Y           = sjec_na_kosini.t.Y + Math.Sqrt(ort_virtualna.sin * finalna_udaljenost);
                }

                niz_tocaka_izbivenog_vektora[i] = new Tocka(new Point((int)Math.Round(finalni_X), (int)Math.Round(finalni_Y)));
            }

            Tocka min  = niz_Tocaka[0];
            float mini = 200;


            foreach (Tocka t in niz_Tocaka)
            {
                foreach (Tocka s in niz_tocaka_izbivenog_vektora)
                {
                    if (s.Distanca(t) < mini)
                    {
                        mini = s.Distanca(t);
                        min  = t;
                    }
                }
            }
            min.DrawZuto(drawArea, blackPen);

            foreach (Tocka t in niz_tocaka_izbivenog_vektora)
            {
                t.DrawManje(drawArea, blackPen);
            }
        }
コード例 #10
0
        public void button1_Click(object sender, EventArgs e)
        {
            lista_crta.Clear();

            drawArea.Clear(Color.White);
            Random r = new Random();


            Pen blackPen = new Pen(Color.Black);

            Tocka[] niz_Tocaka = new Tocka[5];



            AA.Draw(drawArea, blackPen);
            BB.Draw(drawArea, blackPen);

            Pravac p = new Pravac(AA, BB);

            lista_crta.Add(p);

            for (int i = 0; i < 5; i++)
            {
                niz_Tocaka[i] = new Tocka(new Point(r.Next(50, 600), r.Next(0, 260)));
                lista_crta.Add(new Pravac(AA, niz_Tocaka[i]));
                lista_crta.Add(new Pravac(niz_Tocaka[i], BB));
                niz_Tocaka[i].Draw(drawArea, blackPen);
            }

            foreach (Pravac prav in lista_crta)
            {
                prav.Draw(drawArea, blackPen);
            }


            int udaljenost_AB = BB.t.X - AA.t.X;

            Tocka[] niz_tocaka_izbivenog_vektora = new Tocka[udaljenost_AB];


            for (int i = 0; i < udaljenost_AB; i++)
            {
                niz_tocaka_izbivenog_vektora[i] = new Tocka(new Point(AA.t.X + i, (int)Prosjecni_Y(lista_crta, i, AA)));
            }

            Tocka min  = niz_Tocaka[0];
            float mini = 200;


            foreach (Tocka t in niz_Tocaka)
            {
                foreach (Tocka s in niz_tocaka_izbivenog_vektora)
                {
                    if (s.Distanca(t) < mini)
                    {
                        mini = s.Distanca(t);
                        min  = t;
                    }
                }
            }
            min.DrawZuto(drawArea, blackPen);

            foreach (Tocka t in niz_tocaka_izbivenog_vektora)
            {
                t.DrawManje(drawArea, blackPen);
            }
        }