Ausschnitt vergrößern
-
Hallo liebe Community,
ich habe leider schon mehrere Bücher und das Inet durchforstet, komme aber leider nicht drauf. Ich zeichne eine zusammenhängende Linie auf einer Form und möchte nun diese per Ausschnitt, den ich mit der Maus auswähle, mir entweder in der Form oder in einer Picturebox vergrößert anzeigen lassen. Ich schaffe es nicht den gewählten Ausschnitt zu vergrößern. Hat mir vielleicht jemand eine Idee?
grüße seven
Hier zeichne ich den Kreis:
private void frmauswertung_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics dtb = e.Graphics; //löschen des gesamten Bereichs dtb.Clear(SystemColors.AppWorkspace); //Angabe von Skalierung und Form der Einheit dtb.PageUnit = GraphicsUnit.Pixel; dtb.PageScale = 1; //ergibt einfach schönere Bilder ;) dtb.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //Graphics Object ermitteln Graphics grfx = e.Graphics; grfx.Clear(System.Drawing.SystemColors.Control); //Rechteck mit einem Pixel Höhe und Breite zeichnen Pen pen = new Pen(Color.Red, 1); //zeichnet verbundene Linien pen.LineJoin = LineJoin.Round; //textbox zeilenweise in string schreiben Int32 zeilenanzahl = ergebnis_rundheit.Length; PointF[] punkte = new PointF[zeilenanzahl]; for (Int64 i = 0; i < zeilenanzahl; ++i) { //teilt den string in 2 strings [0] und [1] bei zeichen ',' auf sin_winkel = Math.Sin(winkel[i] * Math.PI / 180);//im bogenmaß cos_winkel = Math.Cos(winkel[i] * Math.PI / 180);//im bogenmaß y = sin_winkel * (radius + vergroesserung * ergebnis_rundheit[i]); x = cos_winkel * (radius + vergroesserung * ergebnis_rundheit[i]); if (winkel[i] >= 0.0 && winkel[i] <= 180.0) { y = 300 - Math.Abs(y); } else { if (winkel[i] > 180.0 && winkel[i] < 360.0) { y = 300 + Math.Abs(y); } } if (winkel[i] > 90.0 && winkel[i] < 270.0) { x = 300 - Math.Abs(x); } else { if (winkel[i] >= 270.0 || winkel[i] <= 90.0) { x = 300 + Math.Abs(x); } } punkte[i] = new PointF(Convert.ToInt16(x), Convert.ToInt16(y)); } grfx.DrawLines(pen, punkte); pen = new Pen(Color.Black, 1); float radius_max = (float)radius + ((float)vergroesserung * (float)max_pos_abw); float radius_min = (float)radius + ((float)vergroesserung * (float)max_neg_abw); grfx.DrawArc(pen, 300-radius_min, 300-radius_min, 2*radius_min, 2*radius_min, 0, 360); grfx.DrawArc(pen, 300-radius_max, 300-radius_max, 2*radius_max, 2*radius_max, 0, 360); pen.DashStyle = DashStyle.DashDot; grfx.DrawLine(pen, 20, 300, 600, 300); grfx.DrawLine(pen, 300, 20, 300, 600); if (bildausschnitt_waehlen) { pen = Pens.DeepSkyBlue; e.Graphics.DrawRectangle(pen, bildausschnitt); } }
-
Hi,
Du ziehst mit der Maus eine geschlossene Kurve, was hat der Code mit Deinem Problem zu tun?
Was genau wird da gezeichnet? Kreise? Warum von Hand und nicht mit dem was die Graphics-Klasse zur verfügung stellt?Wo ist der Code, indem die Kurve mit der Maus gezogen wird?
Dein Problem ist nicht schwer zu lösen. Für jemanden der Antworten will ist es nur sehr mühselig, weil man bei null anfangen müsste. Dein Code ist kein vollständiges Minimalbeispiel, das als Ausgangspunkt für eine Lösung dienen könnte.
Außerdem: Was genau möchtest Du in einer Detailansicht vergrößert darstellen? Ein Teil eines Bitmaps? Einer zuvor gezeichneten Vektorgrafik?
Allgemein: Finde das minimal umschließende Rechteck der Kurve die Du gezogen hast und zeichne den Teil in ein Bitmap, welche Du dann in einer Picturebox darstellst.
Kann Dir das programmieren, aber dafür bräuchte ich eine Ausgangsbasis ...
-
Ich habe bisher nicht viel in C# programmiert und wusste auch nicht genau wie ich beim Zeichnen vorgehen soll. Ich bekomme geometrische Abweichungen von einem Kreis, die ich mir umrechne und grafisch auf die Form male. Jetzt will ich ein "Zoom" modus einbauen der mir den gewählten Ausschnitt mit der Maus vergrößert darstellt. Das Problem ist ich wüsst nichtmal wie ich vorgehen soll. Mir dir Koordinaten umrechnen verschieben und skalieren oder den Ausschnitt in eine Bitmap speichern, dann müsste ich ja aber diese in eine Picturebox laden (eventuell verpixelt dies). Hier der gezeichnete Kreis und den Ausschnitt möchte ich jetzt vergrößert darstellen können.
http://rapidshare.com/share/4604334676C5D54B9A79036BC323A870
-
Ich habe es jetzt so gelöst:
private void frmauswertung_MouseUp(object sender, MouseEventArgs e) { Auswahl_Punkte = new PointF[punkte.Length]; int a = 0; if (e.Button == MouseButtons.Left && bildausschnitt_waehlen && bildausschnitt.Size != new Size()) { for(int i=0; i<punkte.Length; ++i) { if (punkte[i].X > bildausschnitt.X && punkte[i].X < e.X && punkte[i].Y > bildausschnitt.Y && punkte[i].Y < e.Y) { Auswahl_Punkte[a] = punkte[i]; ++a; } } for (int i = 0; i <= a; ++i) { Auswahl_Punkte[i].X -= bildausschnitt.X; Auswahl_Punkte[i].Y -= bildausschnitt.Y; Auswahl_Punkte[i].X *= 600 / bildausschnitt.Width; Auswahl_Punkte[i].Y *= 600 / bildausschnitt.Height; } this.Paint += new PaintEventHandler(this.auswahl_nachzeichnen_Paint); this.Invalidate(); } else bildausschnitt_waehlen = false; }
Berechne mir einfach meine neuen Punkte d.h. verschiebe es in mein Nullpunkt und Skaliere auf das "große" Fenster.
Danke trotzdem seven
-
Wie pervers muss man sein um ein Programm zu schreiben das Ausschnitte vergrößert
-
green_seven schrieb:
Ich habe es jetzt so gelöst:
Wenn Teil einer Vektorgrafik vergrößtert werden soll ist das Vorgehen natürlich sinnvoller als eine verpixelte Bitmap zu erstellen.
Bzw, das hier in deinem Eventhandler sieht schräg aus:
this.Paint += new PaintEventHandler(this.auswahl_nachzeichnen_Paint); this.Invalidate();
Denk dran, dass Events Multicastfähig sind und Du später mehr als einmal den Painteventhandler aufrufst. Es ist eigentlich "sicherer" Handler nur einmal zu abonnieren.
blurry333' schrieb:
Wie pervers muss man sein um ein Programm zu schreiben das Ausschnitte vergrößert
99,999% Männer hier