Классическая задача “Острова”, выделение однотонных объектов

Декабрь 7th, 2011 § 0 comments § Прямая ссылка

Понравился алгоритм для решения этой задачи, активно используется стек так что он эффективен на не больших данных, либо на не больших связных поверхностях. Типичным способом решения этой задачи это поиск в глубину. Ниже исходник для выделения однотонных объектов на изображении.


class Program
 {
 static void Main(string[] args)
 {
 if (args.Length < 0)
 {
 Console.WriteLine("[*] Input image path");
 return;
 }
 GLOBAL_DATA.Image2Recog = (Bitmap)Bitmap.FromFile(args[0]);
 GLOBAL_DATA.Width = GLOBAL_DATA.Image2Recog.Width-1;
 GLOBAL_DATA.Height = GLOBAL_DATA.Image2Recog.Height-1;
 SamePixelRecognition obj = new SamePixelRecognition();
 obj.FindSameLinkedPixels();
 Console.WriteLine("There is a {0} linked surface in image",GLOBAL_DATA.Count);
 Console.ReadKey();

 }
 }

class GLOBAL_DATA
 {
 public static Bitmap Image2Recog;
 public static int Count=0;
 public static int Width = 0;
 public static int Height = 0;
 public static Color White = Color.FromArgb(255, 255, 255, 255);
 }

class SamePixelRecognition
 {
 public void FindSameLinkedPixels()
 {
 for(int y = 0;y < GLOBAL_DATA.Height; y++)
 for (int x = 0; x < GLOBAL_DATA.Width; x++)
 {
 if (GLOBAL_DATA.Image2Recog.GetPixel(x, y) != GLOBAL_DATA.White)
 {
 Color tmp = GLOBAL_DATA.Image2Recog.GetPixel(x, y);
 RemovePixel(x, y);
 GLOBAL_DATA.Count++;
 }
 }
 }
 private void RemovePixel(int x, int y)
 {
 int[] wayX = {-1,0,1,0 };
 int[] wayY = {0,-1,0,1 };
 int tX;
 int tY;
 GLOBAL_DATA.Image2Recog.SetPixel(x, y, GLOBAL_DATA.White);

 for (int i = 0; i < wayX.Length; i++)
 {
 tX = wayX[i] + x;
 tY = wayY[i] + y;
 if (tX < 0 || tX > GLOBAL_DATA.Width || tY < 0 || tY > GLOBAL_DATA.Height)
 continue;
 if (GLOBAL_DATA.Image2Recog.GetPixel(tX, tY) != GLOBAL_DATA.White)
 this.RemovePixel(tX, tY);
 }
 }
 }

Используется как видите C#, алгоритм решает задачу, на поиск связанных пикселов т.е. тех, которые расположена рядом друг с другом.

Поворот матрицы на 90° (градусов)

Декабрь 2nd, 2011 § 6 comments § Прямая ссылка

Нужно было реализовать, код вообще -то не сложен, но тем не менее . Поворот матрицы по часовой стрелке.


#include<iostream>
#define n 10
using namespace std;
int matr[n][n];
int main()
{
 for(int i=0;i<n;i++)
 for(int j=0;j<n;j++)
 cin>>matr[i][j];

 int tmp;
 for(int i=0;i<n/2;i++)
 {
 for(int j=i;j<n-1-i;j++)
 {
 tmp = matr[i][j];
 matr[i][j] = matr[n-j-1][i];
 matr[n-j-1][i] = matr[n-i-1][n-j-1];
 matr[n-i-1][n-j-1] = matr[j][n-i-1];
 matr[j][n-i-1] = tmp;
 }
 }
}

Поворот против часовой стрелки


#include<iostream>
#define n 10
using namespace std;
int matr[n][n];
int main()
{
 for(int i=0;i<n;i++)
 for(int j=0;j<n;j++)
 cin>>matr[i][j];

 int tmp;
 for(int i=0;i<n/2;i++)
 {
 for(int j=i;j<n-1-i;j++)
 {
 tmp = matr[i][j];
 matr[i][j]=matr[j][n-1-i];
 matr[j][n-1-i]     = matr[n-1-i][n-1-j];
 matr[n-1-i][n-1-j] = matr[n-1-j][i];
 matr[n-1-j][i]     = tmp;
 }
 }
}

Нахождение простых чисел

Ноябрь 22nd, 2011 § 0 comments § Прямая ссылка

Достаточно простая задача на нахождение простых чисел, приведу два исходника на Си / С++ для решение такой задачи. Используем знаменитый метод “Решето Эратосфена”.

Код на Си


long nn = 10000;
int mas[nn];

memset(mas, 0, sizeof(mas));

mas[0] = 1;
mas[1] = 1;
for (int i = 2; i < nn; i++)
 if (!mas[i])
 {
 for (int j = i * 2; j < nn; j += i)
 mas[j] = 1;
 }

Continue reading “Нахождение простых чисел” »

Сортировка подсчетом

Ноябрь 14th, 2011 § 0 comments § Прямая ссылка

Зарегистрировался на CodeChief и сразу попался, простецкая задача на сортировку, но не тут -то было пробовал Quicksort и MergeSort оба выдавали Time Limit Exceeded. Ответ оказался прост, нужно было воспользоваться сортировкой подсчетом. Основная идея создать нулевой массив размерностью в диапазон в водимых чисел и при вводе чисел производить инкрементацию в итоге после получения данных мы уже получаем “отсортированный” массив. Алгоритм отлично работает с положительными числами, для работы с отрицательными или со структурами данных требуется его переделать. Сортировка подсчетом на вики wiki Ниже приведен код

Continue reading “Сортировка подсчетом” »

Пересечение множеств

Ноябрь 9th, 2011 § 1 comment § Прямая ссылка

Есть два множества нужно найти их пересечение, каким образом это сделать за минимальное время. Можно для этих целей использовать STL . В этом случае нам нужно иметь два множества, обязательно отсортированных. Функция нахождения пересечения и сортировки находятся в заголовочном файле <algorithm>. Пример того как это сделать с помощью STL


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
 int first[] = {5,10,15,20,25};
 int second[] = {50,40,30,20,10};
 vector<int> v(10);
 vector<int>::iterator it;

 sort (first,first+5);     //  5 10 15 20 25
 sort (second,second+5);   // 10 20 30 40 50

 it=set_intersection (first, first+5, second, second+5, v.begin());
 cout << "intersection has " << int(it - v.begin()) << " elements.\n";
 return 0;
}

Этот код взят с cplusplus.com. Если же вы пишете на другом ЯП и считаете что нужно знать как все выполняется то смотрим дальше. Весь код приводить не буду, первое что нужно уяснить алгоритм работает на отсортированных множествах иначе, работать не будет, если не нравится сортировать то добро пожаловать в сложность O(N^2)., нам же этого не нужно. Быстро набросанный код для этого. Тут все еще есть стандартная функция сорт, можно было бы и самому реализовать, но хотел что бы листинг был как можно компактнее, тем более что основные алгоритмы для сортировки в блоге приведены тут и тут.

#include <iostream>
#include <algorithm>
using namespace std;

int main () {
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
int result[10];
sort (first,first+5);
sort (second,second+5);
for(int i=0,k=0;i<sizeof(first);i++)
for(int j=0;j<sizeof(second);j++)
{
if(second[j]>first[i])
break;
if(first[i]==second[j])
{
result[k]=first[i];
k++;
break;
}
}
return 0;
}

C# WebRequest

Октябрь 30th, 2011 § 0 comments § Прямая ссылка

Маленький note на тему, т.к. неприятно провозился около часа. Если установить WebHeaderCollection то значения user-agent и прочие заголовки будут утеряны. Не повторяйте моих ошибок)))

Model в CodeIgniter классически sql запросы и Active Record

Октябрь 11th, 2011 § 2 comments § Прямая ссылка

Напомню для запамятовавших Model в парадигме MVC отвечает за работу с источником данных, обычно это MySQL и прочие реляционные БД, хотя сейчас набирают популярность NoSQL БД. Сейчас не об этом в этой заметке покажу, как работать с Model в CodeIgniter т.к. это доставило наибольшие сложности при работе с этим Фреймворком. Начнем с того что у нас есть выбор как исполнять запросы к БД в CodeIgniter первое мы можем пользоваться привычными нам запросами sql вызывая функцию query(‘some query’); Лучше изучать что либо на примере, лучше один раз увидеть чем сто раз услышать. Стоит упомянуть о конвенции, класс модели должен начинаться с большой буквы, имя файла должно соответствовать имени класса в нижнем регистре.


class Blogmodel extends CI_Model

{

public _construct()

{

parent::__construct();

}

public function get_last_entries()

{

$query = $this->db->query('SELECT *FROM posts LIMIT 10');

return $query;

}

public function get_last_post()

{

$query = $this->db->query('SELECT *FROM posts LIMIT 1');

return $query;

}

public function update_record($title,$post)

{

$sql = "INSERT INTO posts(title, post)
 VALUES (".$this->db->escape($title).", ".$this->db->escape($post).")";

 $this->db->query($sql);

 echo $this->db->affected_rows();

}

}

//...

public function SomeFunctionWhereWeUseOurModel()

{

$this->load->model('Blogmodel');

$result=$this->Blogmodel->get_last_entries();

foreach($result->result() as $row)

echo $row->title.'<br/>';

foreach($row->result_array() as $row)

echo $row['title'].'<br/>';

$result=$this->Blogmodel->get_last_post();

$title=$result->row();

echo "our last post ".$title->title;

$title=$result->row_array();

echo "our last post ".$title['title'];

}

Continue reading “Model в CodeIgniter классически sql запросы и Active Record” »

Изометрическая графика, построение изометрической карты.

Октябрь 10th, 2011 § 0 comments § Прямая ссылка

Я заинтересовался вопросом об изометрической графике и нашел очень мало материалов по теме, постараюсь в цикле статей восполнить этот пробел. Начнем с самого простого. Что такое изометрическая графика? Это один из видов аксонометрической графики, при которой в отображении трехмерного объекта на плоскость коэффициенты искажения по всем трем осям одни и те же. Изометрическая проекция используется в машиностроительном черчении, а так же в компьютерных играх, здесь мы будем рассматривать последние. Изометрическая проекция может быть трех видов (хотя западные стандарты утверждают, что подходит только одна, это ортогональная). Обозначим эти проекции.

  • Ортогональная (прямоугольная)
  • Косоугольная фронтальная
  • Косоугольная горизонтальная

В прямоугольной проекции углы между аксонометрическими осями должны быть равны 120 градусов, ось Z направлена вертикально. Косоугольная фронтальная проекция ось Z направлена вертикально, угол между осями X и  Y составляет 135 градусов может быть 120, 150 градусов, кривые параллельные фронтальной плоскости строятся без искажений. Косоугольная горизонтальная проекция ось Z направлена вертикально между осью Z и Y угол 120 градусов может быть 135, 150 градусов, кривые параллельные горизонтальной плоскости строятся без искажений.

Не большой экскурс в основы закончен, материал, что выше вы можете найти в википедии вот ссылка. Перейдем теперь ближе к тематике игр. Способов реализации изометрии в играх можно выделить три.

  • Слайдовая (Slide map)
  • Шахматная (Staggered map)
  • Ромбическая (Diamond map)

Continue reading “Изометрическая графика, построение изометрической карты.” »

Смерть Стива Джобса

Октябрь 6th, 2011 § 0 comments § Прямая ссылка

Сегодня было опубликовано известие о смерти Стива Джобса. Я хочу немного помолчать, я это сделал, перед тем как напечатал это предложение. Сказать, что этот человек изменил индустрию, это сказать, что лимон кислый, что море соленое. Джобс является примером того как один человек может изменить мир, тот голубой шарик на котором мы живем, он современный Александр Великий, масштаб его личности можно понять по той преданной армии поклонников, что он собрал вокруг себя и они могли бы составить целое государство. Можно критиковать Aplle, не любить, даже ненавидеть, но вы не можете не знать об Apple. Продукты что дал нам Стив, навсегда изменили мир, и он уже не будет прежним, я могу гордиться тем, что он был моим современником, как кто-то когда то давно гордился тем, что жил во времена Генри Форда.

Основы работы с графикой Android (часть 2)

Сентябрь 27th, 2011 § 2 comments § Прямая ссылка

Это очень важный урок т.к. в нем мы организуем постоянное обновление рабочей области, которая будет составлять основу игрового цикла (game loop). Мы заменим класс View, классом ViewSurface, создадим еще один поток который будет постоянно обновлять рабочую область (канву). Ну что же меньше слов больше дела.

class Panel extends SurfaceView implements SurfaceHolder.Callback {
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    }
}

Continue reading “Основы работы с графикой Android (часть 2)” »

Смотреть фильмы онлайн