Пятница, 29 Ноября 2024, 02:33

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Заливка контура в текстуре
SarCasmДата: Понедельник, 20 Мая 2013, 16:26 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
На самом деле не ожидаю от сюда большой помощи, но все же может кто-то знает что-то.

Делаю игру-рисовалку. Нужно реализовать нормальную заливку фигур.
Я использую что-то типа рекурсии и зарисовываю части не точками, а линиями.

В коде ниже я использую Unity3d, но там в принципе всё должно быть интуитивно понятно:

Код

void Fill(IntVector2 pos, Texture2D canvas, Color newColor)
{
// For speed control
float time = Time.realtimeSinceStartup;
int  points=0;
// DEBUGGG

IntVector2 point;
Stack pixelStack = new Stack(); // point from where start filling
bool spanTop = false; // Does line above need to be filled?
bool spanBot = false; // below
Color oldColor = canvas.GetPixel(pos.x,pos.y); // Set color that will be replaced

pixelStack.Push(pos); // Start
while(pixelStack.Count>0) // Рекурсия
{
point =  pixelStack.Pop() as IntVector2; // Get new point
spanBot = false; spanTop = false;
while(point.x>=0 && canvas.GetPixel(point.x,point.y)==oldColor) // FInd most left pixel
{
point.x--;
}
point.x++;

// Start fill line from left to right
while(point.x<canvas.width && canvas.GetPixel(point.x,point.y)==oldColor) // until we meet another pixel
{
canvas.SetPixel(point.x,point.y,newColor);

// Is there line above needs filling?
if(spanTop==false && point.y>0 && canvas.GetPixel(point.x,point.y-1)==oldColor)
{
IntVector2 newpoint = new IntVector2(point.x,point.y-1);
pixelStack.Push(newpoint); // add new point from where we will start fill line
spanTop = true;
points++; // for debug
} else if(spanTop==true && point.y>0 && canvas.GetPixel(point.x,point.y-1)!=oldColor) {
spanTop = false;
}

// Below?
if(spanBot==false && point.y<canvas.height && canvas.GetPixel(point.x,point.y+1)==oldColor)
{
IntVector2 newpoint = new IntVector2(point.x,point.y+1);
pixelStack.Push(newpoint);
spanBot = true;
points++; // for debug
} else if(spanBot==true && point.y<canvas.height && canvas.GetPixel(point.x,point.y+1)!=oldColor) {
spanBot = false;
}
point.x++; // next pixet left->right
}

}
time = time - Time.realtimeSinceStartup; // for debug
canvas.Apply(); // Change material (takes rly little time)

print("CalculateTime:"+(-time)+", points detected:"+points);
}


Разрешение полотна: 900х675
Первый тест:
Простое белое полотно

CalculateTime:0.7691972, points detected:674

Второй тест:
Очень сложная фигура, небольшая по площади

CalculateTime:0.3095117, points detected: 19011

(линии оказались быстрее чем точки, может прямоугольники быстрее линий? ;D)


Моя игра Gamiron#11 - Тема Скачать

Сообщение отредактировал SarCasm - Понедельник, 20 Мая 2013, 16:27
andarkyДата: Вторник, 21 Мая 2013, 10:39 | Сообщение # 2
старожил
Сейчас нет на сайте
мне интересно
но я ничего не понял
C# незнаю sad

полгода назад уже поднимал тут подобную тему только на JS
никаких советов не получил...



Моя страничка по дизайну
GameDev//Design//3D
Ютубчик
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг