如何计算小平面点的绕组数?

时间:2016-07-04 18:45:31

标签: math lua 3d 2d

我在3D空间中有一个由4个点组成的扁平方形,每个点由(x,y,z)值组成。我已旋转此方块并将其转换为2D点,因此它现在由(x,y)值组成。

我知道如果广场背对着我我不应该渲染它(它实际上是立方体的背面)并且这可以通过找到构成2D的点的“缠绕数”来计算方。

我在Lua中的代码几乎可以使用,但是当它们不是“面向”我的时候,它隐藏了一些方面。这有什么问题?我错过了什么吗?

...谢谢

local function isPolygonClockwise( pointList )
    local area = 0

    for i = 1, #pointList-1, 2 do
        local pointStart = { x=pointList[i].x - pointList[1].x, y=pointList[i].y - pointList[1].y }
        local pointEnd = { x=pointList[i + 1].x - pointList[1].x, y=pointList[i + 1].y - pointList[1].y }
        area = area + (pointStart.x * -pointEnd.y) - (pointEnd.x * -pointStart.y)
    end

    return (area < 0)
end

作为Lua,pointList是从1开始的,而不是从0开始的。

以下是一个点列表,这些点会导致立方体的正面几乎向右指向时呈现,但非常肯定仍然面临:

160.0588684082
-124.87889099121
160.0588684082
124.87889099121
41.876174926758
70.065422058105
41.876174926758
-70.065422058105

该列表开始原始为逆时针缠绕,作为每个角落的x和y值的-100或100的简单值列表。

1 个答案:

答案 0 :(得分:0)

刚刚意识到增量值是错误的,因为它计算了点列表中的每个值,这意味着在索引1之后x和y值被计数两次......

ul.progress-tracker {
  margin: 15px 0;
  padding: 0;
  overflow: hidden;
  &: before, &: after {
    clear: both;
  }
  li {
    list-style: none;
    &: first-child {
      a: before {
        display: none;
      }
    }
    &:last-child {
      padding-right: 8px;
      a {
        margin: 0;
        min-width: 30.09%;
        padding: 3px 0 0 8px;
        &: after {
          display: none;
        }
      }
    }
    a {
      content: "";
      display: block;
      float: left;
      height: 8px;
      background: tint($light-blue, 60%);
      text-align: center;
      padding: 3px 4px 0 8px;
      position: relative;
      margin: 0 10px 0 0;
      text-decoration: none;
      color: #fff;
      min-width: 31%;
      &: before {
        content: "";
        border-color: transparent;
        border-top: 4px solid transparent;
        border-bottom: 4px solid transparent;
        border-left: 4px solid $light-gray;
        position: absolute;
        left: 0;
        top: 0;
      }
      &:after {
        content: "";
        border-top: 4px solid transparent;
        border-bottom: 4px solid transparent;
        border-left: 4px solid tint($light-blue, 60%);
        position: absolute;
        right: -4px;
        top: 0;
        z-index: 1;
      }
    }
    a.completed {
      background-color: $primary-green;
      &: after {
        border-left-color: $primary-green;
      }
    }
  }
}