| |
VB.NET - Ein- und UmsteigerDreieck zeichnen | | | Autor: Brauner | Datum: 23.11.12 12:19 |
| Hallo,
wie bekomme ich das hin, das z.Bsp. der Wert summe
aus dem Prog. als ein Punkt(hier x) in der Picturebox dargestellt wird ?
summe ist hier jetzt 0. Wie muß ich denn das Argument richtig übergeben?
Besten Dank. mfg brauner
Imports System.IO
Imports System.Drawing.Drawing2D
Public Class Form1
Public seitea, seiteb, seitec As Double
Public summe As Single
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
seitea = Val(TextBox1.Text)
seiteb = Val(TextBox2.Text)
seitec = Val(TextBox3.Text)
Call dreieck(seitea, seiteb, seitec)
End Sub
Function dreieck(ByVal seitea As Double, ByVal seiteb As Double, ByVal _
seitec As Double) As Double
summe = (seitea + seiteb + seitec) / 2
TextBox4.Text = Math.Round(summe, 3)
Return seitea
End Function
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Dim g As Graphics = e.Graphics
PictureBox1.BackColor = Color.Yellow
g.DrawLine(Pens.Black, 100, 100, 200, 200)
g.DrawLine(Pens.Black, summe, 100, 200, 200)
End Sub
End Class | |
Re: Dreieck zeichnen | | | Autor: Manfred X | Datum: 23.11.12 14:33 |
| Hallo!
Was genau ist die Frage?
Erforderliche Arbeitsschritte:
Zunächst mußt Du sicherstellen, dass in den Textboxen
numerische Werte (positiv?) stehen (Double.Tryparse-Methode)
Im nächsten Schritt mußt Du aus den gegebenen Längen-Verhältnissen
die Winkel des Dreiecks bestimmen (Anwendung der Trigonometrie).
Dann legst Du die Position von zwei Dreiecks-Ecken in der Picturebox fest
(Länge einer Seite) und bestimmst die relative Position der dritten Ecke
aus den Winkeln.
Diese Positionen verwendest Du nun, um die drei Linien zwischen diesen
Punkten zu zeichnen (z.B. Polygon).
MfG
Manfred
Beitrag wurde zuletzt am 23.11.12 um 14:37:30 editiert. | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 23.11.12 17:51 |
| Hallo Manfred,
das ist soweit verstanden.
Aber wenn ich den Button betätige,
wird der berechnete Wert Summe nicht wirklich im paint ereignis übernommen. Der ist immer null.
mfg brauner | |
Re: Dreieck zeichnen | | | Autor: Manfred X | Datum: 23.11.12 18:28 |
| Probier mal so!
Du mußt das Neuzeichnen anfordern (Invalidate).
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnDraw.Click
seitea = Val(textbox1.Text)
seiteb = Val(textbox2.Text)
seitec = Val(textbox3.Text)
Call dreieck(seitea, seiteb, seitec)
Picturebox1.Invalidate()
End Sub
Sub dreieck(ByVal seitea As Double, ByVal seiteb As Double, ByVal _
seitec As Double)
summe = CSng((seitea + seiteb + seitec) / 2)
TextBox4.Text = Math.Round(summe, 3)
Return
End Sub
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Dim g As Graphics = e.Graphics
g.Clear(Color.Yellow)
g.DrawLine(Pens.Black, 100, 100, 200, 200)
g.DrawLine(Pens.Black, CInt(summe), 100, 200, 200)
End Sub
Beitrag wurde zuletzt am 23.11.12 um 18:30:52 editiert. | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 23.11.12 19:23 |
| Hallo, Manfred,
so klappt es. Danke !
mfg brauner | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 08.12.12 14:10 |
| Hallo, Manfred,
was kann ich machen,
wenn die Linie länger ist wie die Picturebox breit,
dann wird das Dreieck nicht wirklich richtig angezeigt.
Muß ich das umrechnen, millimeter in pixel o.ä.
danke.
brauner | |
Re: Dreieck zeichnen | | | Autor: Manfred X | Datum: 08.12.12 17:16 |
| Hallo!
Was bedeutet: "Nicht wirklich richtig"?
Du hast verschiedene Optionen für diesen Fall:
1. Das Dreieck wird unvollständig angezeigt
2. Alle Pixelpositionen der Bildpunkte werden so
auf eine Skala umgerechnet, dass sie in die vorhandene
Breite/Höhe der Picturebox passen
-- die Zeichnung wird kleiner und weniger genau.
3. Du zeichnest in eine Bitmap, die die erforderliche Größe
besitzt, um alle Zeichnungselemente vollständig einzutragen
und weist diese Bitmap auf die Image-Eigenschaft der Picturebox zu
(Anzeigemodus / Sizemode wählbar).
MfG
Manfred | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 09.12.12 09:41 |
| Guten Morgen.
Ich meine das so:
Wenn ich eine Seitenlänge in die textbox eingebe,
z.Bsp. 1200 mm, dann die Breite der picturebox nicht ausreicht,
die Länge anzuzeigen.
"in eine bitmap zeichnen ... "
Wird dann die o.a, Linie "eingepasst" ?
oder muß ich das umrechnen?
mfg brauner | |
Re: Dreieck zeichnen | | | Autor: Manfred X | Datum: 09.12.12 16:56 |
| Hallo!
Ohne genauere Angaben, was Du erreichen willst, ist es kaum
möglich, Dir gezielte Hinweise zu geben.
Gibt es z.B. ein festes Koordinatensystem mit vorgegebenem Nullpunkt,
in dem das Dreieck positioniert werden soll?
Soll die Größe der Darstellung auf dem Bildschirm der "Originalgröße"
entsprechen? Oder können Skalen an die Größenverhältnissen der
Zeichnungselemente angepaßt werden?
Vielleicht hilft dieses Beispiel weiter.
Maßstab: Pixel
Die Bitmap-Größe wird an die Position des Dreiecks angepaßt.
Picturebox-Sizeimage steht auf Zoom - automatische Anpassung.
Schau Dir auch mal die Transform-Methode des Graphics-Objects an.
Option Strict On : Option Explicit On
Public Class frmTriangle
Dim pn As New Panel With _
{.Parent = Me, .Top = 50, .Width = 400, .Height = 300}
Dim pb As New PictureBox With _
{.Parent = pn, .SizeMode = PictureBoxSizeMode.Zoom, .Dock = _
DockStyle.Fill}
Dim tba As New TextBox With _
{.Parent = Me, .Top = 0, .Width = 80}
Dim tbb As New TextBox With _
{.Parent = Me, .Top = 0, .Left = 100, .Width = 80}
Dim tbc As New TextBox With _
{.Parent = Me, .Top = 0, .Left = 200, .Width = 80}
Dim WithEvents btnDraw As New Button With _
{.Parent = Me, .Left = 300, .Text = "Draw"}
Dim pos1, pos2, pos3 As Point
Private Sub frmTriangle_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Width = 400 : Me.Height = 400
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Fixed3D
Me.Text = "Seitenlängen a,b,c eingeben -- a + b => c"
tba.Text = CStr(100) : tbb.Text = CStr(120) : tbc.Text = CStr(150)
End Sub
Private Sub btnDraw_Click(sender As Object, _
e As System.EventArgs) Handles btnDraw.Click
Dim a, b, c As Integer, ok As Boolean = True
'Eingaben checken
If Not Integer.TryParse(tba.Text, a) Then Exit Sub
If Not Integer.TryParse(tbb.Text, b) Then Exit Sub
If Not Integer.TryParse(tbc.Text, c) Then Exit Sub
'Kosinussatz anwenden
Dim cosval As Double = (a * a - (b * b + c * c)) / (-2 * b * c)
Dim alpha As Double = Math.Acos(cosval)
'Definieren Seitenlängen ein Dreieck?
If Double.IsNaN(alpha) Then
MsgBox("Ungeeignete Eingabe", MsgBoxStyle.Exclamation) : Exit Sub
End If
'Zwei Punkte festlegen
pos1 = New Point(100, 100)
pos2 = New Point(100 + CInt(b), 100)
'Position des 3. Punktes gemäß obigem Winkel bestimmen
pos3 = New Point(pos1.X + CInt(Math.Cos(alpha) * c), _
pos1.Y + CInt(Math.Sin(alpha) * c))
Dim xmax As Integer = CInt(Math.Max(pos2.X, pos3.X) + 50)
Dim ymax As Integer = CInt(Math.Max(pos2.Y, pos3.Y) + 50)
'Überprüfung der Punkte-Position:
'Euklidische Distanz zum dritten Punkt berechnen
Dim diff1 As Integer = _
CInt(Math.Sqrt((pos1.X - pos3.X) ^ 2 + (pos1.Y - pos3.Y) ^ 2))
If Math.Abs(diff1 - c) > 2 Then ok = False
Dim diff2 As Integer = _
CInt(Math.Sqrt((pos2.X - pos3.X) ^ 2 + (pos2.Y - pos3.Y) ^ 2))
If Math.Abs(diff2 - a) > 2 Then ok = False
If Not ok Then
MsgBox("Berechnungsfehler", MsgBoxStyle.Exclamation)
Else
Using bmp As New Bitmap(xmax, ymax), _
gr As Graphics = Graphics.FromImage(bmp)
gr.Clear(Color.White)
'Dreieck Zeichnen
gr.FillPolygon _
(New SolidBrush(Color.Red), New Point() {pos1, pos2, pos3})
gr.DrawPolygon _
(New Pen(Color.Blue, 3), New Point() {pos1, pos2, pos3})
'Dreieck anzeigen
pb.Image = CType(bmp.Clone, Image)
End Using
End If
End Sub
End Class
Beitrag wurde zuletzt am 09.12.12 um 17:24:17 editiert. | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 09.12.12 17:55 |
| Besten Dank, Manfred,
wenn ich nicht zurecht komme, melde ich mich.
LG brauner | |
Re: Dreieck zeichnen | | | Autor: Brauner | Datum: 31.12.12 12:47 |
| Hallo,
wenn die Dreicksseiten größer werden: ca. 1000 o.ä.
dann werden die Linienstärken schwächer dargestellt.
Kann man die Linienstärke irgendwie anpassen.
mit "DIM Pen1 as Newpen(color.black,4)"
komme ich nicht weiter, weil dann bei kleinen Dreiecken die Linienstärke
zu dick erscheint.
mfgb brauner | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|