VB.Net HeatMap?

... komplette Frage anzeigen

1 Antwort

In einer deiner anderen Fragen gab ich dir ein Code-Beispiel, womit du das Problem lösen könntest - sowohl das alte als auch das aktuelle. Das Framework bietet genug Möglichkeiten, da muss man das Rad nicht nochmal erfinden. Daher bleibe ich dabei:

Du kannst aus deinen Kreisen ein Region-Objekt erzeugen, welches genug Methoden für deine Zwecke zur Verfügung stellt.

Public Function CreateRegion() As Region
Using p1 As New Drawing2D.GraphicsPath, p2 As New Drawing2D.GraphicsPath
' Kreis in p1 hinzufügen. Obere linke Ecke bei X=48; Y=77. Seite a=b=46.
p1.AddArc(New Rectangle(48, 77, 46, 46), 0, 360)
' Kreis in p2 hinzufügen. Obere linke Ecke bei X=52; Y=72. Seite a=b=132.
p2.AddArc(New Rectangle(52, 72, 132, 132), 0, 360)

' Region-Objekt von p1 erzeugen und mit p2 kombinieren.
Dim r As New Region(p1)
r.Union(p2)
Return r
End Using
End Function

Dann musst du nur noch das Region-Objekt darstellen:

Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Using regionBrush As New SolidBrush(Color.FromArgb(178, 255, 0, 0))
e.Graphics.FillRegion(regionBrush, CreateRegion)
End Using
End Sub

Das Brush-Objekt kapselt hierfür die Farbe, die in diesem Fall im Alpha-Kanal einen Wert von 178 (entspricht 30% Transparenz) hat. Der Wert hierfür bleibt dir überlassen.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von 55555555555555
19.05.2016, 19:24

Wenn ich das mit Rechtecken mach, dann wird es nicht sehr genau, ich hab da jetzt selbst was gecoded:

    Private Function IsPointInCircle(ByVal circleX As Integer, ByVal circleY As Integer, ByVal circleRadius As Integer, _

ByVal x As Integer, ByVal y As Integer) As Boolean

Return ((circleX - x) ^ 2 + (circleY - y) ^ 2) <= circleRadius ^ 2
End Function

Private Sub DrawACircle(ByVal g As Graphics, ByVal center As Point, ByVal radius As Integer)
Dim bru As New SolidBrush(Color.FromArgb(96, 255, 0, 0))

g.FillEllipse(bru, New Rectangle(center.X - radius, center.Y - radius, radius * 2, radius * 2))
End Sub

Und aufrufen so:

    Dim asdf As New Bitmap(256, 256)

Using g As Graphics = Graphics.FromImage(asdf)
DrawACircle(g, New Point(64, 64), 64)
DrawACircle(g, New Point(128, 128), 64)

For iX As Integer = 1 To 256
For iY As Integer = 1 To 256
If IsPointInCircle(64, 64, 64, iX, iY) And IsPointInCircle(128, 128, 64, iX, iY) Then
asdf.SetPixel(iX, iY, Color.FromArgb(96, 255, 0, 0))
End If
Next
Next
End Using

PictureBox2.Image = asdf

Using g As Graphics = Graphics.FromImage(PictureBox1.Image)
g.DrawImage(PictureBox2.Image, 0, 0, 256, 256)
End Using
0

Was möchtest Du wissen?