【发布时间】:2017-06-13 04:44:36
【问题描述】:
我正在使用 SFML 库在 C++ 中制作图形程序。到目前为止,我已经能够在屏幕上绘制一个函数。在此过程中,我遇到了两个问题。 第一条线似乎回到了我的飞机的原点,从我的功能结束开始。
您可以在这张图片中看到它:
正如您所见,这条“流氓”线似乎在接近原点时改变了颜色。我的第一个问题是这条线是什么,我怎样才能从我的窗户上根除它?
在这张图片中可以看到第二个稍微不相关但更数学的问题:
如您所见,正在绘制图形未定义或不连续点的渐近线。这引出了我的第二个问题:有没有办法(在代码中)识别渐近线而不是将其绘制到窗口。
我绘制到窗口的代码是:
VertexArray axis(Lines, 4);
VertexArray curve(PrimitiveType::LinesStrip, 1000);
axis[0].position = Vector2f(100000, 0);
axis[1].position = Vector2f(-100000, 0);
axis[2].position = Vector2f(0, -100000);
axis[3].position = Vector2f(0, 100000);
float x;
for (x = -pi; x < pi; x += .0005f)
{
curve.append(Vertex(Vector2f(x, -tan(x)), Color::Green));
}
我非常感谢任何意见:)
更新:
感谢许多人的投入,这段代码似乎可以很好地解决渐近线问题:
for (x = -30*pi; x < 30*pi; x += .0005f)
{
x0 = x1; y0 = y1;
x1 = x; y1 = -1/sin(x);
a = 0;
a = fabs(atan2(y1 - y0, x1 - x0));
if (a > .499f*pi)
{
curve.append(Vertex(Vector2f(x1, y1), Color::Transparent));
}
else
{
curve.append(Vertex(Vector2f(x1, y1), Color::Green));
}
}
更新 2:
以下代码摆脱了流氓行:
VertexArray curve(Lines, 1000);
float x,y;
for (x = -30 * pi; x < 30 * pi; x += .0005f)
{
y = -asin(x);
curve.append(Vertex(Vector2f(x, y)));
}
for (x = -30 * pi + .0005f; x < 30 * pi; x += .0005f)
{
y = -asin(x);
curve.append(Vertex(Vector2f(x, y)));
}
【问题讨论】:
-
@user3853544 你指的白线我认为是轴。该代码包含在我帖子的最后一部分中。 “axis[n].pos...”部分。
-
@billy606 Spekre 在他的回答中对此有一些代码,我只想添加一个条件,即连续的 y 值具有相反的符号,只是为了更加确定它是不连续的,而不仅仅是连续大跳跃
-
@billy606 顺便说一句,你好像在做这样的事情:plotting real time Data on (qwt )Oscillocope 这对你来说可能会很有趣
-
@Spektre 哦,当然。好吧,确实确定这是一个不连续的部分,并且确定不虐待连续的部分,我认为这很有趣,但并不那么容易。取决于他需要什么。如果只是一些化妆品,任何有效的都可以。另一方面,如果它应该适用于任何类型的功能,我实际上建议将其作为一个单独的问题
-
@Spektre 在考虑了两次之后......如果有像
y=|tan(x)|这样的不连续性,那么无论如何连接线都是不可见的:P