Показать сообщение отдельно
Старый 04.12.2011, 06:37   #7
Черный крыс
 
Сообщений: n/a
Ответ: Скруглённые уголки на BlitzMax

Нубско

Вот мое решение...

ЗЫ Насчет констант не парьтесь, они для другой функции, и последний аргумент функции ни к чему не обязывает )))

ЗЗЫ Float2 - это вектор

Const ROUND_LEFT_UP:Int = 1
Const ROUND_LEFT_DOWN:Int = 2
Const ROUND_RIGHT_UP:Int = 4
Const ROUND_RIGHT_DOWN:Int = 8
Const ROUND_LEFT:Int = ROUND_LEFT_UP | ROUND_LEFT_DOWN
Const ROUND_RIGHT:Int = ROUND_RIGHT_UP | ROUND_RIGHT_DOWN
Const ROUND_UP:Int = ROUND_LEFT_UP | ROUND_RIGHT_UP
Const ROUND_DOWN:Int = ROUND_LEFT_DOWN | ROUND_RIGHT_DOWN
Const ROUND_ALL:Int = ROUND_LEFT | ROUND_RIGHT
Function DrawRectRound(x:Float, y:Float, w:Float, h:Float, radius:Float = 40.0, corner:Int = -1, flags:Int = ROUND_ALL)
 radius = Abs(radius)
 
 Select Sgn(corner)
  Case - 1 corner = Int(radius / 10.0) + 1
  Case 1 corner = Abs(corner)
  Case 0
   DrawRect(x, y, w, h)
   Return
 End Select
 
 DrawRect(x + radius, y, w - (radius * 2.0), h)
 DrawRect(x, y + radius, radius, h - (radius * 2.0))
 DrawRect(x + w - radius, y + radius, radius, h - (radius * 2.0))
 
 Local v1:Float2 = Null
 Local v2:Float2 = Null
 Local i:Int
 
 For i = 0 To corner
  Local ang:Float = 0.0 + ((90.0 / corner) * i)
  v2 = New Float2.ForAngle(ang)
  v2 = v2.MulS(radius)
  If v1
   DrawPoly([x + w - radius, y + h - radius, v1.x + x + w - radius, v1.y + y + h - radius, v2.x + x + w - radius, v2.y + y + h - radius])
  End If
  v1 = v2
  v2 = Null
  'DrawLine(x + w - radius, y + h - radius, v2.x + x + w - radius, v2.y + y + h - radius)
 Next
 
 v1 = Null
 v2 = Null
 For i = 0 To corner
  Local ang2:Float = 90.0 + ((90.0 / corner) * i)
  v2 = New Float2.ForAngle(ang2)
  v2 = v2.MulS(radius)
  If v1
   'DrawLine(v1.x + x + radius, v1.y + y + h - radius, v2.x + x + radius, v2.y + y + h - radius)
   DrawPoly([x + radius, y + h - radius, v1.x + x + radius, v1.y + y + h - radius, v2.x + x + radius, v2.y + y + h - radius])
  End If
  v1 = v2
  v2 = Null
 Next
 
 v1 = Null
 v2 = Null
 For i = 0 To corner
  Local ang3:Float = 180.0 + ((90.0 / corner) * i)
  v2 = New Float2.ForAngle(ang3)
  v2 = v2.MulS(radius)
  If v1
   'DrawLine(v1.x + x + radius, v1.y + y + radius, v2.x + x + radius, v2.y + y + radius)
   DrawPoly([x + radius, y + radius, v1.x + x + radius, v1.y + y + radius, v2.x + x + radius, v2.y + y + radius])
  End If
  v1 = v2
  v2 = Null
 Next
 
 v1 = Null
 v2 = Null
 For i = 0 To corner
  Local ang4:Float = 270.0 + ((90.0 / corner) * i)
  v2 = New Float2.ForAngle(ang4)
  v2 = v2.MulS(radius)
  If v1
   'DrawLine(v1.x + x + w - radius, v1.y + y + radius, v2.x + x + w - radius, v2.y + y + radius)
   DrawPoly([x + w - radius, y + radius, v1.x + x + w - radius, v1.y + y + radius, v2.x + x + w - radius, v2.y + y + radius])
  End If
  v1 = v2
  v2 = Null
 Next
End Function
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (04.12.2011)