diff --git a/examples/al-fill-polygon.html b/examples/al-fill-polygon.html index 46c81261..87857578 100644 --- a/examples/al-fill-polygon.html +++ b/examples/al-fill-polygon.html @@ -13,10 +13,12 @@ // Start up Aladin Lite aladin = A.aladin('#aladin-lite-div', {fov: 122, showContextMenu: true, fullScreen: true}); var overlay = A.graphicOverlay({color: '#ee2345', lineWidth: 3}); + aladin.addOverlay(overlay); overlay.addFootprints([A.polygon( - [[264.375,-24.624318352164085],[258.75,-30.000000000000018],[264.375,-35.68533471265207],[270,-30.000000000000018]], + [[264.375,-35.68533471265207], [258.75,-30.000000000000018], [264.375,-24.624318352164085], [270,-30.000000000000018]], {color: '#808080', fillColor: '#808080', opacity: .4, lineWidth: 1, fill: true})]); + aladin.gotoRaDec(264.375,-24.624318352164085); }); diff --git a/src/js/Polyline.js b/src/js/Polyline.js index 7d955199..b3686eca 100644 --- a/src/js/Polyline.js +++ b/src/js/Polyline.js @@ -50,6 +50,31 @@ export let Polyline= (function() { return mag2; } + function _isAcrossCollignonZoneForHpxProjection(line, view) { + const [x1, y1] = AladinUtils.viewXyToClipXy(line.x1, line.y1, view); + const [x2, y2] = AladinUtils.viewXyToClipXy(line.x2, line.y2, view); + + // x, y, between -1 and 1 + let triIdxCollignionZone = function(x, y) { + let xZone = Math.floor((x * 0.5 + 0.5) * 4.0); + return xZone + 4 * (y > 0.0); + }; + + let isInCollignionZone = function(x, y) { + return Math.abs(y) > 0.5; + }; + + if (isInCollignionZone(x1, y1) && isInCollignionZone(x2, y2)) { + if (triIdxCollignionZone(x1, y1) === triIdxCollignionZone(x2, y2)) { + return false; + } else { + return true; + } + } + + return false; + } + // constructor let Polyline = function(radecArray, options) { options = options || {}; @@ -230,6 +255,7 @@ export let Polyline= (function() { line.draw(ctx); } }; + if (this.closed && this.fill) { fillPoly = (v0, v1, index) => { const line = new Line(v0.x, v0.y, v1.x, v1.y); @@ -241,6 +267,47 @@ export let Polyline= (function() { } }; } + } else if (view.projection === ProjectionEnum.HPX) { + drawLine = (v0, v1) => { + const line = new Line(v0.x, v0.y, v1.x, v1.y); + + if (_isAcrossCollignonZoneForHpxProjection(line, view)) { + return; + } + + if (line.isInsideView(view.width, view.height)) { + const mag2 = _calculateMag2ForNoSinProjections(line, view); + + if (mag2 < 0.1) { + line.draw(ctx); + } + } + }; + + if (this.closed && this.fill) { + fillPoly = (v0, v1, index) => { + const line = new Line(v0.x, v0.y, v1.x, v1.y); + + if (_isAcrossCollignonZoneForHpxProjection(line, view)) { + return; + } + + const mag2 = _calculateMag2ForNoSinProjections(line, view); + + if (mag2 < 0.1) { + if (index === 0) { + ctx.beginPath(); + ctx.moveTo(line.x1, line.y1); + } else { + ctx.lineTo(line.x1, line.y1); + } + + return true; + } else { + return false; + } + }; + } } else { drawLine = (v0, v1) => { const line = new Line(v0.x, v0.y, v1.x, v1.y); @@ -266,39 +333,18 @@ export let Polyline= (function() { } else { ctx.lineTo(line.x1, line.y1); } + + return true; + } else { + return false; } }; } } - // 3. Check whether the polygon do not cross the view - let nSegment = this.closed ? len : len - 1; - /* - let v0 = this.closed ? len - 1 : 0; - let v1 = this.closed ? 0 : 1; - let v2 = this.closed ? 1 : 2; - - let drawPolygon = true; - for (var k = 0; k < nSegment; k++) { - let ccwTriOrder = ccwOrder(xyView[v0], xyView[v1], xyView[v2]) - - if (ccwGoodOrder != ccwTriOrder) { - // if it cross the view, we end up here - drawPolygon = false; - - return; - } - - v0 = v1; - v1 = v2; - v2 = (v2 + 1) % len; - } - - if (!drawPolygon) { - return; - }*/ - // 4. Finally, draw all the polygon, segment by segment + let nSegment = this.closed ? len : len - 1; + let v0 = this.closed ? len - 1 : 0; let v1 = this.closed ? 0 : 1; @@ -319,12 +365,17 @@ export let Polyline= (function() { if (this.fill && this.closed) { v0 = len - 1; v1 = 0; + + let n = 0; for (var k = 0; k < nSegment; k++) { - fillPoly(xyView[v0], xyView[v1], k); + if (fillPoly(xyView[v0], xyView[v1], n)) { + n++; + } v0 = v1; v1 = v1 + 1; } + ctx.globalAlpha = 1; ctx.save(); ctx.fillStyle = this.fillColor;