- Offizieller Beitrag
Ich habe hier eine Funktion mit der ich Kreisringe zeichne, deren Ringbreite abhängig vom Durchmesser nichtlinear skaliert wird. Trotz des verwendeten high quality mode sieht das aber sehr grob aus. Wie kann ich das "verfeinern"?
C++
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Example()
Func Example()
Local $hGUI, $hGraphic, $hPen
$hGUI = GUICreate("Ringe - Breite nichtlinear skaliert", 1000, 300)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY)
$hPen = _GDIPlus_PenCreate(0xFF0000FF, 1)
Local $aX[] = [20,60,110,170,240,320,410,510,620,740,870]
For $i = 0 To UBound($aX) -1
_GDIPlus_GraphicsDrawBeltScaled($hGraphic, $aX[$i], 90, 20+$i*10, $hPen)
Next
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_GDIPlus_PenDispose($hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>Example
; minimum diameter (default) = 20
Func _GDIPlus_GraphicsDrawBeltScaled($_hGraphic, $_iX, $_iY, $_iDiameter=20, $_hPen=0)
$_iDiameter = $_iDiameter < 20 ? 20 : $_iDiameter
Local Const $iBaseDiam = 20, $iBorderwideMin = 8
Local $iCurrentBorder = ($iBorderwideMin * ($_iDiameter/$iBaseDiam))^0.45 *2 ; Anpassung nichtlinear
$iCurrentBorder = Ceiling($iCurrentBorder < $iBorderwideMin ? $iBorderwideMin : $iCurrentBorder)
Local $iDiamInside = $_iDiameter - $iCurrentBorder
_GDIPlus_GraphicsDrawCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hPen)
_GDIPlus_GraphicsDrawCircleByCentre($_hGraphic, $_iX, $_iY, $iDiamInside, $_hPen)
EndFunc
Func _GDIPlus_GraphicsDrawCircleByCentre($_hGraphic, $_iX, $_iY, $_iDiameter, $_hPen=0)
$_iX -= $_iDiameter/2
$_iY -= $_iDiameter/2
_GDIPlus_GraphicsDrawEllipse($_hGraphic, $_iX, $_iY, $_iDiameter, $_iDiameter, $_hPen)
EndFunc
Alles anzeigen