Hallo!
Hier ein programmiertes Beispiel zur Kombination von skalierten und relativen dazu liegenden Linien.
Private Function DrawFigure()
'Ausgangsgröße
Dim x() As Integer = {100, 471, 561, 832, 900}
Dim y() As Integer = {100, 149, 690}
'Größe der Kerben (Auslinkungen?)
Dim kerbtiefe As Integer = 40, kerblänge1 As Integer = 90, kerblänge2 = _
70
'skalierbare Punkte der Figur
Dim pts() As Point = {New Point(x(0), y(0)), New Point(x(0), y(2)),
New Point(x(4), y(2)), New Point(x(1), y(0)),
New Point(x(2), y(0))}
'Zentrum der Skalierung festlegen
Dim center As Point = pts(0)
'Skalierungsfaktoren (z.B. halbe Ausgangs-Größe)
Dim ScaleX As Single = 0.5
Dim ScaleY As Single = 0.5
'Skalierbare Punkte skalieren (Rescale Methode)
For i As Integer = 0 To pts.Length - 1
pts(i) = Rescale(pts(i), center, ScaleX, ScaleY)
Next
'Zeichnung (pb sei eine Picurebox auf der Form)
pb.Image = New Bitmap(1000, 1000)
Using g As Graphics = Graphics.FromImage(pb.Image),
p As New Pen(Color.Brown, 2)
'Skalierte Punkte zeichnen
g.DrawLine(p, pts(1), pts(0))
g.DrawLine(p, pts(1), pts(2))
g.DrawLine(p, pts(0), pts(4))
'Einkerbung relativ zu pts(4)
g.DrawLine(p, pts(4), New Point(pts(4).X, pts(4).Y + kerbtiefe))
g.DrawLine(p, New Point(pts(4).X, pts(4).Y + kerbtiefe),
New Point(pts(4).X + kerblänge1, pts(4).Y + kerbtiefe))
g.DrawLine(p, New Point(pts(4).X + kerblänge1, pts(4).Y + _
kerbtiefe),
New Point(pts(4).X + kerblänge1, pts(4).Y))
'Verbindungslinie zwischen Kerben
g.DrawLine(p, New Point(pts(4).X + kerblänge1, pts(4).Y),
New Point(pts(2).X - kerblänge2, pts(4).Y))
'zweite Einkerbung (relativ zu Punkt 2 und Punkt 4)
g.DrawLine(p, New Point(pts(2).X - kerblänge2, pts(4).Y),
New Point(pts(2).X - kerblänge2, pts(4).Y + _
kerbtiefe))
g.DrawLine(p, New Point(pts(2).X - kerblänge2, pts(4).Y + _
kerbtiefe),
New Point(pts(2).X, pts(4).Y + kerbtiefe))
'rechter Rand des Rechtecks ab Kerbung
g.DrawLine(p, New Point(pts(2).X, pts(4).Y + kerbtiefe), pts(2))
End Using
End Function
Private Function Rescale(p As Point, center As Point,
scalefactorX As Single, scalefactorY As Single) As Point
Return New Point(CInt((p.X - center.X) * scalefactorX + center.X),
(p.Y - center.Y) * scalefactorY + center.Y)
End Function |