Бордър на матрица

Не ми се получава нещо. Немога в switch да направя логиката правилно.
PHP:
$matrix = array(
        5 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
        6 => array(
                7 => "      ",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        7 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        8 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        9 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        10 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "      ",
        ),
        11 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        12 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        13 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        14 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        15 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        16 => array(
                7 => "e0e0e0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "e0e0e0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        17 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "e0e0e0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
);
print "<pre>";
foreach ($matrix as $y => $row) {
    print "<br>";
    foreach ($row as $x => $column) {
		$y_points = array($y-1,$y,$y+1);
		$x_points = array($x-1,$x,$x+1);
		$countEmpty = 0;
		foreach ($y_points as $y_v) {
			foreach ($x_points as $x_v) {
				if (isSet($matrix[$y_v][$x_v])) {
					if (empty($matrix[$y_v][$x_v])) {
						$countEmpty++;
					}
				}
			}
		}
		switch ($countEmpty) {
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
				print $matrix[$y][$x];
				break;
			default : 
				print "      ";				
		}
    }
}
print "</pre>";
 
Макар и по малко по-различен начин от както аз си го представях, изглежда съвсем правилно.

Проблемът ти е, че в матрицата записваш нулите като няколко спейса, и това минава проверката за isset. Записвай ги като null.
 
anonimen каза:
Макар и по малко по-различен начин от както аз си го представях, изглежда съвсем правилно.

Проблемът ти е, че в матрицата записваш нулите като няколко спейса, и това минава проверката за isset. Записвай ги като null.

if (isSet($matrix[$y_v][$x_v])) {

Проверява дали $matrix[$y-1][$x-1] кординати съществуват и ако съществуват то се проверява дали пиксела е празен или не. Немога да определя крайните пиксели да останат. Незнам как да го направя. Чудя се дали да не направя така, че ако е обграден с 7/8 пиксела пълни да премахва го премахва.
 
dakata__92 каза:
anonimen каза:
Макар и по малко по-различен начин от както аз си го представях, изглежда съвсем правилно.

Проблемът ти е, че в матрицата записваш нулите като няколко спейса, и това минава проверката за isset. Записвай ги като null.

if (isSet($matrix[$y_v][$x_v])) {

Проверява дали $matrix[$y-1][$x-1] кординати съществуват и ако съществуват то се проверява дали пиксела е празен или не. Немога да определя крайните пиксели да останат. Незнам как да го направя. Чудя се дали да не направя така, че ако е обграден с 7/8 пиксела пълни да премахва го премахва.
Да, защото empty(' [няколко спейса] ") връща false.

А по-горе си прав. (за isset-a, не бях видял че имаш после и empty())
 
if (isSet($matrix[$y_v][$x_v])) {
if (empty($matrix[$y_v][$x_v])) {
никога няма да минеш и двете проверки, защото нямаш false в $matrix.

Сравнявай така:
Код:
 if($matrix[x][y] == "      ")
(с колкото спейса ползваш в $matrix
 
anonimen каза:
if (isSet($matrix[$y_v][$x_v])) {
if (empty($matrix[$y_v][$x_v])) {
никога няма да минеш и двете проверки, защото нямаш false в $matrix.

Сравнявай така:
Код:
 if($matrix[x][y] == "      ")
(с колкото спейса ползваш в $matrix

Дааа разбрах те. Но нещо не ми се получава отново. Да работи в момента но немога да анализирам да оставя крайните пиксели. Как да го направя?

PHP:
$matrix = array(
        5 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
        6 => array(
                7 => "      ",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        7 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        8 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        9 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        10 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "      ",
        ),
        11 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        12 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        13 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        14 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        15 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        16 => array(
                7 => "e0e0e0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "e0e0e0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        17 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "e0e0e0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
);
print "<pre>";
foreach ($matrix as $y => $row) {
    print "<br>";
    foreach ($row as $x => $column) {
        $y_points = array($y-1,$y,$y+1);
        $x_points = array($x-1,$x,$x+1);
        $countEmpty = 0;
        foreach ($y_points as $y_v) {
            foreach ($x_points as $x_v) {
                if (isSet($matrix[$y_v][$x_v])) {
					if ($matrix[$y_v][$x_v] == "      ") {
						$countEmpty++;
					}
				}
			}
        }
        switch ($countEmpty) {
            case 1:
                print $matrix[$y][$x];
                break;
            default : 
                print "      ";                         
        }
    }
}
print "</pre>";
 
Защо ползваш switch за сравняване на числа??
Код:
        switch ($countEmpty) {
            case 1:
                print $matrix[$y][$x];
                break;
            default : 
                print "      ";                         
        }

Просто така:
PHP:
if ($countEmpty) { // има празни наоколо => краен пиксел
 print "X";
}
else {  // няма празни наоколо => вътрешен пиксел
print " "; }
 
И аз се досетих за този пример, но ако имаш време да пуснеш този код, ще видиш, че не върши това което искаме да извеждаме. Редуцира цифрата но не прави пълното отсяване на ненужните пиксели и изобщо не отсява пълнежа. Примерно виждам, че се опитва по този начин да намали шумовете ама нещо пак не се получава. Постави кода тук и тествай: http://phptester.net/

PHP:
$matrix = array(
        5 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
        6 => array(
                7 => "      ",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        7 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        8 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        9 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "      ",
                13 => "      ",
                14 => "      ",
        ),
        10 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "      ",
        ),
        11 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        12 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        13 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        14 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        15 => array(
                7 => "f0f0f0",
                8 => "f0f0f0",
                9 => "f0f0f0",
                10 => "      ",
                11 => "      ",
                12 => "f0f0f0",
                13 => "f0f0f0",
                14 => "f0f0f0",
        ),
        16 => array(
                7 => "e0e0e0",
                8 => "f0f0f0",
                9 => "e0e0e0",
                10 => "f0f0f0",
                11 => "f0f0f0",
                12 => "e0e0e0",
                13 => "f0f0f0",
                14 => "e0e0e0",
        ),
        17 => array(
                7 => "      ",
                8 => "      ",
                9 => "f0f0f0",
                10 => "f0f0f0",
                11 => "e0e0e0",
                12 => "f0f0f0",
                13 => "      ",
                14 => "      ",
        ),
);
print "<pre>";
foreach ($matrix as $y => $row) {
    print "<br>";
    foreach ($row as $x => $column) {
        $y_points = array($y-1,$y,$y+1);
        $x_points = array($x-1,$x,$x+1);
        $countEmpty = 0;
        foreach ($y_points as $y_v) {
            foreach ($x_points as $x_v) {
                if (isSet($matrix[$y_v][$x_v])) {
					if ($matrix[$y_v][$x_v] == "      ") {
						$countEmpty++;
					}
				}
			}
        }
        if ($countEmpty) {
			print $matrix[$y][$x];                     
        } else {
			print "      "; 
		}
    }
}
print "</pre>";
 
Условието за един пиксел да бъде краен е да се случи поне едно от двете:

1. Има празен пиксел наоколо ($matrix[$y_v][$x_v] == " ")
2. Не съществува пиксел наоколо (empty($matrix[$y_v][$x_v]))

Значи условието, при което правиш $countEmpty++ трябва да бъде (1. || 2.), а ти си го направил така: (!1. && 2.)
 
anonimen каза:
Условието за един пиксел да бъде краен е да се случи поне едно от двете:

1. Има празен пиксел наоколо ($matrix[$y_v][$x_v] == " ")
2. Не съществува пиксел наоколо (empty($matrix[$y_v][$x_v]))

Значи условието, при което правиш $countEmpty++ трябва да бъде (1. || 2.), а ти си го направил така: (!1. && 2.)
Колега пробвах какво ли не и не ми се получава. Можеш ли тази извадка в логиката да ми я коригираш, за да се получи правилно разпределението? Извинявам ти се предварително, защото нещо съм тотално забил вече по темата...
PHP:
        $y_points = array($y-1,$y,$y+1);
        $x_points = array($x-1,$x,$x+1);
        $countEmpty = 0;
        foreach ($y_points as $y_v) {
            foreach ($x_points as $x_v) {
                if (isSet($matrix[$y_v][$x_v]) and $matrix[$y_v][$x_v] == "      ") {
                    $countEmpty++;
                }
            }
        }
        if ($countEmpty > 0) {
            print $matrix[$y][$x];                     
        } else {
			print "      "; 
        }
 
Значи условието, при което правиш $countEmpty++ трябва да бъде (1. || 2.), а ти си го направил така: (!1. && 2.)
А ти ти го направил така:
if (isSet($matrix[$y_v][$x_v]) and $matrix[$y_v][$x_v] == " ") {

Или няма пиксел наоколо, или има празен наоколо - условие за краен пиксел.
Значи (трябва да) ползваш OR (||), а не AND (&&) :P
 
Пак ще се цитирам:


1. Има празен пиксел наоколо ($matrix[$y_v][$x_v] == " ")
2. Не съществува пиксел наоколо (empty($matrix[$y_v][$x_v]))

Значи условието, при което правиш $countEmpty++ трябва да бъде (1. || 2.)

Код:
if (empty($matrix[$y_v][$x_v])|| $matrix[$y_v][$x_v] == "      ") {

И резултатът е: :)

Код:
            f0f0f0f0f0f0f0f0f0f0f0f0            
      f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0e0e0e0
f0f0f0f0f0f0f0f0f0            f0f0f0f0f0f0f0f0f0
f0f0f0      f0f0f0                              
f0f0f0      f0f0f0                              
f0f0f0      f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0      
f0f0f0      e0e0e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0
f0f0f0      f0f0f0            f0f0f0      e0e0e0
f0f0f0      f0f0f0            f0f0f0      f0f0f0
f0f0f0      f0f0f0            f0f0f0      f0f0f0
f0f0f0      f0f0f0            f0f0f0      f0f0f0
e0e0e0f0f0f0e0e0e0f0f0f0f0f0f0e0e0e0f0f0f0e0e0e0
            f0f0f0f0f0f0e0e0e0f0f0f0

П.п. с хиксчета е по-красиво:

Код:
      xxxxxxxxxxxx      
   xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx      xxxxxxxxx
xxx   xxx               
xxx   xxx               
xxx   xxxxxxxxxxxxxxx   
xxx   xxxxxxxxxxxxxxxxxx
xxx   xxx      xxx   xxx
xxx   xxx      xxx   xxx
xxx   xxx      xxx   xxx
xxx   xxx      xxx   xxx
xxxxxxxxxxxxxxxxxxxxxxxx
      xxxxxxxxxxxx
 
Суууупер, браво браво. Направо ми е било пред очите постоянно ама тъпоглавец съм, с този isset все се насмотах. А въпросче имам, мога ли да направя така, че да редуцирам същата матрица вместо да е с външните контури както е сега, да остава само един ред примерно пиксели, тоест да редуцирам и намалявам пикселите от много на 1 ред или колона или по диагонал. Тоест цифрата вместо да е одебелена да се изписва с една линия?

+1 Имаш ама ще го позабавя малко заради горният въпрос! :?: :?: :?: :?:
 
dakata__92 каза:
Суууупер, браво браво. Направо ми е било пред очите постоянно ама тъпоглавец съм, с този isset все се насмотах. А въпросче имам, мога ли да направя така, че да редуцирам същата матрица вместо да е с външните контури както е сега, да остава само един ред примерно пиксели, тоест да редуцирам и намалявам пикселите от много на 1 ред или колона или по диагонал. Тоест цифрата вместо да е одебелена да се изписва с една линия?

+1 Имаш ама ще го позабавя малко заради горният въпрос! :?: :?: :?: :?:
Малко по-горе каза, че изображенията са векторни. Не можеш ли още оттам вместо да генерираш матрица, направо да начертаеш линиите?
 
anonimen каза:
dakata__92 каза:
Суууупер, браво браво. Направо ми е било пред очите постоянно ама тъпоглавец съм, с този isset все се насмотах. А въпросче имам, мога ли да направя така, че да редуцирам същата матрица вместо да е с външните контури както е сега, да остава само един ред примерно пиксели, тоест да редуцирам и намалявам пикселите от много на 1 ред или колона или по диагонал. Тоест цифрата вместо да е одебелена да се изписва с една линия?

+1 Имаш ама ще го позабавя малко заради горният въпрос! :?: :?: :?: :?:
Малко по-горе каза, че изображенията са векторни. Не можеш ли още оттам вместо да генерираш матрица, направо да начертаеш линиите?

Изображенията не трябва да ги пипам. Те трябва да са оригинални. Цялата работа задължително трябва да е през матрицата. :(
 
Да преобразуваш матрицата в тънки цифри ще бъде доста по-трудно от чертаенето на контура, защото нямаш ясно определени правила, по които да напишеш кода.

Нарисувай си цифрата в някой туул с квадратчета и се опитай ръчно да изтъниш линиите. След това създай някакви правила, по които ще стане изтъняването и чак тогава ще можеш да пишеш код.
 
anonimen каза:
Да преобразуваш матрицата в тънки цифри ще бъде доста по-трудно от чертаенето на контура, защото нямаш ясно определени правила, по които да напишеш кода.

Нарисувай си цифрата в някой туул с квадратчета и се опитай ръчно да изтъниш линиите. След това създай някакви правила, по които ще стане изтъняването и чак тогава ще можеш да пишеш код.

Ако се проверява около пиксела дали има други пиксели и ако има те от ляво на пиксела да се изтриват винаги ако отдясно на него има пиксел то тогава ще имам логиката да изтънявам кода.
 
dakata__92 каза:
anonimen каза:
Да преобразуваш матрицата в тънки цифри ще бъде доста по-трудно от чертаенето на контура, защото нямаш ясно определени правила, по които да напишеш кода.

Нарисувай си цифрата в някой туул с квадратчета и се опитай ръчно да изтъниш линиите. След това създай някакви правила, по които ще стане изтъняването и чак тогава ще можеш да пишеш код.

Ако се проверява около пиксела дали има други пиксели и ако има те от ляво на пиксела да се изтриват винаги ако отдясно на него има пиксел то тогава ще имам логиката да изтънявам кода.
Това няма да работи съвсем. Представи си хоризонтална линия с дебелина 3 пиксела. Например матрица 10х3. По твоята логика ще изтриеш цялата линия (ако триеш пиксел, когато отляво има други пиксели). По-сложно е...
 

Back
Горе