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

2Randomize

Прежде чем, делать свои заключения - ты сначала в код вникни, а потом только высказывай свое фи.

1) Он и не будет работать, я же по русски написал что нужен тип вектора Float2, который содержит x и y - компоненты. Нормальный кодер опишет этот вектор без особых затруднений.

2) Насчет быстродействия, если тебе интересно - то проверь. В твоей функции происходит 8 (восемь!) вызовов функции DrawOval(), а затем погляди на исходник этой функции... сразу скажу моя функция минимум раз в 4-6 будет работать быстрее.

3) Насчет названия - это уже дело вкуса. Но позволю защитить свое название...
название функции - полностью соответсвует мышлению программиста.

DrawRectRound()
[Draw] - отрисовать, [Rect] - Прямоугольник, [Round] - скругленный.

Другими словами я название функции делю на 3 части : [Операция][Основное название функции][Модификатор функции]

Кто со мной не согласен - те пусть пишут всякие басни в названиях функций.

Не могу отказаться от соблазна покритиковать вышеописанный код :

1) GetClsColor() - заЧем ?

2) Любые операции с вьюпортами нежелательны, ибо не на всех видяхах работает.

3) Золотое правило : в любых функциях отрисовки чего-либо никогда нельзя менять аттрибуты отрисовки. Вы поглядите на официальные функции - там из атрибутов ничего не трогается. А если уж нужда заставляет менять то при завершении работы функции их всегда надо возвращать в исходное состояние (тоесть на момент, когда функция была вызвана).

ЗЫ Для особо одаренных, ниже привожу полностью рабочий код :

 
SuperStrict
 
Function DrawRectRound(x:Float, y:Float, w:Float, h:Float, radius:Float = 40.0, corner:Int = -1)
 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
 Local inc:Float = 90.0 / corner
 
 For i = 0 To corner
  Local ang:Float = 0.0 + (inc * 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
 Next
 
 v1 = Null
 v2 = Null
 For i = 0 To corner
  Local ang2:Float = 90.0 + (inc * i)
  v2 = New Float2.ForAngle(ang2)
  v2 = v2.MulS(radius)
  If v1
   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 + (inc * i)
  v2 = New Float2.ForAngle(ang3)
  v2 = v2.MulS(radius)
  If v1
   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 + (inc * 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
 
 Type Float2
  Field x:Float
  Field y:Float
 
  Method Delete()
   x = Null
   y = Null
  End Method
 
  Method Create:Float2(x:Float = 0.0, y:Float = 0.0)
   MemCopy(Varptr Self.x, [x, y], 8)
   Return Self
  End Method
 
  Method ForAngle:Float2(ang:Float)
   MemCopy(Varptr x, [Float(Cos(ang)), Float(Sin(ang))], 8)
   Return Self
  End Method
 
  Method MulS:Float2(s:Float)
   Return Create(x * s, y * s)
  End Method
 End Type
End Function
 
SetGraphicsDriver(GLMax2DDriver())
Graphics(1024, 768)
 
SetTransform()
SetBlend(ALPHABLEND)
SetAlpha(1.0)
SetColor(255, 255, 255)
SetLineWidth(1.0)
 
Local r:Float = 40.0, k:Float = 0.3
 
While Not KeyHit(KEY_ESCAPE)
 Cls
 r:+k
 If r > 80.0 Then k = -0.3
 If r < 0 Then k = 0.3
 DrawRectRound(MouseX(), MouseY(), 300.0, 200.0, r, 5)
 Flip()
Wend
 
End

Последний раз редактировалось Черный крыс, 05.12.2011 в 00:07.
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
moka (05.12.2011), Randomize (04.12.2011)