Creating a leopard pattern
Posted: Sun Jun 23, 2024 7:45 pm
I'd like to create some endless pattern (tiles) for wallpapers and fill functions. My first target is something like seen in the following SVG file - there are four different forms which look a little bit like distorted ellipses with a dashed outline.
But how to generate (quickly) such objects randomly so that size, form, rotation and the outline never looks the same? Just found Blob Maker which could also be a start...
The second code is a quick approach but doesn't look very promising so I hope, other tactics will show better results.
But how to generate (quickly) such objects randomly so that size, form, rotation and the outline never looks the same? Just found Blob Maker which could also be a start...
The second code is a quick approach but doesn't look very promising so I hope, other tactics will show better results.
Code: Select all
CompilerIf #PB_Compiler_Version>555:Macro Base64Decoder(a,b,c,d):Base64DecoderBuffer(a,b,c,d):EndMacro:CompilerEndIf
M=?E-?S:R=AllocateMemory(M):If R:B=Base64Decoder(?S,M,R,M):Z=5524:If B:X=AllocateMemory(Z):F.s=SaveFileRequester("Save file","Gattopardo.svg","All files (*.*)|*.*",0):If F And UseLZMAPacker() And UncompressMemory(R,B,X,Z)=Z:CreateFile(0,F):WriteData(0,X,Z):EndIf:EndIf:EndIf
DataSection
S:
!db 'XQAAAAIAHg/LhxHYzmaRD4Meyv17M9R/6bfaKDF2JWYgTSoJbWr3KXA4MOfMHdsZJpIjXEI1M6azc0wZGEpmHph4iaHl/aOqVn0MDkeXPM43r3epBTU6cWP90tsBuIvShgX1hBJwysrwqvO1DPJMNvJPd9GDwIgWy2/6BhnBbrTKAB71yYPXi8NO9SUxjrn4bh+YNO0JPwRJIv0SuZcHxNp/+AKG123S4BxYofOo19PbIZ4B8qBmYZRu9Eo65Q7C'
!db 'yX8xbhaWoSgovnR0Rh2dVKdEUDhQjmJBJmzSU/Ysa1k282zzSO1hiqUeCR+BjEsOccuHEk12bRhim8i8Zb9nagybR47LwjPMWmTexqx/NIBc4UJgDT9Z8Ap4CeXOwOKz0AW1TTO4/pLC08NgbrworCkwTQ8C8ihZX5JsapQ2U3DO4lIoHAy74uVaMM2AM1ZIWKTLsxv2qXZPyV5V4Hqqbo+ftkAmDJJGwZku6TMW350cIKNcwWI7bFSkHiStQwdv'
!db '/864fHwW3oaBLloJYvs8ZvieAazQMYRtpnIvijmaNu+dmUMR5aDbGGtvZvPAhOHOmLBX0rBKoQ15Tp5cElgva/2/31sJMJvq6AY5ZNInJiNwWUL3l0kateFddlAnkSCYAX0ItG8Lgp8BnD8uA8CqxVkbAYFfyEujyCFSgxE0PBWi7yUA8wGvnwNEBcUFenOY5sKJL+TX+OPpDSOqZ0dBZBts4PRP2R5MCBtOs0XOpaCUYsxOiIfI8gYedv8E7yCn'
!db '3RMLsViQgSGBrAQ10eApvovjAiHGc/R1wik92nqZuF5brit4/ssrYE/vmEml65URuu7JYCaPrPqLe5rVRcOcAzVfCV1EirZJo+ZVE9G6UbfdImCi4MCLq4vN51hHF4sRcE3XlAXtv0dUnV9Zfu5BIWBTVbEzuqLTqEnfEqGd9w/mwL7kExzHnYAZWFx67X5cTc8ij+aTwi2pJtVg9Q1YBIBIQPtY5qujRCbRhOmkgm3IEMyOmcVhV4JxXpxfoBDV'
!db '+cyrpgRDJ+D/Xxe0nAFhAiNIZZtkINcqYd+kLUB60QlepECsGqETQLMCHvZdLNsYyIZ9CJQVSLb+eZuhjbsEjMu4qBg31dvlH6kncfm7F4lsC3Ppq9ur61bV/xw94SXk4ThlfrsWL1rjAUyE1otWyee9N/s30pCods4SAz1wXgC5yf6MXSfvOesFHyqjkLocz8UivmojmAzlKIitiWBvWCv0c2wvouAWHOtlrUr6ddyJKv6fx9gn1I2WVnsKbxY1'
!db 'b3mVAzSH3CfFEELcge1p3YBVFeikB21bNvZg5FQiwZgWoHEsPNc7Ee3Hrhtrmrr/y1NJfHGSS/9FFpq39ZNbCU4FatWRBfI+3ZTpw0KiEMtDvOHlCueAdvZhmfCqrqcC/qVJNfupQXlTs8ECrGpHE+US2IrHmxKV/ThMbWaxgzmzt3sE+TzZ2+suTTz2bE/vZ+0Yuh8EbY3HqYMgmvm6+HKfShmhW9efRweD46C3FUbhUPiNifzeisrhixGSK4VU'
!db 'ssuKG0dJ9Mmd9xLEFOCBFPBEgqxwAH6Me8Tz5HZfap5KHK/6F9tZwIU4uLGDP/8t6dGG9Y7iMbSDSSyhhef0gB5fRbdbBDAIAekuXmr4ChFB/yvB3bzrA5B7mqW7T6YrKsjyp5ZvGRYNAQG3xNSXLplc8gpUdvswQv60iQb19ruznrJgILnb5Ug8Dm5qA7928fI2+jcwEQp3AX0YFZ+oRI0L9kDrXJcIXJrM0ksvw8yslY4856iutb0+xOXd9ZLT'
!db '8TtjKWmSp80PG1RerUxm2dM1SrVWN1Q5mLIrAUVdJJm9zjpGQhZw8fj5iwq/njkg49bi9osBQCg/8nQyui6SbzK9f8CvvMDS+tNK6gvZjUlYPVTwjYJMy/orNJsiQgGMr9JonZlpT43exSf47iSQytsmAy9kNblILb3vQyR+5Qnb5bar8swvdWpHhRVLPWExGMd6apx4TEq6e9W2WyJxfKZWGu91vCYPdX1Y+1X0CNXIqq3RYfkZ0x/p9ajlBdq8'
!db '4FMx2Z1MGtC402MwFQMfOZ04l3INOn8nI92jYfEefvdF5Hvev9dQIIio6us8w7Tdb3t2QPP89RCL6XT2ZwGak2BV4QNWUAfQHWkjSi7WYE5YFyHmNA0/4zOBInEtItCwo1kXrhSac0X6n9maq5EyMSIp4rIT/cKegFb7mEmDRK7SBYA9Fo9gLVC5wEJLCAdIbdA61ZMa+pIBloKvyhDCxcWwocAFvBrDr0TgIMLp5adF914gXlFkQi625drM0hqB'
!db '3siBcAKAntmShDZpoAK/ZMRXsJJJbRwhuNzNn6DbMuqwkzw5kQV42QqxpBz3rFiXLEGb/gX+n482M72/iUvGmdto7aw6lvtrdwRFAPCky1L97VphHepK/imSS07UthVjhwBiY3DOWNAncDnCKFtoQMVEYqrnhuPl0RO91z7FTbDp+olCUIQErgNJ8e/GfGVmN6famOzfoxpWGG1mGdXPuixwdaDR0laSFrMw3db7pHCvXmgYgutjRa5Yuppiu1n7'
!db '9fDSeUncQT/U9yp/6Kw4DnfvpHhT2zXCOAgeUEzrjhzoCxi1t8n0aZnhGSVwhsgL4oGUug7/TGv4M3BRdt1J2ZPj7FvAdN3yYU21C7dI7K9reoWRz4i+yHLfEUzIo7vpckiuYT73zjnksPPa8CzE4w5M3ZhrJEX33uSkULuG/lSfVndFlGD5SFQn7dpgbq479WxEnrYU3LRb/c/KadL5bN+0ELThA4kF8oNBOhq7Bvbrq/VpYWV2ikMVxFMKIcUn'
!db 'Y28bdGGNJMrmsny3cLr4l3pMef2ml1GdV8lXbQV4Mudx/3qtvcDAZz27z+cf7q4OzRTNRT9gQPOCcCL6Drl66BSdyfKCLDKGLvNcuBlKXj5OWrLjh2VqnJSYEtLgDgyR4E86qlOdLSjrgkYvQpMr5iBFtQOOK4+/oK+Yb43/cEhUhcWOssdbWtNZYzR8UFdQFb8/gu7o/PtRbHY9Tj8tkiYqFL57QbfeLzAodn84u3iLI779vCIqukqCeooh9vNL'
!db 'FixSK1xZAz8UPZH9CI3TXRpc2hTmP3S9AgiSnlQj5gK2GIgLoFk9AnaZqrqQiwB0cyniCS4YC/lmLth9VhFmKE6PvzC8SFRVJ6pAXnhlip2d0BPGh1DWt+JUaf0sHy8p7XJcxIWprcXX9BTUDexXuZ1lSfIa4QyeJzgsKOAf4jD8QcJ0GIhbS1F8LN8uUgDTDx+pNHfCQ51s29AzYX3d4+M2DgXWYH3tdPt+NvdwfZsa1UXnG9oGr8AVNJm/CikI'
!db 'kyi66XCWOoaWm44r9DcEDDASXcw6cjyFbgVrZlWmOS+LIjN3ehIKScOKwNcrSulnDJkZ5/tcSutWoojOAfQ9d9lk+3coYlApex9bFsJwjLcH/eC/6A=='
E:
EndDataSection
Code: Select all
OpenWindow(0, 0, 0, 400, 200, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 400, 200)
If StartVectorDrawing(CanvasVectorOutput(0))
Dim dotty.point(35)
x.d=200
y.d=100
r.d=40
a=Random(359)
For i=0 To 30
a+12
rd=r+Sin(Radian(a*2))*(5+3*Sin(a*5))
dotty(i)\x=x+Sin(Radian(a))*(rd)
dotty(i)\y=y+Cos(Radian(a))*(rd)
Next i
VectorSourceColor($ff000000)
MovePathCursor(dotty(0)\x,dotty(0)\y)
For i=0 To 30
;AddPathCircle(dotty(i)\x,dotty(i)\y,2)
Next i
FillPath()
MovePathCursor(dotty(0)\x,dotty(0)\y)
For i=1 To 28 Step 2
;AddPathCurve(dotty(i)\x,dotty(i)\y,dotty(i+1)\x,dotty(i+1)\y,dotty(i+2)\x,dotty(i+2)\y)
AddPathArc(dotty(i)\x,dotty(i)\y,dotty(i+1)\x,dotty(i+1)\y,r)
Next i
ClosePath()
VectorSourceColor($ff835720)
FillPath()
a=Random(30)
b=2+Random(10)
w=8
For n=1 To b
d=(a+1)%30
e=(d+1)%30
MovePathCursor(dotty(a)\x,dotty(a)\y)
AddPathArc(dotty(d)\x,dotty(d)\y,dotty(e)\x,dotty(e)\y,r)
VectorSourceColor($ff000000)
StrokePath(w,#PB_Path_RoundEnd|#PB_Path_RoundCorner)
w+1
a+2
Next n
StopVectorDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow