我正在使用 google-maps-flutter 插件开发 flutter 项目,我想检查用户位置是否位于我在地图上创建的多边形内。有一个使用 JavaScript api 的简单方法(
如何将一个元素附加到另一个旋转和定位的元素,同时保持其在屏幕上的位置?
我有以下 HTML 结构: 代码笔 附加到绿色 我有以下 HTML 结构: 代码笔 <body> <button onclick={appendBlueToGreen()}>Append To Green</button> <div id="red" style="transform: rotate(20deg); width: 100px; height: 100px; position: absolute; top: 50px; left: 50px; background-color: red;"> <div id="green" style="transform: rotate(20deg); width: 80px; height: 80px; position: absolute; top: 13px; left: 11px; background-color: green;"> </div> </div> <div id="blue" style="transform: rotate(45deg); width: 50px; height: 50px; position: absolute; top: 29px; left: 313px; background-color: blue;"></div> </body> 我想将 #blue 元素附加到 #green 元素,但 #blue 元素应保持其在屏幕上的确切位置。换句话说,#blue元素应该是#green元素的子元素,但其视觉位置和旋转应保持不变。因此,无论 #blue 元素附加到 #green、<body> 或任何其他元素,它都应该保持在与下图相同的位置。 为了实现这一目标,我需要: 计算#green和#red元素的绝对位置和旋转 相对于文档正文。 根据#blue元素调整位置和旋转 计算 #red 和 #green 元素的位置和旋转,使得 出现在屏幕上的相同位置,但在 #green 内 元素。 反向旋转 #blue 元件可消除 应用于 #green 和 #red 元素的旋转。 我正在努力找出正确的数学计算来实现这一目标。如果有人可以提供 JavaScript 解决方案来实现这一目标,我将不胜感激。 这是我在人工智能的帮助下使用的代码来实现这一点,但没有成功: 代码笔 就涉及旋转而言,公式非常简单: newBlueRotation = originalBlueRotation - redRotation - greenRotation; 然而,对于元素的新位置来说,却出乎意料地复杂。这是因为每次旋转都是围绕与用于定位的参考点不同的中心进行的。中心是 默认情况下 div 的中心,但可以使用更改 transform-originCSS 属性。 因此,为了找到 element 的实际旋转中心,可以使用: window.getComputedStyle(element).transformOrigin 旋转中心和参考点之间的差异意味着,为了计算沿线包含的元素的位置,对于每个包含的元素,必须从参考点平移到中心,应用旋转,然后平移回来到参考点。 例如,只有一个旋转矩形的参考点,即红色矩形 通过这个操作找到(我希望这个伪代码符号是不言自明的): redReferencePoint = redOffset + redCenter - redCenter * rotate(-red) 偏移量是元素相对于其父元素的位置(均假设 绝对定位以便计算工作)。 对红色->绿色->新蓝色元素顺序应用这些计算, 设定新的蓝色元素的位置与原来的蓝色元素的位置相同的条件,就可以得到一个可以解出新的蓝色偏移量的方程,这个方程是巨大的: newBlueOffset = greenCenter - blueCenter + ( blueOffset + blueCenter - redOffset - redCenter - (greenOffset - redCenter + greenCenter) * rotate(-red) ) * rotate(red+green) 复杂的计算也导致结果为 稍微不精确,可能是由于舍入错误 - 有时 蓝色元素的微小“子像素”重新定位, 也许在代码中可以更好地看到公式;此片段中的一些代码来自问题中的代码笔。 const appendBlueToGreen = () => { // Get the elements const blueElement = document.getElementById('blue'); const greenElement = document.getElementById('green'); const redElement = document.getElementById('red'); // Function to convert degree to radian const radToDeg = (deg) => (deg * 180) / Math.PI; // get the rotation center const getCenter = element => { try{ const [x, y] = window.getComputedStyle(element).transformOrigin.split(' ').map(parseFloat); return {x, y}; } catch(err){ // default is element center return {x: element.offsetWidth / 2, y: element.offsetHeight / 2}; } } // Function to get the rotation angle of an element (in radians) const getRotation = (element) => { const transform = window.getComputedStyle(element).transform; const matrix = transform.match(/^matrix\((.+)\)$/); if (matrix) { const values = matrix[1].split(', '); const a = values[0]; const b = values[1]; return Math.atan2(b, a); } else { return 0; } }; const getOffset = (element) => { //return {x: parseFloat(window.getComputedStyle(element).left), // y: parseFloat(window.getComputedStyle(element).top)}; return {x: element.offsetLeft, y: element.offsetTop}; } const rotateVec = ({x, y}, theta) => { // rotate vector {x, y} by theta clockwise const cosTheta = Math.cos(theta), sinTheta = Math.sin(theta); return {x: x * cosTheta + y * sinTheta, y: -x * sinTheta + y * cosTheta}; }; const addVec = ({x: x1, y: y1}, {x: x2, y: y2}, ...rest) => { const sum12 = {x: x1 + x2, y: y1 + y2}; return rest.length === 0 ? sum12 : addVec(sum12, ...rest); } const negVec = ({x, y}) => ({x: -x, y: -y}); const roundToFixed = (x, digits) => x.toFixed(digits).replace(/\.?0+$/, ''); // Calculate the rotations const redRotation = getRotation(redElement); const greenRotation = getRotation(greenElement); const blueRotation = getRotation(blueElement); // calculate the offset positions of elements wrt their parents const redOffset = getOffset(redElement); const greenOffset = getOffset(greenElement); const blueOffset = getOffset(blueElement); // calculate the centers const redCenter = getCenter(redElement); const greenCenter = getCenter(greenElement); const blueCenter = getCenter(blueElement); let newOffset = addVec(negVec(greenOffset), negVec(greenCenter), redCenter); newOffset = rotateVec(newOffset, -redRotation); newOffset = addVec(newOffset, blueOffset, blueCenter, negVec(redOffset), negVec(redCenter)); newOffset = rotateVec(newOffset, greenRotation + redRotation); newOffset = addVec(newOffset, greenCenter, negVec(blueCenter)); // Set the new position and rotation for the blue element blueElement.style.position = 'absolute'; blueElement.style.left = `${roundToFixed(newOffset.x, 2)}px`; blueElement.style.top = `${roundToFixed(newOffset.y, 2)}px`; const newBlueRotation = roundToFixed(radToDeg(blueRotation - redRotation - greenRotation), 2); blueElement.style.transform = `rotate(${newBlueRotation}deg)`; // Append the blue element to the green element greenElement.appendChild(blueElement); console.log(blueElement.style.left, blueElement.style.top, blueElement.style.transform) this.event.target.setAttribute("disabled","d"); }; window.appendBlueToGreen = appendBlueToGreen; <button onclick={appendBlueToGreen()}>Append To Green</button> <div id="red" style="transform: rotate(20deg);width: 100px;height: 100px;position: absolute;top: 50px;left: 50px;background-color: red;"> <div id="green" style="transform: rotate(20deg);width: 80px;height: 80px;position: absolute;top: 13px;left: 11px;background-color: green;"> </div> </div> <div id="blue" style="transform: rotate(45deg);width: 50px;height: 50px;position: absolute;top: 29px;left: 313px;background-color: blue;"></div>
问题是确定尽可能多且更精确的颗粒,以便将来按直径对它们进行分类 目前,我已经尝试过定义圆的代码,但它不适合...
我使用QGIS创建了一个shapefile,但是shapefile中的一些多边形在一个奇点处相交,创建了一个领结多边形。我希望添加一个与两个多边形相邻的点...
我在圆的圆周上有三个点: pt A = (A.x, A.y); pt B = (B.x, B.y); pt C = (C.x, C.y); 如何计算圆心? 在Processing (Java) 中实现它。 我
我正在使用本文(“分离行为”部分)中的方法来分散重叠的矩形。它“以一定的速度同时迭代地移动所有矩形......
我试图找到与直线和椭圆相交的点。我可以如代码中所示手动找到该点,但如何自动找到它。还有当红点在里面时...
有两个坐标系。我们知道原点的 3D 坐标以及第二坐标系相对于第一坐标系的轴的 3D 向量。那我们该怎么办呢
我试图找到与直线和椭圆相交的点。我可以如代码中所示手动找到该点,但如何自动找到它。还有当红点在里面时...
我正在尝试以不重叠的方式间隔链接节点。生成位置的算法如下: 常量跨度 = 180 * Math.PI/180; 函数 genPositionsRecursive(节点,
将 Xamarin.Forms.Shapes.Path 转换为 MAUI
我想在网格内画一个圆。我的旧 Xamarin 代码如下所示: public int DrawCircle(画笔颜色,int描边厚度,int x,int y,int宽度,int高度,网格cv) { 路径 c1 = 新
我正在编写代码来确定折线是否自相交。 如果多段线的至少两个链接相交(在其内部点处),则称为自相交。 首先,我...
我在将坐标数据转换为 sf 格式时遇到问题。我从 QGIS 导出了一个 csv 文件,其中包含几个政治单位的属性及其各自的坐标。因为我正在与
我正在用Python解决一个空间分析问题,其中我有一个无序列表的2D点坐标。每个点代表一个城市,所有城市的最小距离保证为...
就像在谷歌地球中一样,我的游戏渲染一个球体,相机围绕它移动。球体的半径为 1,中心位于坐标原点。相机始终瞄准球体
圆心:Cx,Cy 圆半径:a 我们需要绘制切线的点:Px,Py 考虑到上述所有情况,我需要公式来找到两条切线 (t1x, t1y) 和 (t2x,t2y)。 编辑:是
希望你一切都好。 我正在编写一个代码来查找多个多边形的并集。我知道图书馆会这样做,但我需要从头开始。 当我运行代码时,我得到了显而易见的输出...
我在 3D 空间中有一组点,由以下 NumPy 数组表示: 将 numpy 导入为 np 点 = np.array([4.5403791090466825, -6.474122845743137, 1.720865155131852 4.
要找出圆表面上 y 与 x 相交的位置,我使用 Math.sqrt(radius * radius - Math.pow( x, 2)) 。 如何找出摆线表面上 y 与 x 相交的位置? 在
我有一组 N 2d 点,按 x 坐标和该组的上凸包排序。在从集合中删除最左边的点或插入新点后,我正在尝试更新当前的凸包...