В настоящее время я работаю над оптимизацией моего проекта, которому уже несколько лет. Цель состоит в том, чтобы нарисовать изображение после нажатия определенной комбинации клавиш. Оригинальная версия, которую я сделал несколько лет назад, вручную переместилась в каждый квадратный раздел, но я недавно оптимизировал ее, чтобы рисовать прямоугольники для последовательных квадратов, что делает ее намного быстрее.Алгоритм для минимизации количества линий для рисования?
Следующим шагом, который я хочу предпринять, является оптимизация способа, которым программа рисует данный макет, но я не знаю, с чего начать искать. Я надеюсь, что кто-то может указать мне в правильном направлении, так как я даже не могу думать о поисковом термине для этого.
В настоящее время программа имеет функцию под названием Draw
, который принимает входной сигнал, как это:
Invader =
(
00100000100
00010001000
00111111100
01101110110
11111111111
10111111101
10100000101
00011011000
)
Draw(Invader, 10) ; Where 10 is the size in pixels of each square
Компоновка выше для этого изображения:
Жеребьевка этот макет и рисовать это сверху вниз, слева направо следующим образом:
Для завершения изображения требуется 18 отдельных разделов. Я ищу некоторый алгоритм, который может минимизировать это число. Например, следующее является одним из немногих способов, имеющих только 16 разделов:
Кроме того, разница между текущим образом и то, что я только что сделал на месте для этого изображения 19 (65 по сравнению с 46).
Где я должен начать с этого?
Также для справки, вот текущая функция Draw:
Draw(Layout, BlockSize)
{
Len := StrLen(Layout) ; Total amount of characters
RowSize := StrLen(StrSplit(Layout, "`n")[1]) ; Size of a single row
Index := 0
While (Index < Len)
{
Length := 1
Char := GetChar(Layout, Index) ; Get next character in string
if (Char == "1")
{
; Get the number of consecutive 1s
While (GetChar(Layout, Index + Length) == "1")
{
Length := Length + 1
}
; Draw the rectangle
FillRectangle(Length, BlockSize)
}
else if (Char == "0")
{
; Get the number of consecutive 0s
While (GetChar(Layout, Index + Length) == "0")
{
Length := Length + 1
}
; Skip the entire length
MouseMove, BlockSize * Length, 0, 0, R
}
else
{
; End of line, reset position
MouseMove, -(RowSize * BlockSize), BlockSize, 0, R
}
Index := Index + Length
}
}
FillRectangle(Width, BlockSize)
{
MouseGetPos, mX, mY
mY2 := mY ; Same Y for straight line
mX2 := mX + Width * BlockSize ; Add Width of rectangle times the block size to get final X position
Loop %BlockSize%
{
; Draw line
MouseClickDrag, L, mX, mY, mX2, mY2
; Move to next line
mY -= 1
mY2 -= 1
}
; Move mouse to next position
MouseMove, 0, BlockSize - 1, 0, R
}
GetChar(String, Index)
{
return SubStr(String, Index, 1)
}
, что проблема разложения для прямолинейных полигонов. До сих пор для полигонов с отверстиями известны только приближения. И ни один из этих алгоритмов не прост в реализации. – Paul
@Paul Спасибо, что дали ему имя. Это выглядит довольно сложнее, чем я себе представлял, но я постараюсь посмотреть, что с этим делать. До сих пор я не нашел ничего, что много покрывало многоугольников с отверстиями, что не является многообещающим. – ozdrgnaDiies
Я нашел некоторые ресурсы. Я прокомментирую ссылку, когда я буду дома – Paul