Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2017, 22:15   #1
vladrrom
Пользователь
 
Регистрация: 14.12.2016
Сообщений: 54
По умолчанию Алгоритмы закраски (растеризация области) - C++/CLI WinForms

Здравствуйте, подскажите, пожалуйста, как переделать "Алгоритм построчной заливки области.pdf" в "Алгоритм заливки области.pdf"?

Алгоритм построчной заливки области:
Код:
stack <float> Sx;
    stack <float> Sy;
    System::Drawing::Graphics^ g = System::Drawing::Graphics::FromImage(image);
    point z = inside(P);
    Sx.push(z.x);
    Sy.push(z.y);
    while (!Sx.empty())
    {
        point p;
        p.x = Sx.top();
        p.y = Sy.top();
        Sy.pop();
        Sx.pop();
        System::Drawing::Pen^ blackPen = gcnew System::Drawing::Pen(C);
        System::Drawing::Color pixelColor = image->GetPixel(p.x, p.y);
        if ((pixelColor.ToArgb() != C.ToArgb()))
        {
            float xmin, xmax;
            xmin = p.x;
            xmax = p.x;
            System::Drawing::Color mincolor = image->GetPixel(xmin - 1, p.y);
            while ((mincolor.ToArgb() != C.ToArgb()))
            {
                xmin--;
                mincolor = image->GetPixel(xmin, p.y);
            }
            System::Drawing::Color maxcolor = image->GetPixel(xmax + 1, p.y);
            while ((maxcolor.ToArgb() != C.ToArgb()))
            {
                xmax++;
                maxcolor = image->GetPixel(xmax, p.y);
            }
            g->DrawLine(blackPen, xmin, p.y, xmax, p.y);
            for (float x = xmin + 1; x < xmax + 1; ++x)
            {
                System::Drawing::Color mincolor1 = image->GetPixel(x, p.y + 1);
                System::Drawing::Color mincolor2 = image->GetPixel(x, p.y - 1);
                if ((C.ToArgb() != image->GetPixel(x, p.y + 1).ToArgb()))
                {
                    Sx.push(x);
                    Sy.push(p.y + 1);
                }
                if ((C.ToArgb() != image->GetPixel(x, p.y - 1).ToArgb()))
                {
                    Sx.push(x);
                    Sy.push(p.y - 1);
                }
            }
        }
    }
Вложения
Тип файла: pdf Алгоритм заливки области.pdf (77.9 Кб, 10 просмотров)
Тип файла: pdf Алгоритм построчной заливки области.pdf (81.5 Кб, 10 просмотров)
vladrrom вне форума Ответить с цитированием
Старый 17.12.2017, 22:13   #2
vladrrom
Пользователь
 
Регистрация: 14.12.2016
Сообщений: 54
По умолчанию

Пожалуйста, проверьте.. Так ли..?
Код:
void Pfill(polygon^ P, System::Drawing::Bitmap^ image, System::Drawing::Color C)
{
	stack <float> Sx;
	stack <float> Sy;
	
	System::Drawing::Graphics^ g = System::Drawing::Graphics::FromImage(image);
	point z = inside(P);
	image->SetPixel(z.x, z.y, C);
	Sx.push(z.x);
	Sy.push(z.y);
	while (!Sx.empty())
	{
		point p;
		p.x = Sx.top();
		p.y = Sy.top();
		Sy.pop();
		Sx.pop();
		
		// (p.x-1, p.y) 
		System::Drawing::Color C1 = image->GetPixel(p.x-1, p.y);
		if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
		{
			image->SetPixel(z.x, z.y, C);
			Sx.push(z.x);
			Sy.push(z.y);
		}
		else 
		{
			// (p.x+1, p.y)
			System::Drawing::Color C1 = image->GetPixel(p.x+1, p.y);
			if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
			{
				image->SetPixel(z.x, z.y, C);
				Sx.push(z.x);
				Sy.push(z.y);
			}
			else
			{
				// (p.x, p.y-1)
				System::Drawing::Color C1 = image->GetPixel(p.x, p.y-1);
				if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
				{
					image->SetPixel(z.x, z.y, C);
					Sx.push(z.x);
					Sy.push(z.y);
				}
				else
				{
					// (p.x, p.y+1)
					System::Drawing::Color C1 = image->GetPixel(p.x, p.y+1);
					if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
					{
						image->SetPixel(z.x, z.y, C);
						Sx.push(z.x);
						Sy.push(z.y); 
					}
				}
			}
		}
	}
}
vladrrom вне форума Ответить с цитированием
Старый 18.12.2017, 10:40   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А что проверять. Закрашивает полигон или нет? Картинку то покажите с результатом работы там все станет ясно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 19.12.2017, 01:08   #4
vladrrom
Пользователь
 
Регистрация: 14.12.2016
Сообщений: 54
По умолчанию

Чуть подправил.. но всё равно не закрашивает полностью..
Код:
void Pfill(polygon^ P, System::Drawing::Bitmap^ image, System::Drawing::Color C)
{
	stack <float> Sx;
	stack <float> Sy;
	
	System::Drawing::Graphics^ g = System::Drawing::Graphics::FromImage(image);
	point z = inside(P);
	image->SetPixel(z.x, z.y, C);
	Sx.push(z.x);
	Sy.push(z.y);
	while (!Sx.empty())
	{
		point p;
		p.x = Sx.top();
		p.y = Sy.top();
		Sy.pop();
		Sx.pop();
		
		// (p.x-1, p.y) 
		System::Drawing::Color C1 = image->GetPixel(p.x-1, p.y);
		if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
		{
			image->SetPixel(p.x-1, p.y, C);
			Sx.push(p.x-1);
			Sy.push(p.y);
		}
		else 
		{
			// (p.x+1, p.y)
			System::Drawing::Color C1 = image->GetPixel(p.x+1, p.y);
			if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
			{
				image->SetPixel(p.x+1, p.y, C);
				Sx.push(p.x+1);
				Sy.push(p.y);
			}
			else
			{
				// (p.x, p.y-1)
				System::Drawing::Color C1 = image->GetPixel(p.x, p.y-1);
				if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
				{
					image->SetPixel(p.x, p.y-1, C);
					Sx.push(p.x);
					Sy.push(p.y-1);
				}
				else
				{
					// (p.x, p.y+1)
					System::Drawing::Color C1 = image->GetPixel(p.x, p.y+1);
					if ((C1.ToArgb() != C.ToArgb()) && (C1.ToArgb() != C.ToArgb()))
					{
						image->SetPixel(p.x, p.y+1, C);
						Sx.push(p.x);
						Sy.push(p.y+1); 
					}
				}
			}
		}
	}
}
Изображения
Тип файла: png Screenshot_2.png (12.3 Кб, 66 просмотров)
vladrrom вне форума Ответить с цитированием
Старый 19.12.2017, 02:12   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Зачем все эти else?
Должно быть 4 if, которые срабатывают независимо, хоть все 4 сразу.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение первой цифры из текстового файла - C++/CLI WinForms Максим161174 Visual C++ 0 23.05.2017 23:56
Дать названия строкам в datagridview WinForms C++/CLI Вероника99 Помощь студентам 0 08.10.2016 18:28
Помогите исправить ошибки C++/CLI WinForms Андрей_ПИ-52 Общие вопросы .NET 3 06.07.2016 13:07
Надо решить задачу используя Label, Edіt, Button - C++/CLI WinForms qwe32 Помощь студентам 3 26.05.2016 15:20
C++/CLI WinForms - Вызов метода в dll и получения ошибки error C3767: функции-кандидаты недоступны Konstantin1706 Windows Forms 5 10.06.2015 15:57