Форум Игромании

Форум Игромании (http://forum.igromania.ru/index.php)
-   Программирование (http://forum.igromania.ru/forumdisplay.php?f=243)
-   -   C# (http://forum.igromania.ru/showthread.php?t=114386)

Pharaon 13.08.2011 07:36

Скажу так, мне просто необходимо это сделать. Не важно что и как, но чтобы код работал на шарпе. Есть винАпи функции? Какие?

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

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

Th0R(D0)NaR 12.09.2011 20:20

помогите написать проги
Скрытый текст:
Использовать перечислимый тип для хранения названий дней недели (месяцев, названий организационно-правовых форм предприятий и т.п.) с последующей печатью на экране значений созданного перечислимого типа.
вариант перечислений: Виды печатных изданий (книга, журнал, газета и т.п.)

Скрытый текст:
Разработать структуру, описывающую координаты и другие требуемые параметры квадрата с расчётом его площади.

Скрытый текст:
Разработать консольное приложение, позволяющее одному пользователю загадывать число в заданном диапазоне, а другому отгадывать это число, вводя произвольные числа с последующим указанием того, больше это число загаданного или нет.

Mad-Dan 12.09.2011 23:03

Th0R(D0)NaR,
совсем лень думать?
примитивные же проги.
учебный год похоже начался.

Arantar 19.10.2011 19:29

Есть задание: нужно определить площадь на выбранном отрезке под заданной кривой методом численного интегрирования.
Программа должна обеспечить ввод с клавиатуры уравнений функций и нахождение значения площади под полученной кривой.

И есть загвоздка, как обеспечить с клавиатуры ввод уравнений функций, программа создается через Windows Forms, т.е. там нужно реализовать эту функцию...

pokibor 19.10.2011 20:14

Arantar, нужно реализовать лексический и синтаксический анализаторы, осуществляющие разбор грамматики математических выражений (и саму грамматику под нужную схему подогнать). Грамматика мат. выражений проста, её хоть грамматикой простого предшествования можно представить, а для таких грамматик есть простой и эффективный алгоритм разбора. В общем-то, задача сугубо техническая и требует освоения методов синтаксического анализа (лексический тут элементарен).
Возможно, в C# даже есть соответствующие компоненты, но я этим не занимался и потому не знаю...
Ну а если лень делать, то можно предписать вбивать функцию в префиксной или постфиксной формах. Тут вообще мудрить с разбором не придётся, до того всё просто.

Arantar 20.10.2011 08:55

Хотелось бы примерчик небольшой увидеть этого, если не трудно...

CMETAHA 20.10.2011 09:16

Arantar, Вот: Парсер математических выражений, через регексы, много разных примеров

pokibor 20.10.2011 09:26

Arantar, учите матчасть.
Для разбора математических выражений я в своё время использовал следующую грамматику (привожу её в формате моей программы для построения матрицы предшествования, там из названия разделов ясно, где что):
Скрытый текст:
>TERMINAL<
var
const
+
-
*
/
rt
^
log
func
(
)

>NOT_TERMINAL<
ВЫР
ПВЫР
ПР1
ПР1а
ПР2
ПР2а
ПР3
ПР3а
ПР4
ПР4а
ПР5
ПР5а
ПЕРЕМ
КОНСТ
СКОБ

>START<
ВЫР

>RULES<
ВЫР -> ПВЫР
ПВЫР -> ПР1
+ ПР1
- ПР1
ПВЫР + ПР1
ПВЫР - ПР1
ПР1 -> ПР1а
ПР1а -> ПР2
ПР1а * ПР2
ПР1а / ПР2
ПР2 -> ПР2а
ПР2а -> ПР3
ПР2а ^ ПР3
ПР2а rt ПР3
ПР3 -> ПР3а
ПР3а -> ПР4
ПР3а log ПР4
ПР4 -> ПР4а
ПР4а -> ПР5
func ПР5
ПР4а func ПР5
ПР5 -> ПР5а
ПР5а -> ПЕРЕМ
КОНСТ
СКОБ ВЫР )
СКОБ -> (
ПЕРЕМ -> var
КОНСТ -> const

>END<
Она является грамматикой простого предшествоания, а нетерминалы ПР<число> разграничивают операторы по приоритетам, чем выше приоритет - тем выше число. То есть легко свои операторы добавить. Все функции задаются терминалом func, ну а какая именно функция - это уже лексический анализ (правда, поскольку тут речь идёт об элементарной математике, то функции могут быть только от одной переменной - т.е. имеются в виду синусы, косинусы и так далее). var и const - терминалы для переменной и константы соответственно. rt и log - для операция корня и логарифма, которые я решил в рамках грамматики реализовать операторами, т.к. там по сути две переменные должны быть.

Что же касается префиксной/постфиксных записей - то это в Википедию по ссылкам.

Теперь что касается "примерчика". Вообще-то у меня есть программа для построения по грамматике матрицы предшествования и последующей генерации выходного файлы с полным описанием и грамматики, и матрицы. А также программа, генерирующая по этому файлу код на C++ с синтаксическим анализатором. Но Вы едва ли во всём этом разберётесь, так что читайте теорию. Ну или если лень, используйте постфикс/префикс. Там, повторяюсь, всё элементарно. Знак перед/после операндов, никаких скобок. Читай себе символы и определяй, что это. Кстати, и для инфиксной формы (сиречь обычная форма записи, когда оператор стоит между операндов) можно не заморачиваться с грамматикой. Используйте стек, и всё (в грамматике простого предшествования он, собственно, и используется). Я использовал грамматику, дабы была возможность её расширения.

Ну да, или используйте готовую библиотеку, ссылку на которую кинул CMETAHA. :Grin: Но вообще-то, знать основы построения трансляторов не помешает.

OverDoser 04.11.2011 15:03

Знания в c# далеки от хороших, поэтому задаю вопрос:
Собственно задача у меня такова:найти объект на изображении с помощью образца(второе изображение).
Сейчас я использую примитивный алгоритм(знаю, что есть проще намного-но хочу сделать именно с таким).Идет сравнение каждого пикселя с пикселями на образце(GetPixel).
Далее,для отметки совпадения, создается третье изображения с размерами, как у первого изображения и полностью черного цвета.И в случае совпадения, пиксель на третьем изображении с координатами, как у совпавшего пикселя на первом, красится в белый цвет(SetPixel).
Далее идет обработка третьего изображения, по свойствам образца определяем нужный нам объект и обводим этот объект на первом.Но это здесь не важно.

суть такова, что сравнение объектов идет 5<x<10 минут, и меня это НЕ УСТРАИВАЕТ.
Понятное дело, что операций перебор идет более 100млн пикселей, и наверняка замедляет процесс именно GetPixel.

Вопрос у меня такой:
1)Чем можно заменить GetPixel для ускорения программы
2)Какое доп условие можно добавить, чтобы снизить во много раз кол-во сравнений.(ну там допустим средний цвет области.Если близко к среднему цвету образца, то сравниваем.Если далек, то оставляем)
Скрытый текст:
Bitmap one = new Bitmap(@label1.Text);
Bitmap two = new Bitmap(@label3.Text);
Bitmap thr = new Bitmap(@label1.Text);
for (int h = 0; h <= thr.Height-1; h++)//Делаем 3 изображение черным
for (int g = 0; g <= thr.Width-1; g++)
thr.SetPixel(g, h, Color.Black);



for (int q = 0; q <= one.Width-two.Width-1; q++)
for (int z = 0; z <= one.Height - two.Height - 1; z++)//Перебираем
//координаты на 1 изображении
{ bool b = true;//Буль для выхода в случае нахождения совпадения

for (int f = 0; (f <= two.Width - 1)&&(b=true); f++)
for (int s = 0; (s <= two.Height - 1)&&(b=true); s++)//Координаты
//образца
{
if (one.GetPixel(q, z) == two.GetPixel(f, s))

{ thr.SetPixel(q, z, Color.White);//Красим в белый
b=false;}

;
}
}

pokibor 04.11.2011 15:29

OverDoser, это область искусственного интеллекта - раз. Но об этом пока говорить рано, чувствую.
Далее, сравнивать по цветам пикселей - заведомо не лучшая идея. Большинство алгоритмов сжатия изображения с потерями, т.е. алгоритмов, которые отбрасывают "слабоощутимую" информацию, осуществляют преобразование изображения в цветовую модель YUV. Вообще, если речь идёт об ускорении работы алгоритма со сравнением, то я бы порекомендовал именно изучить алгоритмы сжатия изображения и сравнивать результирующие коэффициенты уже после сжатия. Обратите особое внимание на вейвлеты - полагаю, именно результаты вейвлет-преобразования Вам подойдут особенно хорошо, поскольку представляют собой уменьшенные копии рисунка. Соответственно, сравниваем грубую часть вейвлет-разложения, если сходится - то можно сравнивать более тонкие коэффициенты.

Итог: если не хотите связываться с искусственным интеллектом (хотя обращение к нему не альтернатива, а дополнение алгоритма, на самом деле), используйте методы сжатие изображения с потерями и сравнивайте их результат. Такие методы строятся на математических функциях и сколь угодно точно могут представлять исходное изображение, выделяя так или иначе "грубые" коэффициенты и "более точные" - чисто исходя из своего предназначения. Как отмечалось выше, из всех методов сжатия мне кажется лучшим применение вейвлетов в силу построения уменьшенных копий исходного изображения, а не малопонятных матриц коэффициентов.

P.S. Рекомендую книгу "Фракталы и вейвлеты для сжатия изображений в действии", С. Уэлстид.

OverDoser 04.11.2011 17:06

pokibor, То есть я правильно вас понял:
Выделяю на 1 изображении область,равную 2 изображению. Произвожу вейвлет преобразование этой области и 2 рисунка. Оцениваю коэффициенты.Если совпадают, то произвожу точное сравнение.И так на всем изображении?

pokibor 04.11.2011 17:16

OverDoser, Вы оба рисунка приводите к вейвлет-преобразованию, а затем начинаете искать на соответствующих уровнях коэффициентов первого изображения второе изображение. Т.е. искать вхождение "крупных" копий изображения сначала на "крупных" копиях картинки, потом на более мелких. Естественно, о точном сходстве речи идти не может, тут необходимо выработать определённый критерий похожести. Однако и в Вашем методе о точном сходстве до единого пикселя можно говорить весьма условно.
P.S. Кстати, алгоритмы распознавания образов используют, как правило, нейронные сети.

Если же Вы ищите именно точное сходство, пиксель к пикселю, то придумайте какую-нибудь контрольную сумму по изображению, и всё. Но тогда задача будет совершенно бесполезной и нереалистичной.

OverDoser 04.11.2011 17:20

pokibor, То, что используются здесь в основном нейронные системы-читал, но для меня пока рано)
С принципом распознавания здесь я понял, спасибо)
Теперь будем разбираться с самим вейвлет-преобразованию)

deriop 04.11.2011 21:33

Не подскажете видеоуроки(ну или любой другой материал), с помощью которых можно с нуля обучиться этому языку программирования.

Mad-Dan 04.11.2011 22:21

deriop,
учимся читать FAQ.

OverDoser 06.11.2011 17:03

Значит, вернусь к задаче.
Таки мне удалось сократить время выполнения операции сравнение пикселей( с 7 минут до 1 с за счет другого подхода +распараллеливания задачи).
Теперь задача моя формулируется по другому:
Имеется два изображения:первое изображение бинарное(те состоит из 0x000000 и oxFFFFFF), на котором изображены различны объекты(они не пересекаются) На нем фон-черное, объекты-белое.
Второе изображение цветное(известно только, что фон белый), на нем изображен какой то объект( и известно, что этот объект изображен на 1 изображении:он может быть повернут под углом или масштабирован,но сама по себе форма остается постоянной).
С помощью каких средств и способов можно реализовать поиск объекта,изображенного на втором рисунке, на первом изображении?

pokibor 06.11.2011 17:39

OverDoser, давайте сразу решим, алгоритм какой сложности и работоспособности Вам нужен. Всегда можно перебирать "в тупую", ограничиваясь лишь элементарной оптимизацией вроде подсчёта контрольной суммы и прочего подобного.
И, конечно, есть более сложные, но и куда более эффективные алгоритмы, требующие определённого преобразования данных, использования методов искусственного интеллекта, обучения и прочего.

Конкретно Ваш случай, я думаю, предполагает вектризацию объектов как основу алгоритма. Поворачивать и масштабировать векторные изображения куда проще, нежели растровые (что очевидно). Тем более на одном из изображений фактически контур объекта и изображён.

P.S. А вообще, тут можно с огромным интересом обсудить применение фрактального подхода, т.е. подбор для изображения IFS и сравнения коэффициентов. Но это совершенно отдельная тема.

OverDoser 06.11.2011 18:02

pokibor, С учетом того, что сам по себе алгоритм имеет довольно большое кол-во условностей, считаю, что для поиска не нужен сильно мудреный способ поиска.(тк первоначальный этап алгоритма-отбор лишних цветов-сводит на нет необходимость в сложных алгоритмов)
Те чтобы сочеталось простота+эффективность+(если это возможно)быстрота

pokibor 06.11.2011 18:21

OverDoser, тогда перебирайте все возможные растровые варианты, раз быстрота на третьем месте :Grin:
Дело в том, что вектризация всё равно необходима, на мой взгляд. Масштабирование - ещё куда ни шло, можно, как Вы делали в предыдущем алгоритме, привести одно изображение к масштабу другого, а вот поворот... ну разве что вращать на 360 градусов с достаточно малым шагом и (для каждого!) масштабировать, затем смотреть. Это трудно назвать эффективным и быстрым алгоритмом, тем более учитывая возможные искажения при повороте.
С вектризованным же изображением работать попроще будет. Как минимум, поворачивать/масштабировать надо будет вектора, а не пиксели, что само по себе сильно упрощает дело. Ну и затем можно накрутить массу оптимизационных улучшений. Например, если вектризация идёт до отрезков контура, то можно запоминать последовательность их длин на контуре, и сравнивать сперва именно длины (отсюда сразу с хорошей вероятностью получается масштаб). Но, опять же, всё это будет работать лишь примерно, в определённых пределах, за счёт погрешностей.

OverDoser 06.11.2011 18:45

pokibor, А возможно ли использование индивидуальных свойств объектов(если они, конечно, есть =) ), которые не меняются при масштабировании?
Мы же можем их перебрать, и если погрешность очень низкая, то очевидно, что это нужный нам объект.


Часовой пояс GMT +4, время: 19:26.

Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.