让画布无限大

2023-12-04

我目前正在使用画布,在上面画了一些感兴趣的区域。它们由正方形组成,可以通过鼠标单击来移动(即:每次我在画布上单击时,所选区域将以我的光标位置为中心)。

我当前的问题是我想添加以下功能: 当我单击画布边缘附近(左或右)时,如果正方形的一部分不在画布上,我希望这个画布外部分出现在相对的边缘。

例子: 如果我在画布的右边缘附近单击,隐藏部分应该出现在左侧。

老实说,我不知道如何正确地做到这一点。在我看来,它需要一个非常繁重的解决方案(有很多循环)。

我们将非常感谢您的帮助。


执行此操作的简单方法是

您有一个具有宽度、高度、x 和 y 的对象

obj = { x :?, y : ?, w : ? , h: ?}

你画它

ctx.fillRect(obj.x, obj.y, obj.w, obj.h);

您有屏幕/画布尺寸

canW = ?;
canH = ?;

当您绘制对象时,检查它是否接触到右边缘。如果是的话,在左侧再画一次

if(obj.x + obj.w > canW){
   ctx.fillRect(obj.x - canW,obj.y, obj.w, obj.h);

现在,当您在左侧时,如果在顶部再次绘制它,请检查它是否不在底部边缘

   if(obj.y + obj.h > canH){
       ctx.fillRect(obj.x - canW, obj.y - canH, obj.w, obj.h);
   }

}

底部也是一样,但是你已经完成了上面渲染中的左上角,这次你只需要检查底部顶部

if(obj.y + obj.h > canH){
   ctx.fillRect(obj.x, obj.y - canH, obj.w, obj.h);
}

你就完成了。

演示展示了一个随机无限滚动的彩色盒子场景。

var onResize;
function display(){  //
    ctx.setTransform(1,0,0,1,0,0); // reset transform
    ctx.globalAlpha = 1;           // reset alpha
    ctx.clearRect(0,0,w,h);
    if(array.length === 0){
        addRandomObjects();
    }
    // move the scene;
    offsetDX += (Math.random() + Math.random() + Math.random())/3 -0.5;
    offsetDY += (Math.random() + Math.random() + Math.random())/3 -0.5;
    offsetDX = Math.max(-4,Math.min(4,offsetDX));
    offsetDY = Math.max(-4,Math.min(4,offsetDY));
    offsetX += offsetDX;
    offsetY += offsetDY;
    offsetX = ((offsetX % w) + w) % w;
    offsetY = ((offsetY % h) + h) % h;
  
    // draw the scene;
    drawObjects();
    
}
var offsetX = 0;
var offsetY = 0;
var offsetDX = 0;
var offsetDY = 0;

var drawObjects = function(){
    var ox = offsetX;  // get the offset
    var oy = offsetY;
    for(i = 0; i < array.length; i ++){ // do each object
        var a = array[i];
        var x = (a.x + ox)%w;
        var y = (a.y + oy)%h;
        ctx.fillStyle = a.col;   
        ctx.fillRect(x,y,a.w,a.h); // draw it
        if(x+a.w > w){  // if touching right edge draw again at left
            ctx.fillRect(x-w,y,a.w,a.h);
            if(y+a.h > h){
                ctx.fillRect(x-w,y-h,a.w,a.h);
            }
              
        }
        if(y+a.h > h){ // if touching bottom draw again at top
            ctx.fillRect(x,y-h,a.w,a.h);
        }
    }

}

var array = [];

var addRandomObjects = function(){
    for(i = 0; i < 50; i++){
        var hue = Math.floor(Math.random() * 360);
        array.push({
            x: Math.random() * w,
            y : Math.random() * h,
            w : Math.max(50,Math.random() * (w * h * 0.0004)),
            h : Math.max(80,Math.random() * (w * h * 0.0004)),
            col: "hsla("+hue+",100%,50%,0.5)",
        })
    }
}

var onResize = function(){
    array = [];
}






/** SimpleFullCanvasMouse.js begin **/
//==================================================================================================
// The following code is boilerplate code that provides me with a standard interface to various forums.
// It provides a mouse interface, a full screen canvas, and some global often used variable  
// like canvas, ctx, mouse, w, h (width and height), globalTime
// This code is not intended to be part of the answer unless specified and has been formated to reduce
// display size. It should not be used as an example of how to write a canvas interface.
// By Blindman67
const U = undefined;const RESIZE_DEBOUNCE_TIME = 100;
var w,h,cw,ch,canvas,ctx,mouse,createCanvas,resizeCanvas,setGlobals,globalTime=0,resizeCount = 0; 
var L = typeof log === "function" ? log : function(d){ console.log(d); }
createCanvas = function () { var c,cs; cs = (c = document.createElement("canvas")).style; cs.position = "absolute"; cs.top = cs.left = "0px"; cs.zIndex = 1000; document.body.appendChild(c); return c;}
resizeCanvas = function () {
    if (canvas === U) { canvas = createCanvas(); } canvas.width = window.innerWidth; canvas.height = window.innerHeight; ctx = canvas.getContext("2d"); 
    if (typeof setGlobals === "function") { setGlobals(); } if (typeof onResize === "function"){ resizeCount += 1; setTimeout(debounceResize,RESIZE_DEBOUNCE_TIME);}
}
function debounceResize(){ resizeCount -= 1; if(resizeCount <= 0){ onResize();}}
setGlobals = function(){ cw = (w = canvas.width) / 2; ch = (h = canvas.height) / 2; }




resizeCanvas(); 
window.addEventListener("resize",resizeCanvas); 

function update(timer){ // Main update loop
    globalTime = timer;
    display();  // call demo code
    requestAnimationFrame(update);
}
requestAnimationFrame(update);

/** SimpleFullCanvasMouse.js end **/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让画布无限大 的相关文章

  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • 如何更改 Bootstrap 3 div 列顺序

    正在做我的第一个响应式设计 在 Bootstrap 3 中可能会出现类似的情况 在 lg 上更改此设置 a b c sm 上的这个 a c b 您可以使用两个 div 一个用于第一类型的布置 另一个用于第二类型的布置 第一个仅在 lg 中显
  • HTML2canvas 和 Canvas2image,下载的屏幕截图不显示我的 HTML 图像

    我一直在开发一个 HTML 页面 我想将其转换为图像 我一直在使用 html2canvas 和 canvas2image 脚本并采用此代码http jsfiddle net 8ypxW 3 http jsfiddle net 8ypxW 3
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • 悬停时为 SVG 制作动画

    我正在尝试在悬停时为 SVG 文件设置动画 默认情况下 它可以使用 svg 函数实现出色的动画效果 例如
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4

随机推荐

  • 如何使用时区格式化 url 日期时间参数

    我到处寻找但找不到答案 我想了解格式化日期时间 带时区 url 参数的方式 情况如下 调用程序具有带有 UTC 时区的 DateTime 值 接收器 Json WebAPI C 正在我的具有中央时区的本地电脑上运行 PoCreationDa
  • jMeter 中的 javax.net.ssl.SSLException

    我正在服务器上测试一些功能 直到昨天为止都运行良好 今天 他们已经启用了 ssl 到服务器 即从 http 到 https 现在 当我运行测试计划时 出现以下错误 我该如何解决这个问题 尽管我在请求中将协议值更改为 https 但我收到以下
  • SSL 证书未安装

    我在 IIS 中安装 SSL 证书时遇到问题 以下是从 CA 获取证书之前的步骤 使用 OpenSSL 生成私钥文件 openssl genrsa out key name key 2048 命令 生成的 csr 文件包含 openssl
  • 如何在 Windows 窗体中为标签添加边框?

    我正在尝试创建一个内部带有白色标签的表单 当我单击某些内容时 表单将消失并仅显示标签 到目前为止 我尝试将 TransparencyKey 放在 Lime 上 当我单击某些内容时 我将 BackColor 更改为 Lime 并将 FormB
  • Live555框架生成错误

    我正在尝试构建框架Live555图书馆 我从以下位置获取了库文件here按照这个SO的回答我已多次尝试根据该答案生成它 它只是给出以下错误 Applications Xcode app Contents Developer Platform
  • Spring Cloud Dataflow 类型转换在处理器组件中不起作用?

    我有一个可以转换的处理器byte 有效负载进入MyClass有效负载 Slf4j EnableBinding Processor class public class MyDecoder ServiceActivator inputChan
  • 如果 Observable 已完成,我是否需要取消订阅 Observable?

    假设我有一个Observable 热门 未完成 我订阅了它 通常当我完成时Subscription我必须取消订阅它以防止内存泄漏 let subject new Subject const sub subject subscribe Nee
  • 如何将 ObservableCollection 绑定到 WPF 中的复选框列表框

    让我先声明一下我对 C 和 WPF 都很陌生 我正在尝试连接一个集合Boolean值到包含 6 个复选框的容器 并在按下按钮时存储这些值的状态 我假设有一种简单的方法可以做到这一点 因为将复选框绑定到集合似乎是一件非常自然的事情 但到目前为
  • XSLT 将字段连接在一起

    我正在尝试过滤特定字段并连接另一个字段 Input
  • 如何使用Pivot_longer将宽类型数据重塑为具有多个变量的长类型数据

    我想问如何将以下数据框从宽类型重塑为长类型 宽类型数据如下 重塑前的宽类型数据 long 类型数据 即我想要获取的数据帧 如下所示 整形后的Long类型数据 如果您能给我使用更长的枢轴来完成此操作的提示 我将非常感激 我可以通过 BLS 和
  • 图表的中心

    给定一棵无向树 其无权边具有 N 个顶点和 N 1 个边 并且数量为 K 找到 K 个节点 以便树中的每个节点与 K 个节点中的至少一个节点的距离在 S 范围内 另外 S 必须是尽可能小的 S 因此 如果 S 我尝试解决这个问题 但是 我觉
  • 在现有 Java 7 代码中使用 Java 8 可选

    我有一项作业 需要将以下 Java 8 之前的代码转换为 Java 8 代码 以下只是一种让我很难完成的方法 public static List
  • 嵌套 mysql 查询的性能损失

    什么是性能损失SELECT FROM Table VS SELECT FROM SELECT FROM Table AS A AS B 我的问题是 首先 SELECT 是否涉及表中行的迭代 或者它只是将所有行作为一个块返回而不进行任何迭代
  • C 中是否有类似于 Java 字符串 'charAt()' 方法?

    我正在尝试将一段代码从 Java 转换为 C 但我被困在这里 试图在每个位置获取一个字符 char ch line while pos lt line length ch line charAt pos C 中有没有类似的东西可以转换行ch
  • django xlsxwriter 中的日期时间问题

    我正在尝试在 django 视图中创建导出到 Excel 的功能 如下所示 def export myreport request sd ed from xlsxwriter workbook import Workbook import
  • 使用 Google Maps API 根据地址显示房屋的街景

    我正在尝试使用 Google 地图根据地址显示房屋的街景 我创建了一个jsfiddle基于此tutorial 小提琴正在显示默认的初始地址 但我不知道按下按钮时如何将新地址传递到街景代码中 这是 HTML h3 Enter an Addre
  • jQuery ajax 安全性

    我有以下 ajax 调用 它检查用户是否是付费会员 如果是 则相应地运行某些功能 这可行 但我担心安全性 如果有人在控制台强制中更改此 ajax 代码怎么办 button无需执行任何操作即可成功运行功能 我可以在仍然使用 jQuery aj
  • 根据 Symfony 中的另一个字段值验证一个字段

    我在 Symfony 表单中有两个相关字段 object status and cryopreservation method 第一个不能为空 并存储三个可能的选择之一 liquid solid or cryopreserved 仅当记录有
  • 为什么调试模式和运行模式下的保留计数不同?

    我知道 ARC 和 MRC 是如何工作的 但我在测试下面的代码时感到困惑 我不知道为什么会发生这种情况 为什么同一个问题在调试模式和运行模式下的保留计数不同 NSMutableArray a NSMutableArray array a a
  • 让画布无限大

    我目前正在使用画布 在上面画了一些感兴趣的区域 它们由正方形组成 可以通过鼠标单击来移动 即 每次我在画布上单击时 所选区域将以我的光标位置为中心 我当前的问题是我想添加以下功能 当我单击画布边缘附近 左或右 时 如果正方形的一部分不在画布