在旋转后,查找线/点左侧的哪一点

时间:2014-12-15 06:05:17

标签: c# geometry shader game-engine polygon

如果两个国家不属于同一个玩家(视觉辅助以查看您的边界),我目前正试图在团结中编写一个在风险游戏中围绕国家绘制三角形图案的着色器。

目前,我在使着色器设置正确的国家时遇到了问题。

它始终将国家0设置为左侧,将国家1设置为右侧 - 国家0和1以编程方式设置。

线条,边框,可以在0到359度之间。

我如何找到国家0和1是我在线的中点左右两点画一个点,一个.01f,一个.1f和一个1f远离每个方向的中点,然后旋转它们中点到适当的位置。

之后,我做了一个奇怪的检查,看看这些点是在每个国家的内部还是外部,并比较重量结果(最近得到3分,中间得到2,最远得到1,以防万一有人建立一个真的搞砸了另一个国家的国家。)

在我的测试地图中,接近等切的八边形,边框正确显示(在角度超过90且小于或等于180的情况下,我颠倒了国家0和1的位置)。工作没有缺陷,但在其他地图中它不能很好地工作。

除了国家分配之外的所有事情都运作良好,所以我很好奇是否有人知道更好的方法来确定哪个点在左边或者是一个细线,或者是一个更好的概念方法来处理这个问题。

enter image description here

以上基本上是在我做的时候,红色是左边是蓝色,然后我只是检查3个不同的点然后称重左边和权利发现偶数/偏差到适当的国家(一个在+/- .01,另一个在+/- .1和第三个1,如果偶数/奇数舍入问题与接近)。

如果我发现国家A在右边,我会翻转它们,因为它是根据我绘制的角度在左边。 (我的着色器在第一个和第二个左边渲染,因此我为什么要这样做。)

1 个答案:

答案 0 :(得分:0)

  1. 哪条路左/右在一条线上?

    从上次编辑来看,这不是你的情况。为什么不使用点积?

    line x-axis dot

    因此,如果该行进入-x方向,则结果为负,如果在+x方向,则结果为正。如果结果为零,则意味着该线仅上升或下降,或者它突然变为一个点。如果您需要特定方向而不是左/右,请使用适当的a向量而不是x轴。

      2D中的
    • dot(a,b)=a.x*b.x+a.y*b.y
    • 3D中的
    • dot(a,b)=a.x*b.x+a.y*b.y+a.z*b.z

    图像与a矢量单位大小的情况相关,在这种情况下,点的结果是b垂直投影到a,就像在图像

    < / LI>
  2. 哪一方有点?

    我认为这就是你所需要的。

    side of line

    如您所知,如果您处理行(P0,P1)和点P,您想要将其归类为三角形,那么多边形绕组也会确定该行的一侧。因此对于隐式轴方向:

    • CW (顺时针)多边形缠绕表示线的右侧
    • CCW (逆时针)多边形缠绕表示线的左侧

    如何缠绕? ...只需计算法向量并获得其Z坐标。它的极性(符号)决定了绕组( CW / CCW 或反过来取决于坐标系)。

    • 法线向量计算为三角形(P1-P0)x(P-P1)
    • 的两个顶点的叉积

    无需仅计算其他轴z所以:

    • normal.z = ((P1.x-P0.x)*(P.y-P1.y)) - ((P1.y-P0.y)*(P.x-P1.x))

    现在只做if (normal.z<0) ... else ...它永远不会为零,除非你在线上称它为点或线是一个点......看这里类似的问题:Determine rotation direction /toward/ variable point on a circle

    < / LI>