<!DOCTYPE html> <html lang="en" style="scrollbar-gutter:stable;"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="csrf-token" content="LSQeKCcnMic1PB8gHhReIDkjAmI8HmULTAvpiqYlD_tkJW6KSSr1mtP9"> <title data-suffix=" · Catalin Mititiuc"> WebDevCat.me · Catalin Mititiuc</title> <link rel="stylesheet" id="font-bitter-css" href="//fonts.googleapis.com/css?family=Bitter:400,700" type="text/css" media="screen"> <link phx-track-static rel="stylesheet" href="/assets/app-131585bb1e255488c3d2558ee5c81330.css?vsn=d"> <link phx-track-static rel="stylesheet" href="/assets/cgit-313ed4244ed6cc8d5b67d6fbb4ab18c8.css?vsn=d"> <style> article > * { max-width: unset; } div#cgit table.list { table-layout: auto; width: 100%; display: table; } div#cgit div.content { overflow: scroll; } div#cgit table.tabs { table-layout: auto; width: 100%; display: table; } div#cgit table.blob { table-layout: auto; width: 100%; display: table; } div#cgit table.tabs { table-layout: auto; width: 100%; display: table; } td.linenumbers { width: 1px; } td.lines { max-width: 1px; overflow: hidden; } td.linenumbers pre, td.lines pre { line-height: 1.25em; } pre { overflow-x: scroll; overflow-y: hidden; } code { font-size: unset; } </style> <script defer phx-track-static type="text/javascript" src="/assets/app-7bb68f31e771b77e6d1026a2eca15d48.js?vsn=d"> </script> </head> <body class="bg-white"> <header> <div style="display: inline-block;"> <h1><a href="/">Web Dev Solutions</a></h1> <h3 style="text-align: left">Catalin Mititiuc</h3> </div> </header> <main> <article> From 694f2dbb242e88cf0696223aa057e8c749539c1c Mon Sep 17 00:00:00 2001 From: Catalin Mititiuc <Catalin.Mititiuc@gmail.com> Date: Fri, 29 Mar 2024 12:30:20 -0700 Subject: Add adjustment debug panel --- index.js | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 12 deletions(-) (limited to 'index.js') diff --git a/index.js b/index.js index 1289035..72804fa 100644 --- a/index.js +++ b/index.js @@ -65,7 +65,8 @@ let getPointCoords = (x, y) => { let svgns = "http://www.w3.org/2000/svg", svg = document.querySelector('svg'), - map = document.querySelector('rect#map'); + map = document.querySelector('rect#map'), + hex = document.getElementById('point'); const { x: VIEWBOX_X, y: VIEWBOX_Y, width: VIEWBOX_WIDTH, height: VIEWBOX_HEIGHT } = svg.viewBox.baseVal; @@ -75,6 +76,8 @@ const COLUMN_COUNT = 33, HORZ_POINT_DISTANCE = 1.005, VERT_POINT_DISTANCE = Math.sqrt(3) * HORZ_POINT_DISTANCE / 2, ALTERNATING_OFFSET = HORZ_POINT_DISTANCE / 2, + CIRCUMRADIUS = Math.max(...[...new Set(Object.values(hex.points).flatMap(({x, y}) => [x, y]))]), + INRADIUS = CIRCUMRADIUS * Math.sqrt(3) / 2, [X_OFFSET, Y_OFFSET] = [0.25, 0.45], [COLUMNS, ROWS] = [COLUMN_COUNT, ROW_COUNT].map(n => [...Array(n).keys()]), POINTS = ROWS.map(y => COLUMNS.map(x => [x, y])); @@ -85,14 +88,62 @@ const FIRING_ARC_SIZE = { 'large': Math.atan((21 * HORZ_POINT_DISTANCE) / (6 * VERT_POINT_DISTANCE)) } +const settingsPanel = document.getElementById('panel'); + +Object.values(settingsPanel.querySelectorAll('fieldset')).forEach(fieldset => { + const target = document.getElementById(fieldset.name); + const transform = window.getComputedStyle(target).transform.match(/-?\d+\.?\d*/g); + const inputs = fieldset.querySelectorAll('input'); + + if (transform) { + const [scaleX, skewX, skewY, scaleY, translateX, translateY] = + transform.map(n => parseFloat(n)); + + const cosScale = Math.sqrt(scaleX**2 + skewY**2); + const sinScale = Math.sqrt(scaleY**2 + skewX**2); + + let values = { + scale: Math.round((sinScale + cosScale) / 2 * 10) / 10, + translateX: translateX, + translateY: translateY, + rotate: Math.round(radToDeg((Math.acos(scaleX / cosScale) + Math.asin(skewX / sinScale)) / 2) * 10) / 10 + } + + inputs.forEach(input => input.value = values[input.name]); + } + + inputs.forEach(input => { + input.addEventListener('pointerenter', e => e.target.focus()); + + input.addEventListener('input', e => { + let { scale, translateX, translateY, rotate} = Object.values(inputs).reduce((acc, input) => { + acc[input.name] = input.value; + return acc; + }, {}); + + let transform = `translate(${translateX}px, ${translateY}px) rotate(${rotate}deg) scale(${scale}) ` + target.style.transform = transform; + }); + + input.addEventListener('pointerleave', () => document.activeElement.blur()); + }); +}); + +const pointsGroup = document.getElementById('points'); + POINTS.forEach((row, index) => row.forEach(([x, y]) => { - var cx = x * HORZ_POINT_DISTANCE + X_OFFSET + (isEven(index) ? ALTERNATING_OFFSET : 0), - cy = y * HORZ_POINT_DISTANCE * VERT_POINT_DISTANCE + Y_OFFSET, + // var cx = x * HORZ_POINT_DISTANCE + X_OFFSET + (isEven(index) ? ALTERNATING_OFFSET : 0), + // cy = y * HORZ_POINT_DISTANCE * VERT_POINT_DISTANCE + Y_OFFSET, + // var cx = x * Math.sqrt(3) + X_OFFSET + (isEven(index) ? INRADIUS : 0), + var cx = x * INRADIUS * 2 + (isEven(index) ? INRADIUS : 0), + cy = y * 3 / 2 * CIRCUMRADIUS, point = document.createElementNS(svgns, 'use'); point.setAttributeNS(null, 'href', `#point`); - point.setAttributeNS(null, 'x', `${cx}in`); - point.setAttributeNS(null, 'y', `${cy}in`); + point.setAttributeNS(null, 'x', `${toFixed(cx)}`); + point.setAttributeNS(null, 'y', `${toFixed(cy)}`); + // point.setAttributeNS(null, 'x', `${cx}`); + // point.setAttributeNS(null, 'y', `${cy}`); point.dataset.x = x; point.dataset.y = y; @@ -147,6 +198,8 @@ POINTS.forEach((row, index) => row.forEach(([x, y]) => { let {troopNumber, troopAllegiance} = selectedSoldier.dataset, selector = troopSelector(troopNumber, troopAllegiance), source = document.querySelector(`circle.counter${selector}`), + + // TODO: use isEqualNode() method instead sourceAndTargetAreNotTheSame = [ troopNumber != e.target.dataset.troopNumber, troopAllegiance != e.target.dataset.troopAllegiance @@ -185,7 +238,7 @@ POINTS.forEach((row, index) => row.forEach(([x, y]) => { point.addEventListener('mouseout', e => e.target.removeAttribute('class')); - svg.appendChild(point); + pointsGroup.appendChild(point); })); map.addEventListener('mousemove', e => { @@ -390,11 +443,11 @@ svg.addEventListener('wheel', e => { let widthChange = (1 - ((svgP.x - x) / width)) * widthDelta; let heightChange = (1 - ((svgP.y - y) / height)) * heightDelta; - let newX = e.deltaY < 0 ? x + xChange : x - xChange; - let newWidth = e.deltaY < 0 ? width - xChange - widthChange : width + xChange + widthChange; + let newX = parseInt(e.deltaY < 0 ? x + xChange : x - xChange); + let newWidth = parseInt(e.deltaY < 0 ? width - xChange - widthChange : width + xChange + widthChange); - let newY = e.deltaY < 0 ? y + yChange : y - yChange; - let newHeight = e.deltaY < 0 ? height - yChange - heightChange : height + yChange + heightChange; + let newY = parseInt(e.deltaY < 0 ? y + yChange : y - yChange); + let newHeight = parseInt(e.deltaY < 0 ? height - yChange - heightChange : height + yChange + heightChange); // console.log('VIEWBOX_X', 'VIEWBOX_Y', VIEWBOX_X, VIEWBOX_Y); // console.log('VIEWBOX_WIDTH', 'VIEWBOX_HEIGHT', VIEWBOX_WIDTH, VIEWBOX_HEIGHT); @@ -446,8 +499,8 @@ svg.addEventListener('pointerdown', e => { ctm = svg.getScreenCTM().inverse(); const [svgStartPt, svgMovePt] = [startPt, movePt].map(p => p.matrixTransform(ctm)), - moveX = svgStartPt.x - svgMovePt.x + x, - moveY = svgStartPt.y - svgMovePt.y + y; + moveX = parseInt(svgStartPt.x - svgMovePt.x + x), + moveY = parseInt(svgStartPt.y - svgMovePt.y + y); svg.setAttributeNS(null, 'viewBox', `${moveX} ${moveY} ${width} ${height}`); } -- cgit v1.2.3 </article> </main> <footer> <p>100% Human Made, No AI Used</p> <p>stasis 0.2.12</p> </footer> </body> </html>