Program "Mapa"

0

Witam mam problem wielki. Mam za zadanie napisać aplikację. Zasada działania wyglądałaby mniej więcej tak: aplikacja wczytuje dane z pliku (współrzędne geograficzne), wyrysowuje je - czyli przykładowo pokazuje nam linię brzegową Polski. Do tego w aplikacji mamy np 3 przyciski odpowiedzialne za: skalowanie, obrót oraz przesuwanie. Bo muszą być pokazane przekształcenia geometryczne. Czy opisywaną tu aplikacją byłaby powiedzmy taka prosta mapka elektroniczna. Do tego funkcja "zapisz". I jeszcze najlepiej gdyby było to z wykorzystaniem układu UTM. A ja jestem noga w sprawach programowania i <ort>niedam </ort>rady tego zrobić. Pomoże ktoś? Najprościej chyba użyć windows form application ale ja sie na tym ort!. Jakieś rady?

0

uzyj WPF i skalowanie, obrot sa wlasciwie za darmo, pewnie przesuwanie bedzie malym nakladem kosztow

nie masz co liczyc ze ktos to zrobi za ciebie

0

Hm, jak to jest możliwe że bez wcześniejszej nauki i zaznajomienia z .Net, ni stąd i zowąd rzucają w biednych ludzi takimi trudnymi projektami...

Wydaje mi się że ktoś tu sobie olał coś :) Teraz najprawdopodobniej trzeba będzie zapłacić komuś aby udostępnił swojej głowy i wiedzy potrzebnej do napisania aplikacji.

Oczywiście możesz także zabrać się za jakaś książkę z podstawami języka, potem sięgnąć po jakieś bardziej specyficzne artykuły, ale to niestety będzie wymagać czasu

0

to moze ktos pomoze w inny sposob: ponizej przedstawiony algorytm rysuje wczytane wspolrzedne z pliku. tyle umiem. wspolrzedne sa wyrysowane wzdledem wymiarow okna. i jak teraz zastosowac transformacje geometryczne do obrazu ktory sie wyswietlil? tworzone jest w windows form aplication. tworze przyciski i co dalej? jakiego kodu uzyc, algorytmu. program wczytuje dane z pliku ...*mif. A w ramach scislosci to jestem na nawigacji i interesuja mnie inne rzeczy - a mam jeden przedmiot informatyczny programowania i niestety nie umiem tego. a w krotkim czasie jest niemozliwe zeby sie tego nauczyc - ale doktorek nie rozumie tego. :P

public partial class Form1 : Form
    {
        #region Elementy,obiekty i zmienne
        ArrayList lista1 = new ArrayList();
        ArrayList lista2 = new ArrayList();
        Stopwatch stopWatch = new Stopwatch();
        
        double FiMAX, FiMIN, LambdaMAX, LambdaMIN, roznicaFI, roznicaLAMBDA;
        double dlugosc, szerokosc;
        string[] pozycje;
        string[] Tablicaoperacji;
        int jeden, dwa;//, mod;
        Point punkt1= new Point(0,0) , punkt2;
        #endregion
        public Form1()
        {
            InitializeComponent();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {        
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            openFileDialog1.ShowDialog();
        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            stopWatch.Start();
            string sciezka = openFileDialog1.FileName;
            StreamReader wczytaj = new StreamReader(sciezka);
            string linia = "";
            string[] tablica;
            while (linia != null)
            {
                linia = wczytaj.ReadLine();
                if (linia != null)
                {
                    if (linia.IndexOf('R') == 0 || linia.IndexOf('P') == 0)
                    {
                        listBox1.Items.Add(linia);
                    }
                    if (linia.IndexOf('P') == 0 || linia.IndexOf(' ') == 0 || linia.IndexOf('R') == 0 || linia.CompareTo("") == 0)
                    {
                        //pomija linijki zaczynające sie znakami
                    }
                    else
                    {
                        linia = linia.Replace('.', ',');
                        tablica = linia.Split(' ');
                        lista1.Add(tablica[0]);
                        lista2.Add(tablica[1]);
                        listBox2.Items.Add(linia);
                    }
                }
            }
            lista1.Sort();
            lista2.Sort();
            label1.Text = "FiMIN = " + lista1[0] + Environment.NewLine + "LambdaMIN = " + lista2[0];
            FiMIN = Convert.ToDouble(lista1[0]);
            LambdaMIN = Convert.ToDouble(lista2[0]);
            lista1.Reverse();
            lista2.Reverse();
            label2.Text = "FiMax = " + lista1[0] + Environment.NewLine + "LambdaMax = " + lista2[0];
            FiMAX = Convert.ToDouble(lista1[0]);
            LambdaMAX = Convert.ToDouble(lista2[0]);
            roznicaFI = FiMAX - FiMIN;
            roznicaLAMBDA = LambdaMAX - LambdaMIN;
            obliczenia();
        }
        void obliczenia()
        {
            //grafika
            Graphics p = pictureBox1.CreateGraphics();
            Pen pioro = new Pen(Color.Green);
            p.Clear(Color.Empty);
            Font f = new Font("Arial", 10, FontStyle.Bold);
            SolidBrush pedzel = new SolidBrush(Color.Red);
            
            
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                listBox1.SelectedIndex = i;
                Tablicaoperacji = listBox1.Text.Split(' ');
                if (Tablicaoperacji[0] == "Region")
                {
                    for (int j = 0; j < Convert.ToInt16(Tablicaoperacji[1]); j++)
                    {
                        listBox2.SelectedIndex = 0;
                        pozycje = listBox2.Text.Split(' ');
                        pozycje[0].Replace('.', ',');
                        pozycje[1].Replace('.', ',');
                        dlugosc = Convert.ToDouble(pozycje[0]);
                        szerokosc = Convert.ToDouble(pozycje[1]);
                        dlugosc = FiMAX - dlugosc;
                        szerokosc = LambdaMAX - szerokosc;
                        dlugosc = Math.Round((dlugosc * pictureBox1.Width) / roznicaFI);
                        szerokosc = Math.Round((szerokosc * pictureBox1.Height) / roznicaLAMBDA);
                        jeden = pictureBox1.Width - Convert.ToInt16(dlugosc);
                        dwa = pictureBox1.Height - Convert.ToInt16(szerokosc);
                        p.DrawString("*", f, pedzel, jeden, dwa);
                        listBox2.Items.RemoveAt(listBox2.SelectedIndex);

                    }
                }
               
                if (Tablicaoperacji[0] == "Pline")
                {
                    punkt1 = new Point(0, 0);
                    punkt2 = new Point(0,0);
                    for (int j = 0; j < Convert.ToInt16(Tablicaoperacji[1]); j++)
                    {
                        punkt1 = punkt2;
                        listBox2.SelectedIndex = 0;
                        pozycje = listBox2.Text.Split(' ');
                        pozycje[0].Replace('.', ',');
                        pozycje[1].Replace('.', ',');
                        dlugosc = Convert.ToDouble(pozycje[0]);
                        szerokosc = Convert.ToDouble(pozycje[1]);
                        dlugosc = FiMAX - dlugosc;
                        szerokosc = LambdaMAX - szerokosc;
                        dlugosc = Math.Round((dlugosc * pictureBox1.Width) / roznicaFI);
                        szerokosc = Math.Round((szerokosc * pictureBox1.Height) / roznicaLAMBDA);
                        jeden = pictureBox1.Width - Convert.ToInt16(dlugosc);
                        dwa = pictureBox1.Height - Convert.ToInt16(szerokosc);
                        p.DrawString("*", f, pedzel, jeden, dwa);
                        listBox2.Items.RemoveAt(listBox2.SelectedIndex);
                        if (punkt1.X ==0 && punkt1.Y ==0)
                        {
                            punkt1 = new Point(jeden, dwa);
                        }
                        punkt2 = new Point(jeden,dwa);
                        p.DrawLine(pioro, punkt1,punkt2);
                    }
                
                }

            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string czas1 = ts.Seconds.ToString();
            string czas2 = ts.Milliseconds.ToString();
            label4.Text = czas1 + " Sekund  " + czas2 + " milisekund" ;
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }
    }
1

Wrzucaj kody w tagi < code=csharp> i < /code>.

Proponuje zamiast wczytywać wszystko do linii to spróbować z tego zrobić Graphics Patche i je skalować/obracać - to powinno być znacznie prostsze, a skoro są prawie gotowe rozwiązania to należy ich używać :] .

0

tylko czy można by prosić jakaś instrukcje albo cos gdzie to, jak i z czym się to je? bo ja to zupełnie zielony w tych sprawach

0

Graphics http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx
tworzysz obrazek i do niego obiekt typu graphics, ktory udostepnia rozne metody do rysowania
lub przeciazasz OnPaint formy czy jakiejs swojej kontrolki i w tedy w event args tego zdarzenia masz juz stworzony obiekt graphics i jego uzywasz do rysowania

0

massther - ja się na tym nie znam bo dopiero zaczynam w tym wszystkim, i w tej dziedzinie jestem głupi - nie wiem nawet po co mi programowanie w życiu jeżeli mam nawigować okrętem, ale z tego co wkleiłeś linka wychodzi żebym wczytał obrazek i wtedy jakimiś tam metodami się nim bawił - a chodzi o to ze ja już wygenerowałem sobie współrzędne - połączone zostały linią, i to właśnie co wygenerowałem chce poddać transformacjom. tylko jak się do tego odnieść? najlepiej żeby to wytłumaczyć w sposób "dla debila" :P

0

ale spoko, będę czytał i się uczył. Może z tym zdążę. Z góry dzięki za pomoc

1

Mimo wszystko GraphicsPatche są z 20 razy lepszym rozwiązaniem...

Ale co ja tam wiem.

0

moglby ktos to przeanalizowac co tu djyellaa napisal? bo ja mam bardzo podobny problem tylko ze wczytuje obrazek, i tez musze takie transformacje geometryczne zrobic. ale niewiem gdzie i jak bo sie na tym nieznam. nie rozumiem czemu wymagaja informatyki na kierunkach z nia nie zwiazanych gdzie jest ona niepotrzebna

0

a tutaj troche poprawilem wczesniejszy kod i juz w miare ok chyba jest. tylko dalej niewiem jak zastosowac te transformacje geometryczne, czyli skaowanie, przesuwanie, i obrot. moze dac ktos jakies tresciwe informacje?

public partial class Form1 : Form
    {
        #region Elementy,obiekty i zmienne
        ArrayList lista1 = new ArrayList();
        ArrayList lista2 = new ArrayList();
        Stopwatch stopWatch = new Stopwatch();
        
        double FiMAX, FiMIN, LambdaMAX, LambdaMIN, roznicaFI, roznicaLAMBDA;
        double dlugosc, szerokosc;
        string[] pozycje;
        string[] Tablicaoperacji;
        int jeden, dwa;//, mod;
        
        Point punkt1= new Point(0,0) , punkt2,punkt3,punkt4;
        #endregion
        public Form1()
        {
            InitializeComponent();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {        
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            openFileDialog1.ShowDialog();
        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            stopWatch.Start();
            string sciezka = openFileDialog1.FileName;
            StreamReader wczytaj = new StreamReader(sciezka);
            string linia = "";
            string[] tablica;
            while (linia != null)
            {
                linia = wczytaj.ReadLine();
                if (linia != null)
                {
                    if (linia.IndexOf('R') == 0 || linia.IndexOf('P') == 0)
                    {
                        listBox1.Items.Add(linia);
                    }
                    if (linia.IndexOf('P') == 0 || linia.IndexOf(' ') == 0 || linia.IndexOf('R') == 0 || linia.CompareTo("") == 0)
                    {
                        //pomija linijki zaczynające sie znakami
                    }
                    else
                    {
                        linia = linia.Replace('.', ',');
                        tablica = linia.Split(' ');
                        lista1.Add(tablica[0]);
                        lista2.Add(tablica[1]);
                        listBox2.Items.Add(linia);
                    }
                }
            }
            lista1.Sort();
            lista2.Sort();
            label1.Text = "FiMIN = " + lista1[0] + Environment.NewLine + "LambdaMIN = " + lista2[0];
            FiMIN = Convert.ToDouble(lista1[0]);
            LambdaMIN = Convert.ToDouble(lista2[0]);
            lista1.Reverse();
            lista2.Reverse();
            label2.Text = "FiMax = " + lista1[0] + Environment.NewLine + "LambdaMax = " + lista2[0];
            FiMAX = Convert.ToDouble(lista1[0]);
            LambdaMAX = Convert.ToDouble(lista2[0]);
            roznicaFI = FiMAX - FiMIN;
            roznicaLAMBDA = LambdaMAX - LambdaMIN;
            obliczenia();
        }
        void obliczenia()
        {
            //grafika
            Graphics p = pictureBox1.CreateGraphics();
            Pen pioro = new Pen(Color.Green);
            //p.Clear(Color.Empty);
            Font f = new Font("Arial", 10, FontStyle.Bold);
            SolidBrush pedzel = new SolidBrush(Color.Red);
            int liczenie1 = 0;// liczenie2 = 0;
            
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                listBox1.SelectedIndex = i;
                Tablicaoperacji = listBox1.Text.Split(' ');
                if (Tablicaoperacji[0] == "Region")
                {
                    punkt3 = new Point(0, 0);
                    punkt4 = new Point(0, 0);
                    for (int j = 0; j < Convert.ToInt16(Tablicaoperacji[1]); j++)
                    {
                        
                        punkt3 = punkt4;
                        listBox2.SelectedIndex = liczenie1;
                        liczenie1++;
                        pozycje = listBox2.Text.Split(' ');
                        pozycje[0].Replace('.', ',');
                        pozycje[1].Replace('.', ',');
                        dlugosc = Convert.ToDouble(pozycje[0]);
                        szerokosc = Convert.ToDouble(pozycje[1]);
                        dlugosc = FiMAX - dlugosc;
                        szerokosc = LambdaMAX - szerokosc;
                        dlugosc = Math.Round((dlugosc * pictureBox1.Width) / roznicaFI);
                        szerokosc = Math.Round((szerokosc * pictureBox1.Height) / roznicaLAMBDA);
                        jeden = pictureBox1.Width - Convert.ToInt16(dlugosc);
                        dwa = pictureBox1.Height - Convert.ToInt16(szerokosc);
                        //listBox2.Items.RemoveAt(listBox2.SelectedIndex);
                        if (punkt3.X == 0 && punkt3.Y == 0)
                        {
                            punkt3 = new Point(jeden, dwa);
                        }
                        punkt4 = new Point(jeden, dwa);
                        p.DrawLine(pioro, punkt3, punkt4);
                    }
                }
               
                if (Tablicaoperacji[0] == "Pline")
                {
                    punkt1 = new Point(0, 0);
                    punkt2 = new Point(0,0);
                    for (int j = 0; j < Convert.ToInt16(Tablicaoperacji[1]); j++)
                    {
                        
                        punkt1 = punkt2;
                        listBox2.SelectedIndex = liczenie1;
                        liczenie1++;
                        pozycje = listBox2.Text.Split(' ');
                        pozycje[0].Replace('.', ',');
                        pozycje[1].Replace('.', ',');
                        dlugosc = Convert.ToDouble(pozycje[0]);
                        szerokosc = Convert.ToDouble(pozycje[1]);
                        dlugosc = FiMAX - dlugosc;
                        szerokosc = LambdaMAX - szerokosc;
                        dlugosc = Math.Round((dlugosc * pictureBox1.Width) / roznicaFI);
                        szerokosc = Math.Round((szerokosc * pictureBox1.Height) / roznicaLAMBDA);
                        jeden = pictureBox1.Width - Convert.ToInt16(dlugosc);
                        dwa = pictureBox1.Height - Convert.ToInt16(szerokosc);
                        //p.DrawString("*", f, pedzel, jeden, dwa);
                        //listBox2.Items.RemoveAt(listBox2.SelectedIndex);
                        if (punkt1.X ==0 && punkt1.Y ==0)
                        {
                            punkt1 = new Point(jeden, dwa);
                        }
                        punkt2 = new Point(jeden,dwa);
                        p.DrawLine(pioro, punkt1,punkt2);
                    }
                
                }

            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string czas1 = ts.Seconds.ToString();
            string czas2 = ts.Milliseconds.ToString();
            label4.Text = czas1 + " Sekund  " + czas2 + " milisekund" ;
        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            obliczenia();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
0

Mógłby ktoś dać jakiegoś linka albo napisać instrukcje jak przedstawić te przekształcenia geometryczne? jak je zastosować do wygenerowanego obrazu. Czyli skalowanie, obracanie i przesuwanie. pomóżcie proszę

0

A pomogłoby Ci jak powiem, że na obiekcie Graphics możesz wykonać parę funkcji, które wszystko co będzie rysowane przeskalują lub obrócą?

.TranslateTransform(x, y) - przesuwa początek układu współrzędnych o x i y.

.RotateTransform(a) - obraca to, co będzie rysowane o kąt a.

.ScaleTransform(x, y) - skaluje to, co będzie rysowane o x i y.

.ResetTransform() - Zresetowanie wszystkich przekształceń.

Kolejność wykonywania przekształceń ma znaczenie.

0

Naprawdę, super mi pomogło. Teraz jeszcze będę się zastanawiać gdzie i jak to zastosować. bo mówię, ja dopiero zaczynam się w to bawić - bo muszę - i jestem pro debilem w tych sprawach. a jakoś trzeba zaliczyć. Jeszcze tylko pytanie, dlaczego kolejność przekształceń ma znaczenie. Do czego się to ma odnosić. Matematycznie, jeżeli takie któraś z tych funkcji jest obliczana (macierzowo) to tylko kolejność obliczeń jest ważna, i to tez nie zawsze. chce obrócić, to obracam, a jeżeli chce to wcześniej mogę przecież sobie przeskalować. Czy nie?

0

jednak nie pomogło bo debilem jestem i nie wiem jak to zrobić. Pomoże ktoś w skończeniu tej aplikacji? oczywiście się odwdzięczę. kwota do negocjacji GG -

//q: usunąłem numer GG żeby dalsze spamboty nie podłapały, czasu na oferty ludzie juz mieli sporo

1 użytkowników online, w tym zalogowanych: 0, gości: 1