Залитый полигон методами формы...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Залитый полигон методами формы...

Сообщение Kurt » 13.10.2003 (Пн) 17:39

Здравствуйте!
Во время моей скромной программистской деятельности возникла
острая нужда нарисовать залитые полигоны на форме.
Все бы ничего, но мне надо это сделать именно методами формы,
без API!
Как это сделать?
Подозреваю, что надо использовать Line... или нет?
Буду искренне рад ответу - надо очень..
Для корабля, который не знает куда плыть, нет попутного ветра...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.10.2003 (Пн) 18:25

Такое было в QBasic, а в VB почему-то нет. Придется писать свою процедуру. Для треугольника - элементарно.

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 13.10.2003 (Пн) 18:42

Если не тяжело, покажи как.
Хотя, в основном мне нужны четырехугольники и выше...
Для корабля, который не знает куда плыть, нет попутного ветра...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.10.2003 (Вт) 12:59

Создай новый проект, в форму вставь код:
Код: Выделить всё
Option Explicit

Private Sub Form_Click()
  Me.Cls
  PaintTri Rnd * Me.ScaleWidth, Rnd * Me.ScaleHeight, Rnd * Me.ScaleWidth, Rnd * Me.ScaleHeight, Rnd * Me.ScaleWidth, Rnd * Me.ScaleHeight, RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End Sub

Private Sub PaintTri(inx1 As Long, iny1 As Long, inx2 As Long, iny2 As Long, inx3 As Long, iny3 As Long, Col As Long)
Dim x1 As Long, y1 As Long, x2 As Long, y2 As Long, x3 As Long, y3 As Long
Dim x As Long, y As Long, k1 As Single, k2 As Single, k3 As Single
  x1 = inx1: x2 = inx2: x3 = inx3
  y1 = iny1: y2 = iny2: y3 = iny3
  If y1 > y2 Then Swap x1, x2: Swap y1, y2
  If y2 > y3 Then Swap x2, x3: Swap y2, y3
  If y1 > y2 Then Swap x1, x2: Swap y1, y2

  If y3 = y1 Then k1 = 0 Else k1 = (x3 - x1) / (y3 - y1)
  If y2 = y1 Then k2 = 0 Else k2 = (x2 - x1) / (y2 - y1)
  If y3 = y2 Then k3 = 0 Else k3 = (x3 - x2) / (y3 - y2)

  For y = y1 To y2
    Line (x1 + k1 * (y - y1), y)-(x1 + k2 * (y - y1), y), Col
  Next y

  For y = y2 + 1 To y3
    Line (x1 + k1 * (y - y1), y)-(x2 + k3 * (y - y2), y), Col
  Next y
End Sub

Private Sub Swap(x1 As Long, x2 As Long)
Dim tmp As Long
  tmp = x2
  x2 = x1
  x1 = tmp
End Sub

Private Sub Form_Load()
  Me.ScaleMode = vbPixels
End Sub


кликай мышкой по форме и смотри...

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 14.10.2003 (Вт) 16:19

Хм.. Вот оно как..
Только небось ресурсов ест многовато.
Мне надо быстро нарисовать около 50 тыс. полигонов (в основном четырехугольники).
Для корабля, который не знает куда плыть, нет попутного ветра...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.10.2003 (Вт) 16:48

Может тебе нужны прямоугольники, причем расположенные "горизонтально"? Тогда есть:
Код: Выделить всё
line(x1,y1)-(x2,y2),color,bf

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 14.10.2003 (Вт) 17:32

Не-не!
Я, конечно, слабоват в VB, но это знаю. :)
Нужны не только прямоугольники, а полигоны вообще..
Для корабля, который не знает куда плыть, нет попутного ветра...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.10.2003 (Ср) 6:54

Любой выпуклый многоугольник разрезается на треугольники.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kurt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 105
Зарегистрирован: 05.01.2003 (Вс) 23:25

Сообщение Kurt » 15.10.2003 (Ср) 18:27

GSerg писал(а):Любой выпуклый многоугольник разрезается на треугольники.

Да понимаю! Но это слишком ресурсоемко!!!
Для корабля, который не знает куда плыть, нет попутного ветра...

_NeoN_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 178
Зарегистрирован: 14.08.2003 (Чт) 9:48
Откуда: Новосибирск

Сообщение _NeoN_ » 15.10.2003 (Ср) 18:34

хо хо хо, 50 тысяч будет и с api долго рисоваться...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.10.2003 (Чт) 8:51

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 5

    TopList