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?
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
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
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)
{
}
}
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ć :] .
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
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
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
ale spoko, będę czytał i się uczył. Może z tym zdążę. Z góry dzięki za pomoc
Mimo wszystko GraphicsPatche są z 20 razy lepszym rozwiązaniem...
Ale co ja tam wiem.
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
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)
{
}
}
}
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ę
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.
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?
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