From cc600524cd14f8227c2f6e9f96e1750b35acaf43 Mon Sep 17 00:00:00 2001 From: Marco De Donno Date: Mon, 31 Jul 2017 23:50:39 +0200 Subject: [PATCH] Full featured live minutia annotation, AFIS style --- js/pianos4_annotation.js | 7 ++++- js/pianos4_tool_minutia.js | 59 ++++++++++++++++++-------------------- js/pianos4_view.js | 16 ++++++++--- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/js/pianos4_annotation.js b/js/pianos4_annotation.js index 439df66..e08b84c 100644 --- a/js/pianos4_annotation.js +++ b/js/pianos4_annotation.js @@ -33,7 +33,7 @@ Pianos4Annotation._s_pairIds = 1; /** * @constructor */ -function Pianos4Minutia( type, pos, angle ) +function Pianos4Minutia( type, pos, angle, live ) { assert( type == 'bifurcation' || type == 'ridge_ending' || type == 'center' || type == 'difference' || type == 'unknown' || type == 'unknown2' ); assert( angle >= -180.0 && angle <= 180.0 ); @@ -42,6 +42,11 @@ function Pianos4Minutia( type, pos, angle ) this.type = type; this.pos = pos; this.angle = angle; + + if( typeof( live ) === "undefined" ) + this.live = false; + else + this.live = live; } // ---------------------------- diff --git a/js/pianos4_tool_minutia.js b/js/pianos4_tool_minutia.js index 68350d4..6a04a30 100644 --- a/js/pianos4_tool_minutia.js +++ b/js/pianos4_tool_minutia.js @@ -81,15 +81,10 @@ function Pianos4ToolMinutia(params) if (!popup) { - line = view.getSVG().append('svg:line') - .attr('x1', pos[0]) - .attr('y1', pos[1]) - .attr('x2', pos[0]) - .attr('y2', pos[1]) - .style('stroke', params.lineColor) - .style('stroke-width', 1.0/view.getZoomFactor()) - ; - + var liveminu = new Pianos4Minutia("ridge_ending", pos, 0, true); + var action = new Pianos4Action_CreateAnnotation(view, 'minutia', liveminu); + pianos.exec( action ); + if (autoPair && !autoPairInfo) autoPairInfo = {view:view,first:null}; @@ -99,32 +94,38 @@ function Pianos4ToolMinutia(params) this.onMouseMove = function(pos) { - var dx = pos[ 0 ] - initpos[ 0 ]; - var dy = pos[ 1 ] - initpos[ 1 ]; - var d = Math.sqrt( dx * dx + dy * dy ); - var newx = initpos[ 0 ] + ( dx / d ) * markers.lq2 * markers.factor; - var newy = initpos[ 1 ] + ( dy / d ) * markers.lq2 * markers.factor; - if (!popup) { - line - .attr('x2', newx) - .attr('y2', newy) - ; + var dx = pos[ 0 ] - initpos[ 0 ]; + var dy = pos[ 1 ] - initpos[ 1 ]; + var d = Math.sqrt( dx * dx + dy * dy ); + var vn = [ dx / d, dy / d ]; + var newx = initpos[ 0 ] + vn[ 0 ] * markers.lq2 * markers.factor; + var newy = initpos[ 1 ] + vn[ 1 ] * markers.lq2 * markers.factor; + + var angle = Math.acos( vn[ 0 ] ); + if ( vn[ 1 ] < 0 ) + angle = -angle; + var degrees = 180.0 * angle / Math.PI; + var t = view.getSVG() + .select( "#liveminutia" ) + .attr( 'transform', 'translate( ' + initpos[ 0 ] + ', ' + initpos[ 1 ] + ' ) rotate( ' + degrees + ' )' ); + + endpos = pos; } } this.onMouseUp = function(pos, target, event) { - var pos0 = [parseFloat(line.attr('x1')), parseFloat(line.attr('y1'))]; - var pos1 = [parseFloat(line.attr('x2')), parseFloat(line.attr('y2'))]; + var pos0 = initpos; + var pos1 = endpos; if (popup) { - - line.remove(); - line = null; - + view.getSVG() + .select( "#liveminutia" ) + .remove(); + hidePopup(); if (popup.choice) @@ -137,6 +138,7 @@ function Pianos4ToolMinutia(params) var degrees = 180.0*angle/Math.PI; var minutia = new Pianos4Minutia(popup.choice, pos0, degrees); + minutia.live = false; var action; assert(!autoPair || autoPairInfo); @@ -205,8 +207,6 @@ function Pianos4ToolMinutia(params) if (n < 2) { assert(line && !popup); - line.remove(); - line = null; if (params.singleClickDeselects) view.selectAnnotation([], true); return true; @@ -222,9 +222,6 @@ function Pianos4ToolMinutia(params) this.cancel = function() { - if (line) - line.remove(); - line = null; if (popup) hidePopup(); popup = null; @@ -278,13 +275,13 @@ function Pianos4ToolMinutia(params) var self = this; var view = null; - var line = null; var popup = null; var options = null; var autoPair = false; var autoPairInfo = null; var markerSize = 4; var initpos = null; + var endpos = null; // ------------------------------ // Private functions diff --git a/js/pianos4_view.js b/js/pianos4_view.js index e84527e..2e819ca 100644 --- a/js/pianos4_view.js +++ b/js/pianos4_view.js @@ -272,10 +272,12 @@ function Pianos4View(params) this.addMinutia = function(minutia) { - assert(minutia && !(minutia.id in annotations.minutiae) && !(minutia.id in allAnnotations)); - annotations.minutiae[minutia.id] = minutia; - allAnnotations[minutia.id] = ['minutia', minutia]; - + if( ! minutia.live ) + { assert(minutia && !(minutia.id in annotations.minutiae) && !(minutia.id in allAnnotations)); + annotations.minutiae[minutia.id] = minutia; + allAnnotations[minutia.id] = ['minutia', minutia]; + } + onAnnotationAdded(minutia); drawMinutia(minutia); @@ -1137,6 +1139,7 @@ function Pianos4View(params) var minutiaData = [ {suffix: '', color: '#ff0000'}, {suffix: '_alt', color: '#ffff00'}, + {suffix: '_live', color: '#0000ff'}, ]; /* @@ -1824,6 +1827,11 @@ function Pianos4View(params) } } } + if( minutia.live === true ) + { + altSuffix = "_live"; + g.attr( "id", "liveminutia" ); + } // The minutia marker itself var min = g.append('svg:use') -- GitLab