Code archives/Graphics/Cartoon Sheep Function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| I can count the uses for this function on one or two fingers, but here it is anyway. I blame it all on puki and warpy.... ;) | |||||
; Title: Cartoon Sheep Function
;Programmer: Andy Amaya
; Date: 2011.06.29
;=======================================================
;FillTriangle by Tom Toad
;http://www.blitzmax.com/codearcs/codearcs.php?code=1200
;=======================================================
AppTitle "Cartoon Sheep"
Global sw = 800, sh = 600, retX, retY
Graphics sw, sh, 32, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
;color constants
Const black% = $00
Const white% = $FFFFFF
Const red% = $FF0000
Const yellow% = $FFFFE0
Const green% = $FF00
Const blue% = $FF
Const darkblue% = $80
Const lightgray%= $D0D0D0
Const gray% = $808080
Const peach% = $FFB060
Const skyblue% = $20A0FF
Const brown% = $604020
setClsColor(skyblue)
While MouseHit(1) = 0
Cls
For i = 1 To 9
colr = Rand(1,3)
Select colr
Case 1: outline = black : fill = white
Case 2: outline = black : fill = lightgray
Case 3: outline = brown : fill = yellow
End Select
scale = Rand(10,50) ; scale values of 10 to 100 recommended
x = Rand(scale*5,sw-scale*5) ;keep 'em on
y = Rand(scale*3,sh-scale*3) ;screen here
If toggle Then
sheep(x, y, scale*3, scale*5, outline, fill, Rand(-70,70), Rand(0,1),1)
Else
sheep(x, y, scale*5, scale*3, outline, fill, Rand(-70,70), Rand(0,1),1)
End If
toggle = 1-toggle
Next
setColor(black)
Text 400,580,"Right click for more random sheep --------- Left click to Exit",True
Flip
WaitMouse()
Wend
End
Function sheep(x, y, ovalw, ovalh, outline, fill, headAngle, headPos, penWidth)
;==============================================================================
; sheep function to draw cartoon sheep
;==============================================================================
; Parameters:
; x,y are the center coords of the main ellipse used to construct the body
; ovalw, ovalh are the width and height of the main ellipse
; outline is the Hex color used to draw the sheep's outline
; fill is the Hex color used to fill in the wool
; headAngle is the angle of the sheep's head
; headPos locates the head on the left or right of the body
; penWidth determines the width of the outline in pixels
;
;=======================================================================================
; NB: requires setColor(), fillTriangle(), rLocate(), rEllipse() and tBubble() functions
;=======================================================================================
Local bigRad%, legW%, legH%, radx%, rady%, tx%, ty%, bodyBump%, stroke%
Local headRadX%, headRadY%, eyeRadX%, eyeRadY%, earLocX%, earLocY%
Local eyeOutlineX%, eyeOutlineY%
;make sure we derive proportions from the longest axis
If ovalw > ovalh Then bigRad = ovalw Else bigRad = ovalh
legW = bigRad/20
If legW < 3 Then legW = 3
legH = legW*5
radx = ovalw Shr 1
rady = ovalh Shr 1
setColor(outline)
;left front leg oval center
tx = Cos(51)*radx +x
ty = Sin(51)*rady +y
rEllipse(tx, ty, legW, legH, 30, Rand(-12,12), 1)
;rt front leg oval center
tx = Cos(68)*radx +x
ty = Sin(68)*rady +y
rEllipse(tx, ty, legW, legH, 30, Rand(-12,12), 1)
;left back leg oval center
tx = Cos(110)*radx +x
ty = Sin(110)*rady +y-legW
rEllipse(tx, ty, legW, legH, 30, Rand(-12,12), 1)
;right back leg oval center
tx = Cos(127)*radx +x
ty = Sin(127)*rady +y+legW
rEllipse(tx, ty, legW, legH, 30, Rand(-12,12), 1)
;calc proportional bumps
bodyBump = bigRad Shr 4
If bodyBump < 1 Then bodyBump = 1
stroke = bodyBump/3
If stroke < 1 Then stroke = 1
tBubble(x, y, ovalw, ovalh, bodyBump, stroke, outline, fill) ;body
;place head center on left or right of body
If headPos = 0 Then
hx = x-radx ;left
Else
hx = x+radx ;right
End If
hy = y
;proportions for head
headRadX = bigRad/8
headRadY = bigRad/4
eyeRadX = headRadX*.3
eyeRadY = headRadY*.3
If eyeRadX < 2 Then eyeRadX = 2
If eyeRadY < 4 Then eyeRadY = 4
;draw the head
setColor(peach)
rEllipse(hx, hy, headRadX, headRadY, 30, headAngle, 1)
setColor(outline)
rEllipse(hx, hy, headRadX, headRadY, 30, headAngle, 0)
setColor(peach)
;calc ear center distances
earLocX = Float(headRadX)*1.1
earLocY = Float(headRadY)*1.1
;calc center of left ear
rLocate(hx, hy, earLocX, earLocY, headAngle, 325)
rEllipse(retX, retY, eyeRadX, eyeRadY, 30, headAngle+45, 1)
;calc center of right ear
rLocate(hx, hy, earLocX, earLocY, headAngle, 215)
rEllipse(retX, retY, eyeRadX, eyeRadY, 30, headAngle-45, 1)
;calc eye center distances
eyeOutlineX% = Float(headRadX)*.4
eyeOutlineY% = Float(headRadY)*.4
;calc center of right eye
setColor(outline)
rLocate(hx, hy, eyeOutlineX, eyeOutlineY, headAngle,190)
exR = retX : eyR = retY
rEllipse(exR, eyR, eyeRadX, eyeRadY, 30, headAngle, 1)
;calc center of left eye
rLocate(hx, hy, eyeOutlineX, eyeOutlineY, headAngle,350)
exL = retX : eyL = retY
rEllipse(exL, eyL, eyeRadX, eyeRadY, 30, headAngle, 1)
;draw the whites of eyes
setColor white
whiteX = eyeRadX-2
If whiteX < 1 Then whiteX = 1
whiteY = eyeRadY-2
If whiteY < 2 Then whiteY = 2
rEllipse(exL, eyL, whiteX,whiteY,30,headAngle, 1)
rEllipse(exR, eyR, whiteX,whiteY,30,headAngle, 1)
setColor(outline)
;calc proportional pupil radii
eyePupilX = eyeOutlineX * .35
eyePupilY = eyeOutlineY * .35
;calc center of pupils
angle = Rand(0,359)
rLocate(exR, eyR, eyePupilX, eyePupilY, headAngle, angle)
rEllipse(retX, retY, eyePupilX, eyePupilY, 10, headAngle, 1)
rLocate(exL, eyL, eyePupilX, eyePupilY, headAngle, angle)
rEllipse(retX, retY, eyePupilX, eyePupilY, 10, headAngle, 1)
;calc location of head wool
woolBump = bodyBump/6
If woolBump < 1 Then woolBump = 1
rLocate(hx, hy, headRadX*.72, headRadY*.72, headAngle, 270)
tBubble(retX, retY, headRadY*.75, headRadX*.75, woolBump, woolBump, outline, fill) ;head wool
End Function
;=======================================================
;FillTriangle by Tom Toad
;http://www.blitzmax.com/codearcs/codearcs.php?code=1200
;=======================================================
Function fillTriangle(x1#,y1#,x2#,y2#,x3#,y3#)
Local slope1#,slope2#,slope3#,x#,y#,length#
;make sure the triangle coordinates are ordered so that x1 < x2 < x3
If x2 < x1 Then x = x2: y = y2: x2 = x1: y2 = y1: x1 = x: y1 = y
If x3 < x1 Then x = x3: y = y3: x3 = x1: y3 = y1: x1 = x: y1 = y
If x3 < x2 Then x = x3: y = y3: x3 = x2: y3 = y2: x2 = x: y2 = y
If x1 <> x3 Then slope1 = (y3-y1)/(x3-x1)
length = x2 - x1
;draw the first half of the triangle
If length <> 0 Then
slope2 = (y2-y1)/(x2-x1)
For x = 0 To length
Line x+x1,x*slope1+y1,x+x1,x*slope2+y1
Next
End If
y = length*slope1+y1
length = x3-x2
;draw the second half
If length <> 0 Then
slope3 = (y3-y2)/(x3-x2)
For x = 0 To length
Line x+x2,x*slope1+y,x+x2,x*slope3+y2
Next
End If
End Function
Function reticle(x,y,colr)
Local r%, g%, b%
r = ColorRed
g = ColorGreen
b = ColorBlue
setColor(colr)
Line(x-5,y,x+5,y)
Line(x,y-5,x,y+5)
Color r,g,b
End Function
Function tBubble(x%, y%, ew%, eh%, bump%, pen%, outline%=0, fill%=$FFFFFF)
;========================= Thought Bubble Function ==================================
;Parameters:
; x,y are the center of the main ellipse used to construct the thought bubble
;
; ew is the total width of the main ellipse ( xRadius * 2)
; eh is the total height of the main ellipse ( yRadius * 2)
;
; bump is a value used to determine overall height of bumps encircling the main
; ellipse - inversely proportional (i.e. smaller bump values make bigger bumps
; and larger bump values make smaller bumps)
;
; pen determines the width of the outline stroke used to draw thought bubble
;
; outline is a hex color value of bubble outline (default = black)
;
; fill is the hex color value used to fill the bubble (default = white)
;=====================================================================================
; NB: requires setColor() function
;=====================================================================================
Local ex%, ey%, radX%, radY%, rand1%, rand2%, arcUsed%, arc%
Local rad%, cx%, cy%, x1%, y1%, x2%, y2%, oldX%, oldY%, pen2%
If pen < 2 Then pen = 2
pen2 = pen Shr 1
ex = x ;center X of main ellipse
ey = y ;center Y of main ellipse
radX = ew Shr 1 ;radius of main ellipse along X axis
radY = eh Shr 1 ;radius of main ellipse along Y axis
rand1 = Int(ew/bump) ;1/bump the width of main ellipse
rand2 = Int(eh/bump) ;1/bump the height of main ellipse
;make sure rand1 is less than rand2
If rand2 < rand1 Then tmp = rand1:rand1=rand2:rand2=tmp
;if rand1 = rand2 then divide rand1 by 2
If Abs(rand1 - rand2) < 5 Then rand1 = rand1/2
;this variable keeps track of degrees used by all arc segments
arcUsed = 0
;first point is a random location on ellipse in degrees (always even)
arc = Rand(0,179)*2
;this is a point on main ellipse at number of degrees in 'degree' variable
x1 = Cos(arc)*radX+ex
y1 = Sin(arc)*radY+ey
;remember this first point to draw the last bump and close the bubble later
oldX = x1: oldY = y1
;use loop to keep adding bumps (circles)
While arcUsed <= 360-rand2*2
;get a new random number of degrees
stp = Rand(rand1, rand2)*2
;keep running total of 'angle of arc' used so far
arcUsed = arcUsed + stp
;keep track of current location in degrees on the main ellipse
arc = arc+stp
;calc x,y coords on main ellipse at current 'arc' value
x2 = Cos(arc)*radX+ex
y2 = Sin(arc)*radY+ey
;calc radius of the circle used to draw the bump
rad = Floor(Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))+.5)+1
;find mid-point of x1,y1 and x2,y2 to use as center of circle used to draw bump
cx = (x1+x2)/2
cy = (y1+y2)/2
;change color to hex value in 'outline' parameter
setColor(outline)
;draw a filled circle 'pen2' pixels larger than inner filled circle (thickness of outline)
Oval cx-rad/2-pen2, cy-rad/2-pen2, rad+pen, rad+pen,True
;change color to hex value in 'fill' parameter
setColor(fill)
;draw the 'fill' colored filled circle
Oval cx-rad/2, cy-rad/2, rad, rad, True
;remember last coords on ellipse drawn to, as x1,y1
x1 = x2: y1 = y2
Wend
;============================================================================
; OK, ellipse nearly encircled with bumps, only room enough for one last bump
;============================================================================
;these are coords of first point we used to start drawing bumps
;x1,y1 holds the coords of the last coords used to draw a bump in loop
x2 = oldX : y2 = oldY
;calc the radius of the circle used to draw the last bump
rad = Int(Sqr((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) +.5)+1
;calc the mid point coords between x1,y1 and x2,y2 to use as center of circle
cx = (x1+x2)/2
cy = (y1+y2)/2
;change color to hex value in 'outline' parameter
setColor(outline)
;draw a filled circle 'pen2' pixels larger than inner filled circle (thickness of outline)
Oval cx-rad/2-pen2, cy-rad/2-pen2, rad+pen, rad+pen, True
;change color to hex value in 'fill' parameter
setColor(fill)
;draw the 'fill' colored filled circle
Oval cx-rad/2, cy-rad/2, rad, rad, True
;draw the main filled ellipse, which erases all of the semi-circles inside of the ellipse
Oval ex-radX, ey-radY, ew, eh,True
End Function
Function rEllipse(centerX%, centerY%, radius1#, radius2#, segments#, angle#, mode%)
;============================== Rotated Ellipse Function ==============================
; Parameters are:
;
; centerX, centerY coords locate center of ellipse to be plotted
; radius1 is width of ellipse along the X axis
; radius2 is height of ellipse along the Y axis
; segments is number of line segments used to draw the ellipse (minimum of 3)
; angle is number of degrees to rotate the ellipse (NOTE: 0 degrees = East)
; mode - when mode = 0 then draw an un-filled ellipse else draw a filled ellipse
;
;======================================================================================
; NB: requires fillTriangle() function
;======================================================================================
Local rca#, rsa#, incSize#, i#, ca#, sa#, x1%, y1%, x2%, y2%
rca = Cos(angle) : rsa = Sin(angle)
If segments < 3.0 Then segments = 3.0
incSize = 360.0/segments
If angle = 0 Then
x1 = radius1+centerX : y1 = centerY
Else
x1 = rca*radius1+centerX : y1 = rsa*radius1+centerY
End If
; Plot x1, y1
i = incSize
While i <= 360.01
ca = Cos(i)*radius1 : sa = Sin(i)*radius2
If angle = 0.0 Then
x2 = Int(ca + centerX) : y2 = Int(sa + centerY)
Else
x2 = Int(rca*ca-rsa*sa +centerX) : y2 = Int(rsa*ca+rca*sa +centerY)
End If
;if mode is zero draw an un-filled ellipse
If mode = 0 Then
Line x1, y1, x2, y2
Else
;otherwise use the fillTriangle function to fill current arc segment
fillTriangle(centerX, centerY, x1, y1, x2, y2)
End If
x1 = x2 : y1 = y2
i = i + incSize
Wend
End Function
;locate any angle location on a rotated ellipse
Function rLocate#(cx, cy, r1, r2, headAngle, angle)
Local rca#, rsa#, ca#, sa#,x#, y#
rca =Cos(headAngle) : rsa = Sin(headAngle)
ca = Cos(angle)*r1: sa = Sin(angle)*r2
;==============================================
; *** retX and retY are GLOBAL! ***
; which allows us to return both x and y values
;==============================================
retX = Int(rca*ca-rsa*sa+cx)
retY = Int(rsa*ca+rca*sa+cy)
End Function
Function setColor(hexValue%)
Color (hexValue Shr 16) And 255,(hexValue Shr 8) And 255, hexValue And 255
End Function
Function setClsColor(hexValue%)
ClsColor (hexValue Shr 16) And 255,(hexValue Shr 8) And 255, hexValue And 255
End Function
Function rgb2hex%(r%, g%, b%)
Return (r Shl 16) Or (g Shl 8) Or b
End Function |
Comments
| ||
| Why am I getting blamed for this?! I like the sheep though. Tasty blambs. |
| ||
| If its twisted, well....its puki If its warpy, well...its warpy |
| ||
| This is definitely on puki's harddrive. Hmmm, I guess it IS warped. :P Completely pointless and absolutely hilarious! *dies laughing* Now all it needs it a fake "baa" sound. |
| ||
| That was cool! who's puki? |
| ||
| Banned some time ago. Hilarious individual. Look for Gandalfs b3d blender thread EDIT: aha..Here tis |
Code Archives Forum