Mercurial > hg > digilib
changeset 1372:5da9dc7b5f42
finished oval construction
author | hertzhaft |
---|---|
date | Tue, 24 Feb 2015 01:28:52 +0100 |
parents | a71ca1a6251c |
children | 81ece2629d42 |
files | webapp/src/main/webapp/jquery/jquery.digilib.measure.js |
diffstat | 1 files changed, 53 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.measure.js Mon Feb 23 17:51:22 2015 +0100 +++ b/webapp/src/main/webapp/jquery/jquery.digilib.measure.js Tue Feb 24 01:28:52 2015 +0100 @@ -720,7 +720,7 @@ Polygon : { name : 'polygon', display : 'area' }, Circle : { name : 'circle', display : 'radius' }, Ellipse : { name : 'ellipse', display : 'area' }, - Oval : { name : 'oval', display : 'length' }, + Oval : { name : 'oval', display : 'axis' }, Grid : { name : 'linegrid', display : 'spacing' } }, // currently selected shape type @@ -863,15 +863,22 @@ // calculate the distance of the first 2 points of a shape (rectified digilib coords) var rectifiedDist = function(data, shape) { var coords = shape.geometry.coordinates; - var total = 0; - var pos1 = geom.position(coords[0]); - for (i = 1; i < coords.length; i++) { - var pos2 = geom.position(coords[i]); - var dist = fn.getDistance(data, pos1, pos2); - total += dist.rectified; - pos1 = pos2; + if (shape.geometry.type === 'LineString') { + var pos1 = geom.position(coords[0]); + var total = 0; + for (i = 1; i < coords.length; i++) { + var pos2 = geom.position(coords[i]); + var dist = fn.getDistance(data, pos1, pos2); + total += dist.rectified; + pos1 = pos2; + } + return total; + } else { + var v = shape.properties.vtx; + if (v === 0) {v = 1} + var dist = fn.getDistance(data, geom.position(coords[v]), geom.position(coords[v-1])); + return dist.rectified; } - return total; }; // calculate the area of a polygon (rectified digilib coords) @@ -1214,44 +1221,51 @@ var $c2 = $(fn.svgElement('circle', {'id': shape.id + '-circ2', 'class': guide })); var $p1 = $(fn.svgElement('path', {'id': shape.id + '-lines', 'class': guide })); var $p2 = $(fn.svgElement('path', {'id': shape.id + '-arc', stroke: props.stroke, fill: 'none' })); + // var $p3 = $(fn.svgElement('path', {stroke: 'yellow', fill: 'none' })); // debug construction $g.append($s).append($c1).append($c2).append($p1).append($p2); $g.place = function () { var p = props.screenpos; - place.call($s); + place.call($s); // place the framing rectangle (polygon) if (p.length > 3) { // p[3] is the mouse pointer var side0 = geom.line(p[0], p[1]) var side1 = geom.line(p[1], props.pos[0]); var side2 = geom.line(props.pos[0], props.pos[1]); var side3 = geom.line(props.pos[1], p[0]); - var pt0 = side0.mid(); // midpoint of base line - var axis1 = geom.line(p[2], pt0); // longitudinal axis - var handle = axis1.perpendicularPoint(p[3]); // drag point projected on axis - var mp1 = handle.mid(p[2]); // midpoint of first small circle - var rad1 = mp1.distance(p[2]); // radius of small circles - var mp2 = geom.line(pt0, p[2]).length(rad1).point(); // midpoint of second small circle - var pt1 = side1.mid(); // midpoints of long axis - var pt2 = side3.mid(); - var axis2 = side0.parallel(pt2); // short axis - var pt3 = axis2.copy().length(rad1).point(); // radius distance from short axis - var mp3 = axis2.intersection(geom.line(pt3, mp1).perpendicular(pt2.mid(mp1))); // perpendicular bisector - var mp4 = axis1.mirror(mp3); - var sp1 = geom.line(mp3, mp1).addEnd(rad1); // the lozenge of midpoints - var sp2 = geom.line(mp3, mp2).addEnd(rad1); - var sp3 = geom.line(mp4, mp1).addEnd(rad1); - var sp4 = geom.line(mp4, mp2).addEnd(rad1); - var rad2 = mp3.distance(sp1); // radius of big circles - $c1.attr({cx: mp1.x, cy: mp1.y, r: rad1}); - $c2.attr({cx: mp2.x, cy: mp2.y, r: rad1}); - $p1.attr({d: - 'M'+sp1+' L'+mp3+' '+sp2+ - 'M'+sp3+' L'+mp4+' '+sp4+ - 'M'+pt0+' L'+p[2]+ - 'M'+pt1+' L'+pt2}); - $p2.attr({d: 'M'+sp2+ - ' A'+rad2+','+rad2+' 0 0,1 '+sp1+ - ' A'+rad1+','+rad1+' 0 0,1 '+sp3+ - ' A'+rad2+','+rad2+' 0 0,1 '+sp4+ - ' A'+rad1+','+rad1+' 0 0,1 '+sp2}); + var mid0 = side0.mid(); // midpoints of sides + var mid1 = side1.mid(); + var mid2 = side2.mid(); + var mid3 = side3.mid(); + var axis0 = side0.parallel(mid3); // short axis + var axis1 = side1.parallel(mid0); // long axis + var handle = axis1.perpendicularPoint(p[3]); // drag point projected on long axis + var m1 = handle.mid(mid2); // midpoints of the small circles + var m2 = axis0.mirror(m1); + var rad1 = m1.distance(mid2); // radius of the small circles + var rd = axis0.copy().length(rad1).point(); // radius distance from short axis + var ld = geom.line(rd, m1); + var md = rd.mid(m1); + var bi = ld.perpendicular(md); // perpendicular bisector + var m3 = axis0.intersection(bi); // midpoints of the big circles + var m4 = axis1.mirror(m3); + var fp1 = geom.line(m3, m1).addEnd(rad1); // the four fitting points + var fp2 = geom.line(m3, m2).addEnd(rad1); + var fp3 = geom.line(m4, m1).addEnd(rad1); + var fp4 = geom.line(m4, m2).addEnd(rad1); + var rad2 = m3.distance(fp1); // radius of the big circles + // place the SVG shapes + $c1.attr({cx: m1.x, cy: m1.y, r: rad1}); + $c2.attr({cx: m2.x, cy: m2.y, r: rad1}); + $p1.attr({d: // the guides + 'M'+fp1+' L'+m3+' '+fp2+ + 'M'+fp3+' L'+m4+' '+fp4+ + 'M'+mid0+' L'+mid2+ + 'M'+mid1+' L'+mid3}); + $p2.attr({d: 'M'+fp2+ // the arcs + ' A'+rad2+','+rad2+' 0 0,1 '+fp1+ + ' A'+rad1+','+rad1+' 0 0,1 '+fp3+ + ' A'+rad2+','+rad2+' 0 0,1 '+fp4+ + ' A'+rad1+','+rad1+' 0 0,1 '+fp2}); + // $p3.attr({d: 'M'+p[3]+' L'+m1+'M'+rd+' L'+m1+' '+md+' '+m3}); // debug construction p[3] = handle; shape.geometry.coordinates[3] = trafo.invtransform(handle).toArray(); }