改变正方形相交区域的颜色

2024-03-07

这些天我正在做一个项目。我的目标是改变两个正方形相交区域的颜色。我已经编写了检测两个正方形相交的代码,但我不知道如何更改相交区域的颜色。请帮我解决这个问题。

    var sketch = function (p) {
      with(p) {

        let squares = [];
        let dragObject = null; // variable to hold the object being dragged

        p.setup = function() {
          createCanvas(600, 520);
          button1 = createButton("Alpha");
          button2 = createButton("Bravo");
          button3 = createButton("Charlie");
          button4 = createButton("Delta");
          button5 = createButton("Echo");
          button6 = createButton("Foxtrot");
          button7 = createButton("Golf");
          button8 = createButton("Hotel");
          button9 = createButton("India");
          button10 = createButton("Juliet");

          button1.mousePressed(doSomething);
        };
    
        p.draw = function() {

          background(25, 240, 255);

          // if a square is being dragged, update its position
          if (this.dragObject != null) {
            this.dragObject.position.x = mouseX;
            this.dragObject.position.y = mouseY;
          }

          //draw all squares
          for (let i = 0; i < squares.length; i++) {
            let s = squares[i];
            s.show();
          }
          for (let i = 0; i < squares.length; i++) {
            for (let j = i + 1; j < squares.length; j++) {
              if (i != j && squares[i].collides(squares[j])) {
                squares[i].changecolor();

              }
            }
          }
        };

        p.mousePressed = function () {

          if (this.dragObject == null) {

            //ask every square if they are being "hit"
            for (let i = 0; i < squares.length; i++) {
              let s = squares[i];
              if (s.hitTest()) {
                //if so, set the drag object as this square and return
                this.dragObject = s;
                return;
              }
            }

            //no squares are hit, create a new square.
            let square = new Square(mouseX, mouseY);
            squares.push(square);
          }
        };

        //mouse is released, release the current dragged object if there is one
        p.mouseReleased = function () {
          this.dragObject = null;
        };

        class Square {
          constructor(InitialX, InitialY) {
            this.w = 60;
            this.h = 60;
            this.position = {
              x: InitialX,
              y: InitialY
            };
          }

          //basic test of mouse position against square position and if its inside the rectangle
          hitTest() {
            let x = mouseX - this.position.x;
            let y = mouseY - this.position.y;
            return (x > 0 && x < this.w) && (y > 0 && y < this.h);
          }

          show() {
            fill(50);
            rect(this.position.x, this.position.y, this.w, this.h);
          }

          collides(sqr) {
            if (this.position.x < sqr.position.x + sqr.w &&
              this.position.x + this.w > sqr.position.x &&
              this.position.y < sqr.position.y + sqr.h &&
              this.position.y + this.h > sqr.position.y) {

              return true;
            }
            return false;
          }

          changecolor() {
            fill(random(255), random(255), random(255));
            background(200, 255, 100);
            for (let i = 0; i < squares.length; i++) {
              let s = squares[i];
              s.show();
            }
          }
        }

        function doSomething() {
          // fill(230, 170, 90);
          // ellipse(random(600), random(410), 30, 30);
          squares.pop();
        }

     
      }
    };
    
    let node = document.createElement('div');
    window.document.getElementById('p5-container').appendChild(node);
    new p5(sketch, node);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
<div id="p5-container"></div>

让我们想一下如何表示两个正方形之间的相交区域。当然,方法之一就是简单地将其表示为another矩形,我们只需根据拦截区域改变其颜色。要绘制一个矩形,我们需要知道左上角的坐标、宽度和高度。因此,挑战是在我们拖动方块时计算这些。这应该在draw()功能。您已经实现了相交检查,剩下的就是计算新矩形的左上角点(newX,newY)、宽度(newW)和高度(newH)。

为了计算左上角、宽度和高度,我们可以将其添加到检查碰撞的块中:

  ...
  //block checking collision
  if (i != j && squares[i].collides(squares[j])) {
    squares[i].changecolor();

    //set intersection color
    fill(50);

    //calculate parameters
    newX = Math.max(squares[i].position.x, squares[j].position.x);
    newY = Math.max(squares[i].position.y, squares[j].position.y);

    newW = Math.min(squares[i].position.x + squares[i].w, squares[j].position.x + squares[j].w) - newX;
    newH = Math.min(squares[i].position.y + squares[i].h, squares[j].position.y + squares[j].h) - newY;

    //draw rectangle
    rect(newX, newY, newW, newH);
  }

Result:

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

改变正方形相交区域的颜色 的相关文章

随机推荐

  • 如何从备份文件中检索数据库的逻辑文件名

    我正在研究如何的步骤使用 SQL 脚本 T SQL 恢复数据库备份 http blog sqlauthority com 2007 02 25 sql server restore database backup using sql scr
  • 如何确定 JNI 全局引用内存泄漏的原因?

    我正在使用 Tomcat 停止我的 Web 应用程序后仍然存在对类加载器的引用我的网络应用程序的实例 结果是大量内存 主要与静态数据相关 将不会被释放 迟早这会导致OutOfMemoryError 我拍了一张heap dump我意识到它是由
  • VLC录制rtsp流

    我在使用 VLC 播放器录制 rtsp 流时遇到问题 实际上我的方法在 MacOS X 中有效 但在 Windows 中无效 命令行 vlc vvv rtsp admin email protected cdn cgi l email pr
  • 如何使用 Powershell 枚举 IIS 网站并查找每个网站的应用程序池?

    我可以使用以下方式搜索网站 Get WmiObject Namespace root WebAdministration Class Site Authentication PacketPrivacy ComputerName server
  • 使用 CUDA 生成排列

    我正在阅读有关 CUDA 的内容 我尝试实现一个简单的代码来创建每个可能的排列array a b c d 但我不知道如何实现 CUDA 方式 因为我读到的所有示例都是这种形式a blockIdx x b blockIdx x c block
  • Xcode 无法使用 Apple ID 登录

    最近我想用Xcode归档我的App 然后Xcode说我必须再次输入我的Apple ID和密码 也许我的登录信息丢失了 我又尝试了一次 但总是失败 If I input a wrong password I get a correct res
  • 堆管理

    我知道有一个元数据存储在期间使用的辅助信息free realloc 当我们只提供指针时 我对堆几乎没有疑问 堆栈是按进程分配的 毫无疑问 但对堆不确定 无论堆信息是全局维护的 还是每个进程都会有某种机制来保存有关为该特定进程分配的内存的信息
  • Nose 未运行 Django 文档测试

    如同这个问题 https stackoverflow com questions 2614363 why isnt django nose running the doctests in my models 然而 就我而言 我的模型都没有d
  • Facebook 个人资料 ID 和 uid 之间有区别吗?

    我有一个应用程序 我通过以下代码片段获取应用程序用户的 Facebook uid FB login function response if response authResponse FB getLoginStatus function
  • 如何使用 Dagger2 在 ViewModel 中注入依赖项

    我正在尝试在现有项目中实现新的架构 MVVM RxJava2 Dagger2 Retrofit 我已经建立了整个上述架构并在 HomeActivity 上进行了测试 HomeViewModel 中注入的依赖项 所以现在我试图在Fragmen
  • 在 php 中统计 mongodb

    我有一个集合用户 它有2个参数 用户名 付费 用户名是一个字符串 付费也是一个字符串 我应该计算有多少个带有参数paid true 的用户 这是我的尝试 如果有 mongo 专家可以帮忙 谢谢 新驱动没有实现 cursor gt count
  • 仅使用 CSS 突出显示表行中的所有行跨度

    有没有办法让 CSS 突出显示整行 包括行跨度内的单元格 而不仅仅是第一行 正如你从示例中看到的 只有该行的第一行被突出显示 而其他单元格没有突出显示 这显然看起来很混乱 我宁愿只使用 CSS 来清除它 但如果有的话会使用 Javascri
  • 将正则表达式与 NSPredicate 结合使用

    Aim Using NSPredicate我想使用正则表达式来匹配所有以 Test 开头的字符串 我特别想用Regex and NSPredicate 问题 我犯了什么错误 使用正则表达式来实现我想要做的事情的正确方法是什么 代码 我的尝试
  • 从 Git 存储库克隆后的 Laravel Sail

    我目前有自己的 Laravel 应用程序在 Docker 上运行 在 Windows 11 上使用 Laravel sail 在 WSL2 上使用 Ubuntu 这工作正常并且符合预期 我已将我的工作推送到 Git 存储库 但如何将其拉到新
  • 添加页面时,refinerycms 不工作

    尝试使用 RefineryCMS 从仪表板添加新页面时出现此错误 SQLite3 ConstraintException refinery page translations refinery page id 不得为 NULL INSERT
  • FtpWebRequest ListDirectory 不返回所有文件

    我正在尝试从包含大约 9000 个文件的 FTP 位置检索文件列表 但下面的代码总是只给出 97 个文件 在第 98 个文件的循环开始时 StreamReader Peek 变为 1 输出 test txt 始终仅包含前 97 个文件 就像
  • 创建没有版本号的 Grails 3 WAR

    在 Grails 2 中 我们可以像这样定义 WAR 文件名 grails project war file target appName war 如何覆盖 Grails 3 中的 war 文件名 谢谢杰夫 我在 build gradle
  • 动态生成的 IL 中的值类型转换

    Update一年多后 我终于意识到了这种行为的原因 本质上 一个对象不能被拆箱为与它不同的类型 被装箱为 即使该类型强制转换或转换为目标 类型 如果你不知道正确的类型 你必须发现它 不知何故 作业可能完全有效 但不可行 让这一切自动发生 例
  • NUXT:使用 Markdown-it 显示相对于 Markdown 内容的图像

    这是 Nuxt 的纯静态实现 我正在使用从 yaml 内容文件 不是 markdown 读取的 markdown 内容 由于内容位于 json 对象中 因此它们正在使用 md render blog content 假设 blog cont
  • 改变正方形相交区域的颜色

    这些天我正在做一个项目 我的目标是改变两个正方形相交区域的颜色 我已经编写了检测两个正方形相交的代码 但我不知道如何更改相交区域的颜色 请帮我解决这个问题 var sketch function p with p let squares l