我在XZ平面上有两个点,较大/较高的点是L=(XL,ZL),较小/较短的点是S=(XS,ZS)
c++ - 通过锯齿线连接两条线-LMLPHP
通过将L和S点连接到Z=0线,我有两条线
c++ - 通过锯齿线连接两条线-LMLPHP
我打算用曲折的对角线把我的两条线连接起来
c++ - 通过锯齿线连接两条线-LMLPHP
我需要找到L0,L1,LkLN-1还有S0,S1,Sk序列号1,序列号。
我已经知道两点了:
S0=S=(XS,ZS)
SN=(XS,0)
c++ - 通过锯齿线连接两条线-LMLPHP
到目前为止,我已经实现了这个算法:

float lX, lZ = ... // "L" (larger/taller) point coordinate on (X, Z) plane
float sX, sZ = ... // "S" (smaller/shorter) point coordinate on (X, Z) plane

size_t N = 5; // N sections below S
float sZsectionLength = sZ / N; // length of each section below S

std::vector<float> sZ_dots(N+1, 0.0); // N+1 points/dots below S
for (size_t k = 0; k < N+1; ++k) {
    sZ_dots[k] = sZ - k * sZsectionLength;
}
std::vector<float> lZ_dots(N, 0.0); // N points/dots below L
for (size_t k = 0; k < N; ++k) {
    // // Each point below L is average of two points below S
    lZ_dots[k] = ( sZ_dots[k] + sZ_dots[k+1] ) / 2.0f;
}

for (size_t k = 0; k < N; ++k) {
    Line *zig = new Line();
    zig->setStartDot(sX, sZ_dots[k]);
    zig->setCloseDot(lX, lZ_dots[k]);
    linesContainer.append(zig);

    Line *zag = new Line();
    zag->setStartDot(lX, lZ_dots[k]);
    zag->setCloseDot(sX, sZ_dots[k+1]);
    linesContainer.append(zag);
}

上面的算法可以很好地生成之字形。但是,我想知道是否有任何更快的算法来生成之字形交叉线。我有什么遗漏吗?

最佳答案

我会这样执行:

struct Line
{
  Line(float x1, float z1, float x2, float z2)
    :
      m_x1(x1),
      m_z1(z1),
      m_x2(x2),
      m_z2(z2)
  {}

  float m_x1;
  float m_z1;
  float m_x2;
  float m_z2;
};

using LineContainer = std::vector<Line>;

LineContainer getZigZag(float lx, float sx, float sz, size_t sectionCount)
{
  assert(lx < sx && sz > 0.0f);

  LineContainer lines;
  auto sectionHeight = sz / sectionCount;
  for (auto i = 0; i < sectionCount; ++i)
  {
    auto sz1 = sz - sectionHeight * i;
    auto sz2 = sz - sectionHeight * (i + 1);
    auto lz = sz1 - (sz1 - sz2) / 2.0f;

    // A section.
    //
    // From S to L
    lines.emplace_back(sx, sz1, lx, lz);
    // From L to S
    lines.emplace_back(lx, lz, sx, sz2);
  }

  return lines;
}

使用如下函数:
int main()
{
  auto zigzag = getZigZag(1.0f, 2.0f, 4.0f, 2);
  [..]

正如您可能注意到的,我用一个循环替换了三个循环,这个循环在每次迭代中创建两行(一个部分)。

关于c++ - 通过锯齿线连接两条线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56002887/

10-11 03:57