钻石上的像素坐标

2023-11-21

我得到了一张图像,其中有几颗钻石并排放置,如下图所示

diamond coordinates

我知道图像上的唯一坐标是顶角(绿色文本)。
当我点击图像时,我得到了该点的坐标,但我无法得到我所在的钻石。
例如我点击红点,我怎么知道x:260,y:179 =顶部菱形?
蓝色属于左边? ETC...

非常感谢您的帮助。

EDIT:
我最终使用了 Canvas,但我认为 SVG 也能满足我需要做的事情。


我看到两种可能的方法:直接检查点是否在菱形内部并使用仿射变换。我将描述两者。

直接点位置检查

要确定一个点是否在菱形内部,您必须检查它与菱形中点的偏差。您必须将 X 和 Y 偏差与钻石的 X 和 Y 范围成比例,您将得到两个因子。对于菱形内的所有点,这些因子的模值之和小于或等于 1。在代码中,如下所示:

var dx = Math.abs(coords[0] - middle[0]);
var dy = Math.abs(coords[1] - middle[1]);
if (dx / size[0] + dy / size[1] <= 1)
  alert("Inside diamond");
else
  alert("Outside diamond");

因此,您现在要做的就是确定每个菱形的中点(在所有情况下尺寸都相同)并检查您正在测试的点是否位于它们内部。

工作示例:http://jsfiddle.net/z98hr/

仿射变换

Using 仿射变换您可以将顶部菱形的角坐标更改为 (0,0)、(1,0)、(0,1) 和 (1,1)。如果您随后对需要测试的点应用相同的变换,那么确定它属于哪颗钻石就变得微不足道了。

首先,您需要一个平移向量将 (225,2) 点移动到坐标原点。假设您有四个坐标来确定顶部菱形(左右坐标、顶部和底部坐标):

var topDiamond = [[113, 2], [337, 227]];

然后翻译向量将菱形的顶点移动到零坐标将是:

var translationVector = [-(topDiamond[0][0] + topDiamond[1][0]) / 2,
                         -topDiamond[0][1]];

您可以将其应用到原始坐标,如下所示:

function add(vector1, vector2)
{
  return [vector1[0] + vector2[0], vector1[1] + vector2[1]];
}
topDiamond = [add(topDiamond[0], translationVector),
              add(topDiamond[1], translationVector)];

那么你将需要一个旋转矩阵:

var angle = -Math.atan2(topDiamond[1][1] - topDiamond[0][1],
                        topDiamond[1][0] - topDiamond[0][0]);
var rotMatrix = [[Math.cos(angle), -Math.sin(angle)],
                 [Math.sin(angle), Math.cos(angle)]];

与该矩阵相乘后,点 (225,2) 和 (337,114.5) 在 X 轴上对齐。但你现在拥有的是一个空中飞人,你现在需要一个水平剪切变换使菱形的另一边与 Y 轴对齐:

function multiply(matrix, vector)
{
  return [matrix[0][0] * vector[0] + matrix[0][1] * vector[1],
          matrix[1][0] * vector[0] + matrix[1][1] * vector[1]];
}
var point = [topDiamond[0][0], (topDiamond[0][1] + topDiamond[1][1]) / 2];
point = multiply(rotMatrix, point);
var shearMatrix = [[1, -point[0] / point[1]], [0, 1]];

与这个矩阵相乘后,你现在有了一个矩形。现在你只需要一个缩放矩阵确保角点的 X 和 Y 坐标值为 0 和 1:

point = multiply(shearMatrix, point);
var point2 = [topDiamond[1][0], (topDiamond[0][1] + topDiamond[1][1]) / 2];
point2 = multiply(rotMatrix, point2);
point2 = multiply(shearMatrix, point2);
var scaleMatrix = [[1/point2[0], 0], [0, 1/point[1]]];

现在您已经完成了,现在您可以将这些转换应用到任何点:

alert(
  multiply(scaleMatrix,
    multiply(shearMatrix,
      multiply(rotMatrix,
        add(translationVector, [260, 179])
      )
    )
  )
);

这给你0.94,0.63- 两个值都在(0..1)范围意味着它是顶级钻石。和[420,230]作为你得到的输入1.88,0.14 - X in (1..2)范围和 Y 中0..1范围意味着正确的菱形。等等。

工作示例:http://jsfiddle.net/FzWHe/

回顾起来,对于像钻石这样的简单几何图形来说,这可能是太多的工作。

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

钻石上的像素坐标 的相关文章

  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • 是什么导致 Java(冰雹序列)在我的程序中崩溃

    我制作了一个执行 通常称为 冰雹序列的程序 该程序基本上执行以下操作 创建一个int 值 并为其分配一个值 如果 int 是偶数 则将其除以二 如果 int 为奇数 则将其乘以三并加一 继续这个过程 直到 n 等于 1 它似乎适用于大多数数
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 如何在 Tensorflow 对象检测 API 中查找边界框坐标

    我正在使用 Tensorflow 对象检测 API 代码 我训练了我的模型并获得了很高的检测百分比 我一直在尝试获取边界框坐标 但它不断打印出 100 个奇怪数组的列表 经过在线广泛搜索后 我发现数组中的数字意味着什么 边界框坐标相对于底层
  • 有没有好的 GLSL 哈希函数?

    所以我对这个问题的古老评论仍然得到了支持 GLSL rand 这一行代码的起源是什么 https stackoverflow com questions 12964279 whats the origin of this glsl rand
  • 涉及数学的方法给出与计算器不同的答案

    我是java新手 所以请耐心等待 我试图从比赛总数中获得胜利的百分比 但我正在做的事情还很遥远 我获取百分比的方法如下 public double winPercentage int wins int total return wins t
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 小数纬度/经度的最大长度 度?

    地球表面一度纬度和经度的最大长度是多少 以公里或英里为单位 但请注明 我不确定我是否说得足够清楚 让我重新表述一下 众所周知 地球不是一个完美的圆 赤道 或厄瓜多尔 纬度 经度变化 1 0 可能意味着一个距离 而两极的相同变化可能意味着另一
  • 哪种编程语言或库可以处理无限级数?

    哪种编程语言或库能够处理无限级数 例如几何级数或调和级数 它可能必须有一些众所周知的系列的数据库 并在收敛的情况下自动给出适当的值 并且可能在发散的情况下生成异常 例如 在 Python 中 它可能如下所示 sum 0 sign 1 0 f
  • 在android中点击地图获取坐标

    我正在尝试做这样的事情 我有一个地图活动 当用户点击地图时 它会显示该位置的坐标 我已经重写了 onclick 方法 但它甚至没有被调用 任何想法 public class MapPoint extends MapActivity impl
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • ID3和C4.5:“增益比”如何标准化“增益”?

    ID3算法使用 信息增益 度量 C4 5 使用 增益比 度量 即信息增益除以SplitInfo 然而SplitInfo对于记录在不同结果之间平均分配的分割 该值较高 否则较低 我的问题是 这如何帮助解决信息增益偏向于具有多种结果的分裂的问题
  • NSArray 中不重复的所有可能组合

    假设我有一个包含 3 个数字的数组 NSArray array 1 2 3 我想进行所有组合而不重复 所以我需要的是这样的 1 2 3 1 2 2 3 1 3 1 2 3 我当前的代码是这样的 NSArray array 1 2 3 int
  • 如何将时间间隔划分为不同长度的部分?

    我有一个从 0 到t 我想把这个区间分成一个以2 25 2 25 1 5为周期的累积序列 方法如下 input start 0 stop 19 output sequence 0 2 25 4 5 6 8 25 10 5 12 14 25
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • Android 谷歌地图多边形点击事件[重复]

    这个问题在这里已经有答案了 我正在 Android 上开发地图应用程序 并且正在使用 Google Maps Android API V2 我从 Web 服务获取多边形数据 通过 XML 解析对其进行转换 然后可以毫无问题地将其显示在地图上
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体

随机推荐

  • 在 C# 中检查两个 XML 文件是否相同?

    在 C 中如何检查两个 XML 文件是否相同 我想忽略 XML 文件中的注释 安装免费的来自 NuGet 的 XMLDiffMerge 包 这个包本质上是一个重新打包的版本XML 差异和补丁 GUI 工具来自微软 该函数返回true如果两个
  • 有没有办法按索引合并多个列表索引?

    例如 我有三个列表 长度相同 A 1 2 3 B a b c C x y z 我想将它合并成类似的东西 1 a x 2 b y 3 c z 这是我到目前为止所拥有的 define merger A B C answer for y in r
  • 几何命中测试中的错误

    我有一个绘画视觉表示路径的元素 其几何形状由此描述syntax m106 59 3c0 1 98 0 0 4 95 0 989 3 96 0 989 13 8 3 96 20 8 4 95 6 92 0 14 8 3 96 17 8 3 9
  • 抑制输出

    我想抑制一组 Matlab 函数中变量的输出 问题是作者忘记了 在代码中的许多位置 出于调试目的 此输出很有用 但现在我想抑制它 而不在整个代码中搜索丢失的 有没有可能关闭这种输出 您可以使用 evalc 抑制输出 但这需要您将表达式作为字
  • “为了钱,总是小数”?

    嗯 规则 对于金钱来说 总是小数 不适用于 Microsoft 开发团队内部 因为如果是 Namespace Microsoft VisualBasic Assembly Microsoft VisualBasic in Microsoft
  • 将 Browserify 与 jQuery 插件结合使用

    一些简短的背景 我正在使用 browserify 和 browserify shim 以及 gulp 来构建 来创建一个网络应用程序 在这个问题之前 我是require从 npm ing jquery 所以我没有任何问题 当我开始做一些优化
  • HTML5 结构 -

    再会 我刚刚开始学习 HTML5 没有任何问题 一切都很顺利 我只有一个关于语义使用的小问题
  • swagger 结合一些重复的注释

    I use useDefaultResponseMessages false 并在每个方法中 ApiResponses value ApiResponse code 200 message Success response Order cl
  • 在字段名称周围使用反引号

    在阅读了一些关于一些 SQL 问题的答案和评论之后 还听说我的一个朋友在一个有禁止它们的政策的地方工作 我想知道在 MySQL 中的字段名称周围使用反引号是否有什么问题 That is SELECT id name anotherfield
  • 使用 awk 打印除匹配范围模式之外的所有内容

    在 Awk 中 范围模式不是表达式 因此不能使用 不是它 那么如何实现它 使用 awk 打印除匹配范围模式之外的所有内容 e g cat 1 t abd hfdh fafa deafa 123 end 我想要的结果 cat 1 t abd
  • 实时生产中 Django 与 argon2 哈希器的问题

    所以我刚刚设置了我的 Digital Ocean Droplet 服务器 并一直在努力让这个网站正常工作 但是我遇到了一个又一个错误 我终于找到了加载登录页面的网站 这是应该发生的事情 但是当我登录时 我收到一个错误 Argon2 Pass
  • 导出奇怪的重复模板和协方差

    假设我有一个基类 它克隆派生类 class Base public virtual Base clone return new Base 我有一组派生类 它们是使用奇怪的重复模板模式实现的 template
  • 数组中每个元素右侧存在的最大元素

    我得到了一个 n 个元素 数组 我必须找到每个元素右侧大于其自身 当前元素 的最小元素 For example Array 8 20 9 6 15 31 Output Array 9 31 15 15 31 1 是否可以解决这个问题O n
  • C# 并发 - 长时间运行任务的首选方法

    当需要在整个应用程序生命周期中运行 I O 侦听器时 在 4 5 框架上运行的 C 5 0 首选哪种并发模型 我已经确定生产者 消费者模式最适合处理我收到的内容 但是什么基础设施应该支持它 会一个简单的Thread thread new T
  • 如何在 Google 地图中显示我当前的位置?

    我想在谷歌地图中显示我当前的位置 它应该是动态的 即经度和纬度应该动态设置 就像现在我在新德里一样 如果我启动我的 Android 应用程序 我当前的位置应该显示在新德里 如果我前往其他城市 它应该会改变 获取当前位置在 Android 上
  • Github Action 在多个 on:push: 路径上触发

    在单个存储库中 我想为不同的路径创建多个触发器 paths frontend and paths backend 对于 相同的 构建作业使用不同的参数 以下是两个工作流程 name Trigger Jenkins Build Build P
  • 如何使用导航组件在单个片段上正确添加选项菜单而不破坏“向上行为”

    我在单个片段上添加选项菜单时遇到一些麻烦 因为它破坏了导航 这是我的代码 我有一个活动NoActionBar风格和布局
  • UTF-8 和 JavaScript

    我使用 Javascript 获取使用字符集 UTF8 定义的 HTML 页面中的数据 我的 javascript 方法使用字符集 UTF8 加载 但是当我使用 innerHTML 获取数据时 我遇到了编码问题 例如 工资 我错过了什么吗
  • 哪个更好:

    哪个更好或更方便使用 or 您是否需要 type 属性 如果您使用的是 HTML5 则不需要 否则 是的 HTML 4 01 和 XHTML 1 0 指定type属性为必填项 而 HTML5 将其作为可选属性 默认为text javascr
  • 钻石上的像素坐标

    我得到了一张图像 其中有几颗钻石并排放置 如下图所示 我知道图像上的唯一坐标是顶角 绿色文本 当我点击图像时 我得到了该点的坐标 但我无法得到我所在的钻石 例如我点击红点 我怎么知道x 260 y 179 顶部菱形 蓝色属于左边 ETC 非