Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Распознавание кружков Добавлено: 21.09.08 21:48  

Автор вопроса:  supaplex777 | Web-сайт: dudkino-net.tut.su | ICQ: 397711309 
Пытался, пытался я добавить пример программы на главную страницу сайта - нихрена не получилось! Ну ладно. Есть же форум для этого! Я не буду мудрить а просто скопирую текст письма к user@vbnet.ru сюда.
Всегда, когда делаешь что то сам, чувствуется, как ограничивает нас ГУЙ. Т.к. на данный момент ничего лучше него не придумали, приходится улучшать то что есть. Интерфейс программы это на самом деле не последняя вещь в программировании. Я думаю, что многие проблемы с использованием тех или иных программ возникают у пользователей всвязи с необходимостью щёлкать мышью. При нажатии на клавишу мыши напрягаются группы мышц, не использующиеся при перемещении манипулятора. Таким образом, вся работа пользователя состоит из циклов перемещение-щелчок. Думаю что это если не утомляет, то просто подсознательно надоедает пользователю. Особенно раздражает необходимость выполнять операции совершенно разного рода всё теми же щелчками. Я думаю, что выпадение раскрывающегося списка, например, будет и лучше выглядеть, и выполняться намного удобнее с помощью кругового движения курсором. Сами принципы распознавания центра окружности реализованы и готовы к дальнейшей обработке в этом примере.
К сожалению быстродействие VB (либо быстродействие моего Celeron'а) позволяет распознавать окружности только с небольшим (~300 пикс.) диаметром. Думаю, реализация моей идеи на другом, более быстром языке решит эту проблему. Все проблемы с таким новшеством в Вашей программе должны быть оправданы. Только представьте: Вы обводите курсором пункт меню, и оно выпадает вниз! Это должно быть красиво! Возможно создание внешней программы, которая с помощью Win API определяла бы верхнее окно и посылала бы WM-сообщение нужной кнопочке любой программы.

Итак, требуется только форма Form1 (я нашёл в закромах чёрную с зелёным цветом рисования) с таймером Timer1 (я имел на руках хороший совковый таймер с интервалом в 1,5 секунды) и один модуль.

***НАЧАЛО_ФОРМЫ***
Dim m() As point, up As Long, msize As Long, c As point, e As Boolean

'Если у Вас есть Notepad++ то смотрите комментарии к коду в нём при включенном синтаксисе VB - намного удобней чем в самом VB!
'Если у вас его нет - быстрей качайте! подсветка множества синтаксисов! Очень удобно!

Private Sub Form_Load()
If Form1.ScaleWidth < Form1.ScaleHeight Then msize = Form1.ScaleWidth Else msize = Form1.ScaleHeight
up = Int(3.1415926 * msize)
ReDim m(up)
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If e Then Exit Sub
Form1.PSet (m(up).X, m(up).Y), vbBlack '''''''''все дейстия отмеченные множеством апострофов не нужны и должн быть удалены после отладки вашей программы
For j = up To j = 1 Step -1
If j < 1 Then Exit For
m(j) = m(j - 1)
Next j 'в этом цикле мы затираем верхнюю точку массива и поднимаем на единицу все остальные освобождая место для фиксации новой точки
m(0).X = X
m(0).Y = Y 'зафиксировали новую точку
Form_Paint ''''''''''теперь прорисуем все зафиксированные точки чтобы видеть прогресс
For j = 30 To up 'цикл начинается с 30 чтобы "нижняя" (нулевая) точка массива не давала ложных вызовов по отношению к своим "соседкам по этажу"
If compare(m(0), m(j)) Then 'мы предсавляем себе, будто наша нижняя точка это "конец буквы С" и каждый раз пытаемся найти ей достаточно близкое "начало"
pst m(0), vbRed ''''''''''''''
pst m(j), vbRed ''''''''''''''
c.X = 0
c.Y = 0 'в эту переменную мы найдём центр окружности
k = Int(j / 2) 'а тут пусть будет пол-круга чтобы каждый раз его не считать и не напрягать машину
For i = 0 To k
c.X = c.X + (m(i).X + m(i + k).X) / 2
c.Y = c.Y + (m(i).Y + m(i + k).Y) / 2 '(m(i) + m(i + k)) / 2 это "средняя" точка между противолежащими(m(i) и m(i + k)) точками окружности должна указывать на центр (только жалко что нельзя так сделать с самодельным типом данных - приходится дробить на x и y всегда)
Next i
c.X = c.X / k
c.Y = c.Y / k 'это мы нашли среднее арифметическое всех вероятных центров окружности, таким образом, получая достаточно достоверный центр
r = 0
For i = 0 To j
r = r + rasst(c, m(i)) 'rasst(c, m(i)) расстояние от точки до центра - здесь должен получиться радиус окружности
Next i
r = r / j 'находим среднее арифметическое всех радиусов опять же получая наиболее достоверный
o = 0
For i = 0 To j
If (rasst(c, m(i)) - r) / msize > 0.1 Then o = o + 1 'здесь мы считаем как много точек вылетело ну уж совсем за пределы круга (лишние срабатывания страшнее чем кажутся)
Next i
If o / j < 0.05 Then ' если точек-путешественниц не так уж и много то можно совершить действие (в данном случае только демонстрация)
Form1.Circle (c.X, c.Y), r, vbRed '''''''''''
Form1.Line (c.X - 1, c.Y)-(c.X + 1, c.Y) '''''''''''
Form1.Line (c.X, c.Y - 1)-(c.X, c.Y + 1) '''''''''''
e = True
Timer1.Enabled = True
End If
End If
Next j
End Sub

Private Sub Form_Paint()
For j = 0 To up
Form1.PSet (m(j).X, m(j).Y) 'Просто отмечаем каждую зафиксированную точку
Next j
End Sub

Private Function compare(t1 As point, t2 As point) As Boolean 'функция позволяет быть уверенным что точки ПРИБЛИЗИТЕЛЬНО совпадают
compare = CBool(rasst(t1, t2) / msize <= 0.1)
End Function

Private Sub pst(p As point, color As Long) 'функция введена для удобства
Form1.PSet (p.X, p.Y), color
End Sub

Private Function rasst(t1 As point, t2 As point) As Long 'функция геометрически вычисляет расстояние между точками
rasst = Sqr((t2.X - t1.X) * (t2.X - t1.X) + (t2.Y - t1.Y) * (t2.Y - t1.Y))
End Function

Private Sub Timer1_Timer() 'этот таймер и переменная e введены чтобы прекратить "рисование" кругами. В практической реализации они не нужны
e = False
Timer1.Enabled = False
End Sub
***КОНЕЦ_ФОРМЫ***



***НАЧАЛО_МОДУЛЯ***
Public Type point
X As Long
Y As Long
End Type
***КОНЕЦ_МОДУЛЯ***

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Боцман



ICQ: 295725312 

Вопросов: 53
Ответов: 830
 Web-сайт: Rus-Skipper.narod.ru
 Профиль | | #1
Добавлено: 21.09.08 22:02
SENSIVA есть такая программа. Вначале прикольно, а потом надоедает и...в корзину. Память жрет тоже.

Ответить

Номер ответа: 2
Автор ответа:
 supaplex777



ICQ: 397711309 

Вопросов: 5
Ответов: 13
 Web-сайт: dudkino-net.tut.su
 Профиль | | #2
Добавлено: 21.09.08 22:25
Да нее, ты не понял суть. Вот, допустим, все ведь видели как сворачивается Win Mediaplayer в панель задач. Вот там очень неудобен регулятор громкости. А мы, допустим, сворачиваем свой плеер также, в панель задач. Так вот мы можем сделать так что при круговом обводе значка динамика появляется регулятор громкости и мы не сбавляя скорости курсора регулируем громкость, при нажатии левой кнопки мыши открывается регулятор баланса право-лево, при нажатии на колесо откроется эквалайзер, а при нажатии правой кнопки мыши ну допустим поведение громкости при запуске сторонних приложений.
Фактически получается четвёртая кнопка мыши. При этом, удобно что курсор не должен терять скорости. Просто я вот хочу увидеть реакцию народа на эту пусть не новую идею. Ну и пусть что есть уже прога такая. Наша задача это, как всегда, доказать что можно сделать это же и на VB.

Ответить

Номер ответа: 3
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #3
Добавлено: 22.09.08 00:24
Петруха пишет:
пытался я добавить пример программы на главную страницу сайта - нихрена не получилось!

А что писал?

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 22.09.08 00:25
В смысле, какую ошибку выдавало?

Ответить

Номер ответа: 5
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #5
Добавлено: 22.09.08 12:05
пока я буду кружок рисовать, я быстрее ткну кнопку мыши. НАМНОГО быстрее...

Ответить

Номер ответа: 6
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #6
Добавлено: 22.09.08 17:09
не ну прикольно
только что то оно долго определяет круг

Ответить

Номер ответа: 7
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #7
Добавлено: 22.09.08 19:09
пока я буду кружок рисовать, я быстрее ткну кнопку мыши. НАМНОГО быстрее...

+1

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 22.09.08 21:06
Жжошь камрад :)

За то время пока ты нарисуешь круг диаметром 300 пикселей я успею изменить громкость, переключить трек, получить почту и пощелкать по ссылкам в браузере :)

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

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 22.09.08 21:08
Кстати, я посмотрю, как ты будешь на иконке медиа-плеера (которая находится на панели задач) рисовать КРУГ

Попробуй, это реально не получится - в крайнем случае - полукруг.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам