当前位置: 首页 > 知识库问答 >
问题:

如何在不使用“context.rotate”的情况下旋转七巧板游戏中的形状`

阎建中
2023-03-14

在画布600*600中,三个点的横移是(100,100),(300,100),(200,200)的旋转中心是(200,100)

我想实现拖动传输以旋转。但我不知道如何改变这些点的坐标。

ps:我知道如何计算旋转角度 var rotateRadian = Math.atan2(mouseY - center.y, mouseX - center.x) - Math.atan2(startDragPosition.y - center.y, startDragPosition.x - center.x);

[ 来自以下评论的其他信息 ]

我想建一个七巧板,有长方形、三角形和平行四边形。

共有1个答案

蒋阳华
2023-03-14

你有一个好的开始!

首先计算鼠标到中心点的角度:

// calc mouse angle
var dx=mouseX-centerX;
var dy=mouseY-centerY;
radianAngle=Math.atan2(dy,dx);

因为你有一个等边三角形,所以你的三角形是一个正多边形。使用三角学计算多边形的3个旋转点:

// vertex#1
var x1=cx+radius*Math.cos(rotationAngle);
var y1=cy+radius*Math.sin(rotationAngle);

// vertex#2
rotationAngle+=PI2/3;
var x2=cx+radius*Math.cos(rotationAngle);
var y2=cy+radius*Math.sin(rotationAngle);

// vertex#3
rotationAngle+=PI2/3;
var x3=cx+radius*Math.cos(rotationAngle);
var y3=cy+radius*Math.sin(rotationAngle);

然后只需侦听鼠标移动事件并相应地重绘三角形:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var $canvas=$("#canvas");
var canvasOffset=$canvas.offset();
var offsetX=canvasOffset.left;
var offsetY=canvasOffset.top;
var scrollX=$canvas.scrollLeft();
var scrollY=$canvas.scrollTop();
ctx.fillStyle='red';
ctx.strokeStyle='blue';
ctx.lineWidth=2;

var isDown=false;
var startX;
var startY;

var PI2=Math.PI*2;
var cx=150;
var cy=150;
var sideLength=50;
var originalAngle=0;
var radius=sideLength*Math.sqrt(3)/3;

draw(200,200);

$("#canvas").mousemove(function(e){handleMouseMove(e);});


function draw(mx,my){

  //
  var dx=mx-cx;
  var dy=my-cy;
  var currentAngle=Math.atan2(dy,dx);
  var rotationAngle=currentAngle-originalAngle;
  // vertex#1
  var x1=cx+radius*Math.cos(rotationAngle);
  var y1=cy+radius*Math.sin(rotationAngle);
  // vertex#2
  rotationAngle+=PI2/3;
  var x2=cx+radius*Math.cos(rotationAngle);
  var y2=cy+radius*Math.sin(rotationAngle);
  // vertex#3
  rotationAngle+=PI2/3;
  var x3=cx+radius*Math.cos(rotationAngle);
  var y3=cy+radius*Math.sin(rotationAngle);

  ctx.clearRect(0,0,cw,ch);
  ctx.beginPath();
  ctx.moveTo(x1,y1);
  ctx.lineTo(x2,y2);
  ctx.lineTo(x3,y3);
  ctx.closePath();
  ctx.stroke();

  ctx.beginPath();
  ctx.arc(x1,y1,3,0,PI2);
  ctx.closePath();
  ctx.fill();

}


function handleMouseMove(e){
  // tell the browser we're handling this event
  e.preventDefault();
  e.stopPropagation();

  mx=parseInt(e.clientX-offsetX);
  my=parseInt(e.clientY-offsetY);

  draw(mx,my);

}
css prettyprint-override">body{ background-color: ivory; }
#canvas{border:1px solid red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4>The triangle will rotate according to the mouse</h4>
<canvas id="canvas" width=300 height=300></canvas>
 类似资料:
  • 虽然我的问题主题似乎是许多PDF操作包和工具都支持的特性,但我需要明确指出,我不想旋转PDF。 我有一个PDF,它显示了一个纵向(A4),尺寸为WxH 297x210(A4旋转)。 现在,我需要实现的是,这个PDF有横向方向,同时保留尺寸。 我不确定这需要我做什么。 如果我使用Adobe Illustrator将文档格式更改到所需的位置,我还需要旋转内容。如果我将此页面放入设计糟糕的PDF中,此页

  • 问题内容: 我有一个适用于Django应用的命令行Python API。当我通过API访问该应用程序时,它应该返回JSON,而在浏览器中它应该返回HTML。我可以使用不同的URL访问不同的版本,但是如何只用一个模板在views.py中呈现HTML模板和JSON ? 要呈现HTML,我将使用: 但是如何在不放置JSON模板的情况下对JSON做同样的事情?(应为而不是) 什么将决定JSON和HTML输

  • 问题是如何使用OpenCV旋转图像并保持原始尺寸。当前正在使用此功能: 此外,在warpAffine中使用了什么样的算法(Bicubic?)

  • 问题内容: 关于将行旋转为各种数据库的列,有很多文章。他们似乎分为两个阵营,使用案例语句或使用数据库供应商的内置功能。我正在使用 MySQL ,到目前为止,尚未在任何内置函数上找到任何东西,该函数使我可以选择任意数量的行值(希望将其转换为列)。如果我不提前知道这些值,则无法构建经常出现在stackoverflow上的CASE查询。我想知道MySQL中是否有类似于其他数据库中称为交叉表或数据透视表的

  • 我从供应商那里收到单页pdf文件的邮资标签。这些标签可以贴在A5纸上,但它们在A4纸上是纵向的,也是纵向的。我希望能够在A4纸上打印两个这样的标签,以减少浪费。 这可以通过旋转页面内容而不旋转页面本身来实现。或者通过交换内容的高度和宽度来调整页面的大小。我知道这两种情况都会导致内容丢失,但这对于我的用例来说不是问题。理想情况下,我希望命令行应用程序既可以在Linux机器上运行,也可以在Window

  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul