围绕中心点旋转对象坐标

如何解决围绕中心点旋转对象坐标

编辑:正在工作的 jsfiddle:https://jsfiddle.net/Harry999/xy9uq7ed/56/

我正在制作一个 HTML 画布游戏。

https://jsfiddle.net/Harry999/xy9uq7ed/53/

我的目标是围绕一个中心点旋转多个形状。

形状的 x 和 y 坐标必须随着形状旋转以进行碰撞检测。

如何使形状围绕中心点旋转? (centerX,centerY)

如何设置形状旋转的速度? (速度)

如何从形状旋转的中心点设置半径? (半径)

var rotationAmount = 10;
var rect = new rectangle(20,20,200,10,2);

var gameArea = {
  canvas: document.createElement("canvas"),create: function() {
     this.canvas.width = 400;
     this.canvas.height = 400;
     this.context = this.canvas.getContext("2d");
     document.body.insertBefore(this.canvas,document.body.childNodes[0]);
  },start: function() {
     this.interval = setInterval(redraw,20);
  },clear: function() {
     this.context.clearRect(0,this.canvas.width,this.canvas.height);
  }
}

// runs every  20ms
function redraw() {
   gameArea.clear();
   rect.update();
}

function rectangle(width,height,x,y,radius,speed) {
    this.gamearea = gameArea;
    this.width = width;
    this.height = height;
    this.x = x;
    this.y = y;
    this.radians = Math.PI;
  
    // I want these to be the center points of the rotation
    this.centerX = x;
    this.centerY = y;
    // I want this to be the distance at which the rect rotates from the center
    this.radius = radius;
    // I want this to be the speed at which the rect rotates
    this.speed = speed;
  
    this.update = function() {
    // iterate rotation amount through 10 - 360 degrees 
    if (rotationAmount < 360) {
       rotationAmount += 10;
    } else {
       rotationAmount = 10;
    }
  
    // update radians
    this.radians = rotationAmount * (Math.PI / 180);
        
    // adjust x and y coordinates
    this.x = this.x + this.width * Math.sin(this.radians);
    this.y = this.y + this.width * Math.cos(this.radians);

    // draw rectangle
    gameArea.context.fillStyle = "red";
    gameArea.context.fillRect(this.x-this.width/2,this.y-this.height/2,this.width,this.height);
    
    // draw center point
    gameArea.context.fillStyle = "black";
    gameArea.context.fillRect(this.centerX-2,this.centerY-2,4,4);
  }
}

// run game
gameArea.create();
gameArea.start();

解决方法

class Point
{
    constructor(x,y,pos=false)
    {
        if(pos==false)
        {
            this.pos=[x,y];
        }
        else
        {
            this.pos=pos;
        }
    }
    rotate(angle,cx,cy)
    {
        angle=angle*3.14/180;
        let newX = Math.cos(angle)*this.pos[0]-Math.sin(angle)*this.pos[1]+cx;
        let newY = Math.sin(angle)*this.pos[0]+Math.cos(angle)*this.pos[1]+cy;
        this.pos=[newX,newY];
    }
    size(x,y)
    {
        this.pos=[this.pos[0]*x,this.pos[1]*y];
    }
    draw(x,y)
    {
        window.ctx.fillRect(this.pos[0]+x,this.pos[1]+y,1,1);
    }
}```
cx,cy - point of rotating
more angle you use - faster it rotates
distance from point to center is radius,if you want to make it lower than just edit coords
,

我想通了。工作示例jsfiddle:

https://jsfiddle.net/Harry999/xy9uq7ed/56/

var rect = new rectangle(20,20,200,40,10);
var rect2 = new rectangle(20,10,20);

var gameArea = {
  canvas: document.createElement("canvas"),create: function() {
    this.canvas.width = 400;
    this.canvas.height = 400;
    this.context = this.canvas.getContext("2d");
    document.body.insertBefore(this.canvas,document.body.childNodes[0]);
  },// start interval that redraws canvas once every 20 ms
  start: function() {
    this.interval = setInterval(redraw,20);
  },clear: function() {
    this.context.clearRect(0,this.canvas.width,this.canvas.height);
  }
}

// runs every  20ms
function redraw() {
  gameArea.clear();
  rect.update();
  rect2.update();
}


function rectangle(width,height,centerX,centerY,radius,speed) {
  this.gamearea = gameArea;
  this.width = width;
  this.height = height;
  // Center points of the rotation
  this.centerX = centerX;
  this.centerY = centerY;
  // The distance at which the rect rotates from the center
  this.radius = radius;
  // The coordinates of the shape
  this.x = this.centerX + this.radius;
  this.y = this.centerY + this.radius;
  // The speed at which the shape rotates
  this.speed = speed;
  // this.angle is calculated in radians
  this.angle = this.speed * (Math.PI / 180);

  this.update = function() {
    // adjust x and y coordinates
    var x2 = this.centerX + (this.x - this.centerX) * Math.cos(this.angle) - (this.y - this.centerY) * Math.sin(this.angle);
    var y2 = this.centerY + (this.x - this.centerX) * Math.sin(this.angle) + (this.y - this.centerY) * Math.cos(this.angle);
        // update x and y coordinates
    this.x = x2;
    this.y = y2;
    // draw rectangle
    gameArea.context.fillStyle = "red";
    gameArea.context.fillRect(this.x - this.width / 2,this.y - this.height / 2,this.width,this.height);

    // draw center point
    gameArea.context.fillStyle = "black";
    gameArea.context.fillRect(this.centerX - 2,this.centerY - 2,4,4);
  }
}

// run game
gameArea.create();
gameArea.start();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res