Arc füllen


#1
Hallo Gemeinde,

ich möchte gern ein Arc zeichen und füllen ich habe das auf zwei Arten getestet und zweimal ein Problem

1ter Versuch:

Code:
Rectangle li = new Rectangle( 20, 75, 10, 20);
g.DrawArc(VolPen, li, 90, 180);
Problem ist dabei dass ich das Arc nicht füllen kann

2ter Versuch:

Code:
Rectangle li = new Rectangle( 20, 75, 10, 20);
GraphicsPath gp = new GraphicsPath();
gp.AddArc(li, 90, 180);
gp.CloseFigure();
if(Vol != 0)
   g.FillPath(StringBrush, gp);
g.DrawPath(VolPen, gp);
hier das Problem wenn Vol 0 ist ist das Arc zwar nicht ausgefüllt aber es hat eine Line auf der offenen Seite und das ist unerwünscht da dies der Abschluss für eine art Progessbar sein soll.

Es wäre noch zu erwähnen dass ich nicht auf ein Form zeichne sondern direkt auf den Desktop ich kann also auch kein Progressbar Steuerelment verwenden.

Danke für eure Hilfe.
 
#2
Meinst du so ?
arc.png

Ich hab den Arc in meinem Beispiel gedreht, damit ich mir das besser vorstellen kann.

Ich hab zuerst folgende Funktion geschrieben:
Code:
Private Sub FillZeile(ByRef bmp As Bitmap, _
ByVal pt As Point, ByVal farbe_neu As Color)
	Dim schritt As Integer
	Dim left, right As Boolean
	Dim farbe_alt, cur As Color

	schritt = 1
	left = False
	right = False

	farbe_alt = bmp.GetPixel(pt.X, pt.Y)
	bmp.SetPixel(pt.X, pt.Y, farbe_neu)

	Do
		If pt.X - schritt > 0 and not left Then
			cur = bmp.GetPixel(pt.X - schritt, pt.Y)
			If cur = farbe_alt Then
				bmp.SetPixel(pt.X - schritt, pt.Y, farbe_neu)
			Else
				left = True
			End If
		Else
			left = True
		End If

		If pt.X + schritt < bmp.Width and not right Then
			cur = bmp.GetPixel(pt.X + schritt, pt.Y)
			If cur = farbe_alt Then
				bmp.SetPixel(pt.X + schritt, pt.Y, farbe_neu)
			Else
				right = True
			End If
		Else
			right = True
		End If

		schritt += 1
	Loop Until left And right
End Sub
Diese Funktion bekommt ein Bitmap, eine Position in diesem Bitmap und eine Farbe geliefert. Die Funktion ließt dann an dem angegebenen Punkt in der Bitmap die Farbe aus, speichert sie und ersetzt sie mit der Farbe aus dem Parameter. Dann beginnt die Funktion damit sich solange nach links und nach rechts auszubreiten und die alte durch die neue Farbe zu ersetzen, bis sie auf eine andere Farbe trifft als die, die sie zu Beginn im angegebenen Punkt ausgelesen hat.

Die Funktion füllt also quasi eine Zeile (horizontal) mit einer Farbe aus.

Alles was ich jetzt noch machen muss, ist der Funktion die Zeilen im Arc zu übergeben. Angefangen bei der untersten und dann gehst du einfach x Zeilen nach oben, bis der gewünschte Füllsand erreicht ist.

Code:
Private Sub pb_Paint(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles pb.Paint
	Dim g As Graphics
	Dim bmp As Bitmap
	Dim li As New Rectangle(10, 10, 100, 100)

	bmp = New Bitmap(pb.Width, pb.Height)
	g = Graphics.FromImage(bmp)

	g.FillRectangle(Brushes.White, li)
	g.DrawArc(Pens.Black, li, 0, 180)
	g.Dispose()

	For i As Integer = 1 To 30
		Me.FillZeile(bmp, New Point(60, 110 - i), Color.Gold)
	Next
	pb.Image = bmp
End Sub
 
Zuletzt bearbeitet: