RoundBoxedGradient()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

RoundBoxedGradient()

Beitrag von STARGÅTE »

Auch wenn es RoundBoxedGradient() irgendwann geben wird,
hier schon mal ein Include dafür.
RoundBoxedGradient arbeitet von genauso wie RoundBox (Darstellung) bzw. BoxedGradient (GradientFarben)
RoundX und RoundY können also auch unterschiedlich sein!

Kleiner Unterscheid: Wird bei RoundBoxedGradient() RoundY weggelassen wird RoundY = RoundX gesetzt.

Code: Alles auswählen

Structure RoundBoxedGradient
  x.i
  y.i
  Width.i
  Height.i
  RoundX.i
  RoundY.i
EndStructure


Procedure.f RoundBoxedGradientCallback(x.i, y.i)
  Shared RoundBoxedGradient.RoundBoxedGradient
  With RoundBoxedGradient
    x - \x
    y - \y
    If x < \RoundX 
      If y < \RoundY
        ProcedureReturn Sqr(Pow((\RoundX-x)/\RoundX,2)+Pow((\RoundY-y)/\RoundY,2))
      ElseIf y >= \Height-\RoundY
        ProcedureReturn Sqr(Pow((\RoundX-x)/\RoundX,2)+Pow((\RoundY+y+1-\Height)/\RoundY,2))
      Else
        ProcedureReturn (\RoundX-x)/\RoundX
      EndIf
    ElseIf x >= \Width-\RoundX
      If y < \RoundY
        ProcedureReturn Sqr(Pow((\RoundX+x+1-\Width)/\RoundX,2)+Pow((\RoundY-y)/\RoundY,2))
      ElseIf y >= \Height-\RoundY
        ProcedureReturn Sqr(Pow((\RoundX+x+1-\Width)/\RoundX,2)+Pow((\RoundY+y+1-\Height)/\RoundY,2))
      Else
        ProcedureReturn (\RoundX+x+1-\Width)/\RoundX
      EndIf
    Else
      If y < \RoundY
        ProcedureReturn (\RoundY-y)/\RoundY
      ElseIf y >= \Height-\RoundY
        ProcedureReturn (\RoundY+y+1-\Height)/\RoundY
      Else
        ProcedureReturn 0
      EndIf   
    EndIf
  EndWith
EndProcedure


Procedure RoundBoxedGradient(x.i, y.i, Width.i, Height.i, RoundX.i, RoundY.i=#PB_Default)
  Shared RoundBoxedGradient.RoundBoxedGradient
  With RoundBoxedGradient
    \x = x
    \y = y
    \Width = Width
    \Height = Height
    \RoundX = RoundX
    \RoundY = RoundY
    If RoundY=#PB_Default : \RoundY = RoundX : EndIf
    If \RoundX < 0 : \RoundX = 0 : EndIf
    If \RoundY < 0 : \RoundY = 0 : EndIf
    If \RoundX*2 > Width : \RoundX = Width/2 : EndIf
    If \RoundY*2 > Height : \RoundY = Height/2 : EndIf
  EndWith
  CustomGradient(@RoundBoxedGradientCallback())
EndProcedure
Hier ein Beispiel:

Code: Alles auswählen

Enumeration
  #Window : #Gadget : #Image
EndEnumeration

CreateImage(#Image, 400, 400, 24)

StartDrawing(ImageOutput(#Image))
  DrawingMode(#PB_2DDrawing_Gradient)
  GradientColor(1.0, $FF0000)
  GradientColor(0.0, $0000FF)
  RoundBoxedGradient(0,0,200,200,50,50)
  RoundBox(0,0,200,200,50,50)
  RoundBoxedGradient(200,0,200,400,100,100)
  RoundBox(200,0,200,400,100,100)
  RoundBoxedGradient(0,200,200,200,80,40)
  RoundBox(0,200,200,200,80,40)
StopDrawing()

OpenWindow(#Window, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  ImageGadget(#Gadget, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Bild
Zuletzt geändert von STARGÅTE am 09.07.2010 17:26, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: RoundBoxedGradient()

Beitrag von Dostej »

netter Code
thx
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: RoundBoxedGradient()

Beitrag von rolaf »

:allright:
Ist der Code nicht Verscheibungsplichtig? Die damit erstellten Drops sehen verdammt toxisch aus. :wink:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Antworten