diff --git a/src/Models/Hit.php b/src/Models/Hit.php index 55f9670..ef7505e 100644 --- a/src/Models/Hit.php +++ b/src/Models/Hit.php @@ -143,7 +143,7 @@ class Hit /** * Gets the value of points. * - * @return mixed + * @return Points */ public function getPoints() { @@ -196,7 +196,7 @@ class Hit /** * @param string $feature - * @return string + * @return string|false false if not exists * @throws \Exception */ public function getFeatureFilename(string $feature) { @@ -1327,6 +1327,55 @@ class Points{ $this->{"point".$nr} = new Point($x, $y); } return $this; + + $a = $this->getNormalisedPoints(); + + } + + /** + * @return array[Point] + */ + public function getAsArray() { + $points = []; + foreach(range(0, 33) as $i) { + $points[$i] = $this->{"point$i"}; + } + return $points; + } + + /** + * Fits points within a 100x100 scale + * @return array[Point] + */ + public function getNormalisedPoints() { + $points = $this->getAsArray(); + $xs = array_map(function(Point $a){return $a->getX();}, $points); + $ys = array_map(function(Point $a){return $a->getX();}, $points); + + $minx = min($xs); + $maxx = max($xs); + + $miny = min($ys); + $maxy = max($ys); + + $sizex = $maxx-$minx; + $sizey = $maxy-$miny; + + $scale = max($sizex, $sizey); // divide by largest diff. + + //used to center the face within the square: + $diffx = ($scale - $sizex)/2; + $diffy = ($scale - $sizey)/2; + + $normalised_points = []; + foreach($points as $i => $point) { + $x = (($point->getX() - $minx) / $scale) + $diffx; + $y = (($point->getY() - $miny) / $scale) + $diffy; + + $normalised_points[$i] = new Point($x, $y); + } + + return $normalised_points; } } @@ -1350,4 +1399,18 @@ class Point{ $this->x = $x; $this->y = $y; } + + /** + * @return float + */ + public function getX() { + return $this->x; + } + + /** + * @return float + */ + public function getY() { + return $this->y; + } } \ No newline at end of file diff --git a/www/faces.php b/www/faces.php index 023959f..04c6329 100644 --- a/www/faces.php +++ b/www/faces.php @@ -5,9 +5,28 @@ error_reporting(E_ALL);ini_set('display_errors', true); $em = \EmotionHero\Application::getInstance()->getEm(); $hitRepo = $em->getRepository(\EmotionHero\Models\Hit::class); -$currentEmotion = 'anger'; +/* @var $currentHit \EmotionHero\Models\Hit */ +$currentHit = $hitRepo->findOneBy(['hasImage'=>true], ['id'=>'DESC']); + +$printEmoBlocks = function($emotion, $feature, $steps = 6) use($em) { + foreach(range(0, 100, 100/($steps-1)) as $i) { + /* @var $hitRepo EmotionHero\Models\HitRepository */ + $hitRepo = $em->getRepository(EmotionHero\Models\Hit::class); + $hit = $hitRepo->getClosestHitWithImage($emotion, $i); + $img = $hit->getFeatureImgAsString($feature); + $score = $hit->getEmotions()->getEmotionScore($emotion); + + $percentage = sprintf("%.0f %%",$score); + echo <<< EOSNIPPET +
+ + + $percentage +
+EOSNIPPET; + } +}; -$hits = $hitRepo->findBy([], ["emotions.$currentEmotion"=>'ASC']); ?> @@ -20,42 +39,130 @@ $hits = $hitRepo->findBy([], ["emotions.$currentEmotion"=>'ASC']); font-family:"Unifont"; font-weight:bold; } + + .block{ + width:150px; + } + img{ + width:100%; + filter:saturate(0%); + mix-blend-mode: multiply; + /*mix-blend-mode: exclusion;*/ + } + + .nose .block{ + width:70px; + } + .perc{ + display:block; + width:100%; +text-align:center; + } + + .emo-block{ + float:left; + margin-right:10px; +text-align:center; + + + } +.emo-block-emos{ +position:relative; +} + + .emo{ + text-align:center; + + } + .brows{ + width:650px; + } + .nose{ + width:240px; + } + + .current{ +width:200px; +margin:0 auto; +} + img.curImg{ + position:absolute; + left:0; + mix-blend-mode:difference; + } + getRepository(EmotionHero\Models\Hit::class); - $hit = $hitRepo->getClosestHitWithImage("anger", $i); - $img = $hit->getFeatureImgAsString("brows"); - $score = $hit->getEmotions()->getEmotionScore("anger"); - - $percentage = sprintf("%.4f %%",$score); - echo <<< EOSNIPPET -
-$percentage - -
-EOSNIPPET; +echo "
"; +echo "getFeatureImgAsString("brows")}\" title=\"{$currentHit->getId()}\">"; +echo "
"; +foreach(EmotionHero\Models\Emotions::$EMOTIONS as $emotion) { + echo "
$emotion
" . sprintf("$.2f", $currentHit->getEmotions()->getEmotionScore($emotion)) . "
"; +} +echo "
"; +echo "
"; + +echo "

eye brows

"; +echo "
anger
"; +$printEmoBlocks('anger','brows'); +echo "getFeatureImgAsString("brows")}\" title=\"{$currentHit->getId()}\" style=\"top:{$currentHit->getEmotions()->getAnger()}%\">"; +echo "
"; + +echo "
joy
"; +$printEmoBlocks('joy','brows'); +echo "getFeatureImgAsString("brows")}\" title=\"{$currentHit->getId()}\" style=\"top:{$currentHit->getEmotions()->getJoy()}%\">"; +echo "
"; + +echo "
sadness
"; +$printEmoBlocks('sadness','brows'); +echo "getFeatureImgAsString("brows")}\" title=\"{$currentHit->getId()}\" style=\"top:{$currentHit->getEmotions()->getSadness()}%\">"; +echo "
"; + +echo "
surprise
"; +$printEmoBlocks('surprise','brows'); +echo "getFeatureImgAsString("brows")}\" title=\"{$currentHit->getId()}\" style=\"top:{$currentHit->getEmotions()->getSurprise()}%\">"; +echo "
"; +echo "
"; // .brows + + +echo "

nose

"; +echo "
anger"; +$printEmoBlocks('joy','nose'); +echo "
"; + +echo "
joy"; +$printEmoBlocks('disgust','nose'); +echo "
"; + +echo "
sadness"; +$printEmoBlocks('sadness','nose'); +echo "
"; +echo "
"; // .nose + +$circles = ""; +foreach($currentHit->getPoints()->getNormalisedPoints() as $i => $point) { + $circles .= ''; } -/* @var $hit EmotionHero\Models\Hit */ -foreach($hits as $hit) { - $filename = __DIR__ . '/../files/hits/brows/'. $hit->getId() . '.jpg'; - if(!file_exists($filename)) - continue; - - $img = file_get_contents($filename); - $data = base64_encode($img); - $percentage = sprintf("%.4f %%",$hit->getEmotions()->getEmotionScore($currentEmotion)); - echo <<< EOSNIPPET -
-$percentage - -
-EOSNIPPET; -} +echo <<< EOSVG + + + $circles + + +EOSVG; ?> \ No newline at end of file