java - 如何在java中调整sin(x)图形坐标以仅填充窗口的一部分

标签 java graph trigonometry

所以目前我正在开发一个类项目,其中需要我通过drawLine()方法绘制sin(x)函数。目前,这是我用来实现此目的的循环:

    int xShift = getWidth() / 50;
    int xShift2 = getWidth() / 100;
    int yShift = getHeight() / 10;
    int yShift2 = getHeight() / 17;
    int xStart = xShift;
    int xEnd = xShift;
    int yStart = getHeight() / 2;
    int yEnd = getHeight() / 2;
    int scale = getHeight() / 2;

    for (double i = Math.PI / 32; i <= Math.PI * 2; i+= Math.PI / 32){
        xEnd += getWidth() / 64;

        yEnd = scale - ((int) Math.round(Math.sin(i) * scale));


        g.drawLine(xStart, yStart, xEnd, yEnd);
        xStart = xEnd;
        yStart = yEnd;
    }

这会输出如下所示的内容:

enter image description here

我想要改变的是,图表将在蓝色虚线的约束范围内,并且它也会到达 2pi 标记所在的灰线末端(由蓝色箭头标记)。我该如何进行这些更改?

注意:这就是我最大化窗口时的样子:enter image description here

出于某种原因,正弦图超出了我想要的范围。

感谢您抽出宝贵时间,非常感谢您提供的任何帮助。

最佳答案

首先,让我们看看您如何计算 Y。

    yEnd = scale - ((int) Math.round(Math.sin(i) * scale));

由于实际的正弦函数在 -1 和 1 之间,这意味着您的 yEnd 将在 scale - scalescale + scale 之间>。这意味着它将在 0(窗口边缘)和 2×scale 之间变化。由于您的比例是窗口高度的一半,因此 2×比例意味着窗口的整个高度。再次 - window 的边缘。

首先,想想如果你的规模更小会发生什么。如果比例不是 height/2,而是 (height/2 - 10),那么 2×scale 将是窗口高度 - 20。这或多或少是你想要的幅度 - 但它仍然是比例 - 比例,所以它仍然开始从边缘(尝试一下!)。进一步减小比例会降低幅度,但您仍然将从边缘开始。

为了防止这种情况,您应该更改公式。它不应该将正弦添加到scale。想一想:当正弦为 -1 时,您希望它距窗口中间最远。当它为 +1 时,您希望该线距窗口中间距离最远。现在您更改了scale,它不再是窗口高度的一半,因此您不应将其用作基线。

您应该有一个参数表示“我的图形的基本高度是多少”,以及一个参数表示“我的图形的最大幅度是多少”。两个参数不应相同:

int baseHeight = getHeight() / 2;
int amplitude  = getHeight() / 2 - getHeight() / 50;

...

// In the loop
yEnd = baseHeight + ((int) Math.round(Math.sin(i) * amplitude));

尝试一下这些参数,您将看到它们如何影响图表的绘制方式。

现在关于你的 X。你想要执行代表 2π 的 64 步。但如果您希望图形小于窗口宽度,则步长不能为 getWidth()/64。从边缘开始 width/50,添加 63 * getWidth()/64 。由于 width/50 大于 width/64,因此您绘制的宽度将超过宽度。

因此,您需要计算图形的实际最终宽度:它应该是总宽度,不包括左右边距。因此,getWidth() - 2 * getWidth()/50 是实际宽度,每个步长应为该值的 1/64。

int step = ( getwidth() - getWidth() / 25 ) / 64;

...

// In the loop
xEnd += step;

关于java - 如何在java中调整sin(x)图形坐标以仅填充窗口的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773436/

相关文章:

java - 打开新 Activity 时无限循环

java - 使用recyclerview和ListItem在android studio中创建表

javascript - 如何在渲染前操作 cytoscape.js 图形数据

math - 两个向量的旋转/方向

java - 如何向 JAX-WS 添加 HTTP 代理?

java - 使用java打开excel并检测其何时关闭

algorithm - 未加权无向图中的最长路径 - 每个节点只访问一次

c++ - 如何使用 C++ 模板化图形类中的 vector 创建邻接矩阵?

c - 使用泰勒展开的正弦函数(C 编程)

trigonometry - 大于 360 度角的三角比