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