【问题标题】:Indexing in equilateral triangle grid given simple 2D Cartesian coordinates给定简单的二维笛卡尔坐标的等边三角形网格中的索引
【发布时间】:2011-11-07 23:04:01
【问题描述】:

我有一个像这样构造的等边三角形网格:

现在,鉴于二维坐标原点是图像左下角的红点,我需要在这个三角形网格中找到索引。

给定输入:感兴趣点(浮点)的 X 和 Y 坐标、三角形边长和高度

需要输出:三角形的 X 和 Y 索引。 (图片中的示例索引)

获取三角形的 Y(行)坐标很简单,因为它只是 (GivenY / TRIANGLE_HEIGHT) 的整数部分,但我无法在不进行大量操作的情况下计算所需的 X 坐标。

【问题讨论】:

  • @Mattias 答案有效,我刚试过。您应该关闭问题。

标签: grid geometry coordinates


【解决方案1】:

这是一个更明确的答案,适用于有问题(或太懒)无法弄清楚几何形状的人。

首先将您的坐标缩放到方便的基础

vec2 pos=(input-origin)/vec2(edge/2,median);

将坐标分成整数部分和小数部分

int x=pos.x, y=pos.y; float u=pos.x-x, v=pos.y-y;

测试对角线(x,y 不同奇偶校验)或反对角边缘(x,y 相同奇偶校验)

if(x%2 ^ y%2) { if(v+u<1) x--; } else { if(v-u>0) x--; }

就是这样 (x,y) 现在是您的面部索引。

查找每个面的顶点索引有点复杂。

您有四种情况,这里是每个面的 CCW 顶点索引列表:

face  vertices
xy    xy xy xy
00 -> 00 10 01
10 -> 11 01 10
01 -> 01 12 02
11 -> 12 01 11

如果不将 y 顶点索引加 1,则更容易看到模式,所以你的最终表格是:

00 -> 00 10 01
10 -> 11 01 10
01 -> 00 11 01
11 -> 11 00 10

每一列分别是:x, x, !x, x^y, x, !x。或者,您可以简单地使用查找表。

它适用于任意人脸索引,您只需添加 (x/2, y) 并在 (x%2, y%2) 上进行查找。

最后,三角形顶点索引为:

x/2 + x%2, y + x%2; x/2 + !(x%2), y + (x%2^y%2); x/2 + (x%2), y + !(x%2)

在原始笛卡尔空间中使用顶点坐标:

origin+vec2(2*x+y%2),y)*vec2(edge/2,median)

【讨论】:

    【解决方案2】:

    更多三角形 如果从 0,0 的左下角到 1,0 的右上角画一条线,两个三角形的阴影区域现在由四个直角三角形组成。从 1,0 的右上角放下一条线,你会得到另一个直角三角形,一个由三个直角三角形组成的三角形高度是你原来的三角形高度,宽度是 1.5 * 三角形长度,斜边我离开练习班上。 因此,无论它是在左三角形还是右三角形中,都是您的点与该线相交的位置。 您可以根据三角形长度预先计算大部分内容。 另一种选择是计算平行四边形,计算它的中心,将其移动到原点,顺时针旋转 30 度,向后移动,预先计算变换,你有一个宽度为上述斜边的菱形,中间的哪一边是哪一边三角形,菱形的高度是三角形的长度,你还需要工作,否则1.0和2,0的平行四边形会重叠。

    【讨论】:

    • 嗨托尼!我能理解你在说什么(但“点截线”的部分......),但我试图用这个来完成什么没有任何意义。我正在寻找一个函数,将参数 X 和 Y 作为简单的笛卡尔坐标,原点位于图像的左上角,并将它们作为索引返回到图像中看到的三角形坐标中。
    • 这是几何学的原理,诚然英语有点跛脚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2020-12-29
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多