Da gehst du einfach jedes Pixel durch, nimmst die Entfernung zu deinem Zentrum und gibst diese in eine Funktion ein (z.B. y = Round(Cos(Pow(Abs(Dist), 0.25) * #RING_FACTOR + #PI) * 0.5 + 0.5, #PB_Round_Nearest)), also so:
Code: Alles auswählen
Global OriginX.i, OriginY.i
Procedure.d Distance(X1.d, Y1.d, X2.d, Y2.d)
Protected XDiff.d = X2 - X1
Protected YDiff.d = Y2 - Y1
ProcedureReturn Sqr(XDiff * XDiff + YDiff * YDiff)
EndProcedure
#RING_FACTOR = 30.0
Procedure.i CircleFunc(Dist.d)
ProcedureReturn Round(Cos(Pow(Abs(Dist), 0.25) * #RING_FACTOR + #PI) * 0.5 + 0.5, #PB_Round_Nearest)
EndProcedure
Procedure FilterCallback(X, Y, QuellFarbe, ZielFarbe)
If CircleFunc(Distance(X, Y, OriginX, OriginY))
ProcedureReturn ZielFarbe
Else
ProcedureReturn QuellFarbe
EndIf
EndProcedure
LoadImage(1, #PB_Compiler_Home + "examples/sources/data/geebee2.bmp")
If OpenWindow(0, 0, 0, ImageWidth(1), ImageHeight(1), "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateImage(0, ImageWidth(1), ImageHeight(1))
OriginX = ImageWidth(1) / 2
OriginY = ImageHeight(1) / 2
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@FilterCallback())
DrawImage(ImageID(1), 0, 0)
StopDrawing()
ImageGadget(0, 0, 0, 400, 200, ImageID(0))
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
[EDIT]
Ups, hab übersehen, dass die in einzelne Bilder sollen. Sollen sich die Ringe dann auch berühren?
[EDIT]
Hier mit gleich breiten Ringen:
Code: Alles auswählen
Global OriginX.i, OriginY.i
Global MinDist.d, MaxDist.d
Procedure.d Distance(X1.d, Y1.d, X2.d, Y2.d)
Protected XDiff.d = X2 - X1
Protected YDiff.d = Y2 - Y1
ProcedureReturn Sqr(XDiff * XDiff + YDiff * YDiff)
EndProcedure
Procedure FilterCallback(X, Y, QuellFarbe, ZielFarbe)
Protected Distance.d = Distance(X, Y, OriginX, OriginY)
If Distance >= MinDist And Distance < MaxDist
ProcedureReturn QuellFarbe
Else
ProcedureReturn ZielFarbe
EndIf
EndProcedure
#RING_COUNT = 5
LoadImage(1, #PB_Compiler_Home + "examples/sources/data/geebee2.bmp")
If OpenWindow(0, 0, 0, ImageWidth(1), ImageHeight(1), "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateImage(0, ImageWidth(1), ImageHeight(1))
OriginX = ImageWidth(1) / 2
OriginY = ImageHeight(1) / 2
EndIf
ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
Define k.i = 0
Define RingStep.i = ImageWidth(0) / #RING_COUNT
Define Time.i = ElapsedMilliseconds()
Repeat
If ElapsedMilliseconds() - Time > 1000
MinDist = MaxDist
MaxDist + RingStep
StartDrawing(ImageOutput(0))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(0, 0, 0))
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@FilterCallback())
DrawImage(ImageID(1), 0, 0)
StopDrawing()
SetGadgetState(0, ImageID(0))
k + 1
If k >= #RING_COUNT
k = 0
EndIf
Time = ElapsedMilliseconds()
EndIf
Event = WaitWindowEvent(5)
Until Event = #PB_Event_CloseWindow
EndIf
Und hier mit immer breiter werdenden Ringen:
Code: Alles auswählen
Global OriginX.i, OriginY.i
Global MinDist.d, MaxDist.d
Procedure.d Distance(X1.d, Y1.d, X2.d, Y2.d)
Protected XDiff.d = X2 - X1
Protected YDiff.d = Y2 - Y1
ProcedureReturn Sqr(XDiff * XDiff + YDiff * YDiff)
EndProcedure
Procedure FilterCallback(X, Y, QuellFarbe, ZielFarbe)
Protected Distance.d = Distance(X, Y, OriginX, OriginY)
If Distance >= MinDist And Distance < MaxDist
ProcedureReturn QuellFarbe
Else
ProcedureReturn ZielFarbe
EndIf
EndProcedure
#RING_COUNT = 5
LoadImage(1, #PB_Compiler_Home + "examples/sources/data/geebee2.bmp")
If OpenWindow(0, 0, 0, ImageWidth(1), ImageHeight(1), "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateImage(0, ImageWidth(1), ImageHeight(1))
OriginX = ImageWidth(1) / 2
OriginY = ImageHeight(1) / 2
EndIf
ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
Define k.i = 0
Define RingStep.i = ImageWidth(0) / #RING_COUNT
Define Time.i = ElapsedMilliseconds()
Repeat
If ElapsedMilliseconds() - Time > 1000
MinDist = MaxDist
MaxDist + RingStep / (#RING_COUNT - k)
StartDrawing(ImageOutput(0))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(0, 0, 0))
DrawingMode(#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@FilterCallback())
DrawImage(ImageID(1), 0, 0)
StopDrawing()
SetGadgetState(0, ImageID(0))
k + 1
If k >= #RING_COUNT
k = 0
MaxDist = 1
EndIf
Time = ElapsedMilliseconds()
EndIf
Event = WaitWindowEvent(5)
Until Event = #PB_Event_CloseWindow
EndIf