рисование многоугольника

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

рисование многоугольника

Сообщение MasterKlass » 07.04.2005 (Чт) 9:25

Всем здравствуйте.
Проблема такая.
их даже несколько

1) есть код.

Код: Выделить всё
Private Sub Picture1_MouseMove(Button As Integer, _
                Shift As Integer, X As Single, Y As Single)
  Static b As Double
  Static c As Double
  Picture1.Line (0, 0)-(b, c), vbWhite
  Picture1.Line (0, 0)-(X, Y)
  b = X
  c = Y
End Sub



как вы уже догатываетесь, при движение мышки по Картинке, за курсором тянется линия (из верхнего левого угла)
потом при нажатие (что-то типо этого)

Код: Выделить всё
Private Sub Picture1_MouseUp(Button As Integer, _
                Shift As Integer, X As Single, Y As Single)
  If Button = vbLeftButton Then Picture1.Line (0, 0)-(X, Y)
End Sub



должна высвечиваться и ОСТАВТЬСЯ на картинке линия от верхнего левого угла до координат курсора мышки во время нажитии левой кнопки.
Так оно и происходит, но в след. момент это линия ЗАКРАШИВАЕТСЯ белой из события MouseMove...

как поступить?
по идее это должен быть ввод многоугольника (типа как в Paint)

(ессено, что все вершины должны запоминаться, это легко)

решение я одно вижу, это при каждом движение мышки перерисовывать все грани по запомненным вершинам, но если вершин много, то это как-то не очень.. ну не знаюю... не оптимально, чтоли...

ну да. линию при перемещение мышки можно и не рисовать,можно просто строить прямую между 2х точек-кликов, но с рисованием нагляднее. =)

задача в общем:
реализация алгоритмов затравки и заполнения многоугольников (такие как закраска с упорядоченным списком рёбер, закрачка по рёбрам, с "перегородкой", с "флагом", построчный затравочный и тд).


2) кстати ещё вопрос, как определить цвет пиксела в Picture? знаю, что есть метод POINT? можно по-подробнее.


3) можно ли просто поставить центр отсчёта координат в центр Picture и не задавать сам масштаб при помощи Scale? Просто мне нужен такой масштаб, чтоб каждый пиксел в отдельности можно было васветить, а с экранной сисетемой координат очень неудобно.
при помощи Scale тяжело подобрать нормальный масштаб...

Спасибо!

:)
МГТУ им. Баумана ::: ИУ7

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 07.04.2005 (Чт) 10:20

2 вопрос:
Код: Выделить всё
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then q = Picture1.Point(X, Y)
End Sub

возвращает в переменную q - цвет точки ИМЕННО в Picture по координатам мыши.
Последний раз редактировалось Шурик 07.04.2005 (Чт) 12:07, всего редактировалось 1 раз.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 07.04.2005 (Чт) 10:28

Что-то непонятно, как ты рисуешь многоугольник, если всегда линии выходят из точки (0,0). Ты же рисуй линию из точки (Х1,У1) и как раз по клику левой кнопкой мыши меняй (Х1,У1) на текущие и все будет замчательно :)

next
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 26.03.2002 (Вт) 23:01

Сообщение next » 07.04.2005 (Чт) 10:37

Ну как сказать, способ, кот. ты считаешь не оптимальным, на самом деле отлично работает. Возможно чтобы не закрашивать установленной линии можно использовать проверку точки на цвет, однако ентот способ менее оптимальный, т.к. мне кажется функция прорисовки действует намного быстрее чем функция Point и аналогичные, т. о. запоминай координаты вершин и прорисовывай их по новой каждый раз по событию MouseMove. Это не сильно займет систему, как кажется на первый взгляд, однако совет в програме прорисовки используй лишь циклы и функции прорисовки и обычные массивы, иный функции в данной програме неимоверно замедляют процесс прорисовки. т.ч. удачи

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 07.04.2005 (Чт) 10:41

1) Где-то так:
Код: Выделить всё
Dim p As Boolean
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  p=True
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If p then
  Static b As Double
  Static c As Double
  Picture1.Line (0, 0)-(b, c), vbWhite
  Picture1.Line (0, 0)-(X, Y)
  b = X
  c = Y
end if
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbLeftButton Then Picture1.Line (0, 0)-(X, Y)
  p=False
End Sub

По поводу реализации алгоритмов - смирись с тем, что найти и постигнуть алгоритм сложнее, чем написать его реализацию. Посему, пиши сам. Здоровый кусок кода "просто так" многих заломает писать, вот если человек заинтересуется, тогда другое дело...
2) color=Picture1.Point (10,10) присвоит color значение цвета в точке Picture1 с координатами 10,10.
3)
MasterKlass писал(а):просто мне нужен такой масштаб, чтоб каждый пиксел в отдельности можно было васветить

Picture1.ScaleMode=vbPixels
MasterKlass писал(а):а с экранной сисетемой координат очень неудобно.

Доведеться, хлопче. Не позорь свой ВУЗ, преобразование системы координат не должно быть для тебя проблемой. Если уж совсем невмоготу пиши функции MyX(), MyY() для преобразования (но я бы стал это делать только в случае, если оси в новой и в старой системах координат не параллельны).
Листинги не горят!

MasterKlass
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 07.04.2005 (Чт) 9:06

Сообщение MasterKlass » 07.04.2005 (Чт) 15:34

Faust писал(а):1)

По поводу реализации алгоритмов - смирись с тем, что найти и постигнуть алгоритм сложнее, чем написать его реализацию. Посему, пиши сам. Здоровый кусок кода "просто так" многих заломает писать, вот если человек заинтересуется, тогда другое дело...

3)
MasterKlass писал(а):а с экранной сисетемой координат очень неудобно.

Доведеться, хлопче. Не позорь свой ВУЗ, преобразование системы координат не должно быть для тебя проблемой. Если уж совсем невмоготу пиши функции MyX(), MyY() для преобразования (но я бы стал это делать только в случае, если оси в новой и в старой системах координат не параллельны).


да алогоритмы я и сам хотел реализовывать.

а про экранную СК... конечно могу сам преобразовать координаты, но если есть встроенная фун-ция, то зачем парится? компьютер сам всё сделает.
но рас нет, тогда сами что-нить придумаем)

всем спасибо
МГТУ им. Баумана ::: ИУ7

MasterKlass
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 07.04.2005 (Чт) 9:06

Сообщение MasterKlass » 07.04.2005 (Чт) 15:36

vvs_adm писал(а):Что-то непонятно, как ты рисуешь многоугольник, если всегда линии выходят из точки (0,0). Ты же рисуй линию из точки (Х1,У1) и как раз по клику левой кнопкой мыши меняй (Х1,У1) на текущие и все будет замчательно :)


ну это просто я сначало делал так, чтоб проверить ввод.
ессено я буду вести из преыдущей точки)
:wink:
МГТУ им. Баумана ::: ИУ7

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 07.04.2005 (Чт) 15:52

Так оно и происходит, но в след. момент это линия ЗАКРАШИВАЕТСЯ белой из события MouseMove...
Ну так у тебя эта проблема сразу отпадет... Так как на событии MouseMove координаты Х1 и У1 уже изменятся.


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 49

    TopList  
cron