VB.Net HeatMap?

2 Antworten

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.

13

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
30
@55555555555555

Was für Rechtecke? Das Rectangle-Objekt gibt lediglich den Bereich für den Kreis an. Vielleicht probierst du den Code einfach mal aus. Da ist nichts ungenau. Du musst höchstens die obere linke Ecke des Rechtecks anpassen, weil du vermutlich vom Kreismittelpunkt ausgehst (was auch gleichzeitig der Flächenschwerpunkt des Rectangle-Objekts ist).

0

Was möchtest Du wissen?