在网格布局上绘制一条线,然后添加垂直轴

发布于 2024-10-06 10:47:01 字数 5153 浏览 0 评论 0原文

此问题底部的解决方案

我有以下代码:

public void lineImproved(int x0, int y0, int x1, int y1, Color color)
{
    int pix = color.getRGB();
    int dx = x1 - x0;
    int dy = y1 - y0;

    raster.setPixel(pix, x0, y0);
    if (Math.abs(dx) > Math.abs(dy)) {          // slope < 1
        float m = (float) dy / (float) dx;      // compute slope
        float b = y0 - m*x0;
        dx = (dx < 0) ? -1 : 1;
        while (x0 != x1) {
            x0 += dx;
            raster.setPixel(pix, x0, Math.round(m*x0 + b));
        }
    } else
    if (dy != 0) {                              // slope >= 1
        float m = (float) dx / (float) dy;      // compute slope
        float b = x0 - m*y0;
        dy = (dy < 0) ? -1 : 1;
        while (y0 != y1) {
            y0 += dy;
            raster.setPixel(pix, Math.round(m*y0 + b), y0);
        }
    }
}

它当前绘制一条线并填充构成指定 2 点(即 [x0,y0] 和 [x1, y1])。我需要它包含 h0 和 h1 作为 2 个点的高度。通过这样做,我希望能够使用每个 raster.setPixel 函数获取垂直轴上的高度值。

更新 我现在有了这个任务的代码,但仍然只是二维的。我需要对以下代码实施建议的解决方案来验证它:

    internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1)
    {
        int blocks = 0;
        bool cannotUndo = false;

        int dx = x1 - x0;
        int dy = y1 - y0;
        int dz = z1 - z0;

        DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo);
        if (Math.Abs(dx) > Math.Abs(dy))
        {          // slope < 1
            float m = (float)dy / (float)dx;      // compute slope
            float b = y0 - m * x0;
            dx = (dx < 0) ? -1 : 1;
            while (x0 != x1)
            {
                x0 += dx;
                DrawOneBlock(theplayer, drawBlock, x0, Convert.ToInt32(Math.Round(m * x0 + b)), z0, ref blocks, ref cannotUndo);
            }
        }
        else
        {

            if (dy != 0)
            {                              // slope >= 1
                float m = (float)dx / (float)dy;      // compute slope
                float b = x0 - m * y0;
                dy = (dy < 0) ? -1 : 1;
                while (y0 != y1)
                {
                    y0 += dy;
                    DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(m * y0 + b)), y0, z0, ref blocks, ref cannotUndo);
                }
            }
        }
        return blocks;
    }

解决方案:

internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1)
    {
        int blocks = 0;
        bool cannotUndo = false;
        bool detected = false;

        int dx = x1 - x0;
        int dy = y1 - y0;
        int dz = z1 - z0;

        DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo);

    //a>x,b>y,c>z
    if (Math.Abs(dx) > Math.Abs(dy) && Math.Abs(dx) > Math.Abs(dz) && detected == false)
        { // x distance is largest
            detected = true;
            float my = (float)dy / (float)dx;      // compute y slope
            float mz = (float)dz / (float)dx;      // compute z slope
            float by = y0 - my * x0;
            float bz = z0 - mz * x0;
            dx = (dx < 0) ? -1 : 1;
            while (x0 != x1)
            {
                x0 += dx;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(x0), Convert.ToInt32(Math.Round(my * x0 + by)), Convert.ToInt32(Math.Round(mz * x0 + bz)), ref blocks, ref cannotUndo);
            }
        }

    //a>y,b>z,c>x
    if (Math.Abs(dy) > Math.Abs(dz) && Math.Abs(dy) > Math.Abs(dx) && detected == false && detected == false)
        { // y distance is largest
            detected = true;
            float mz = (float)dz / (float)dy;      // compute z slope
            float mx = (float)dx / (float)dy;      // compute x slope
            float bz = z0 - mz * y0;
            float bx = x0 - mx * y0;
            dy = (dy < 0) ? -1 : 1;
            while (y0 != y1)
            {
                y0 += dy;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * y0 + bx)), Convert.ToInt32(y0) , Convert.ToInt32(Math.Round(mz * y0 + bz)), ref blocks, ref cannotUndo);
            }
        }

    //a>z,b>x,c>y
    if (Math.Abs(dz) > Math.Abs(dx) && Math.Abs(dz) > Math.Abs(dy) && detected == false && detected == false)
        { // z distance is largest
            detected = true;
            float mx = (float)dx / (float)dz;      // compute x slope
            float my = (float)dy / (float)dz;      // compute y slope
            float bx = x0 - mx * z0;
            float by = y0 - my * z0;
            dz = (dz < 0) ? -1 : 1;
            while (z0 != z1)
            {
                z0 += dz;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * z0 + bx)), Convert.ToInt32(Math.Round(my * z0 + by)), Convert.ToInt32(z0), ref blocks, ref cannotUndo);
            }
        }

SOLUTION AT BOTTOM OF THIS QUESTION

I have this code:

public void lineImproved(int x0, int y0, int x1, int y1, Color color)
{
    int pix = color.getRGB();
    int dx = x1 - x0;
    int dy = y1 - y0;

    raster.setPixel(pix, x0, y0);
    if (Math.abs(dx) > Math.abs(dy)) {          // slope < 1
        float m = (float) dy / (float) dx;      // compute slope
        float b = y0 - m*x0;
        dx = (dx < 0) ? -1 : 1;
        while (x0 != x1) {
            x0 += dx;
            raster.setPixel(pix, x0, Math.round(m*x0 + b));
        }
    } else
    if (dy != 0) {                              // slope >= 1
        float m = (float) dx / (float) dy;      // compute slope
        float b = x0 - m*y0;
        dy = (dy < 0) ? -1 : 1;
        while (y0 != y1) {
            y0 += dy;
            raster.setPixel(pix, Math.round(m*y0 + b), y0);
        }
    }
}

It currently plots a line and fills in the specific pixels that make up the line between the 2 points specified (i.e. [x0,y0] and [x1,y1]). I need it to include an h0 and h1 for the height of the 2 points. By doing so I hope to be able to obtain a height value on the vertical axis with every raster.setPixel function.

UPDATE
I have now the code how it should be for this task, but still only in 2D. I need to implement the suggested solution to the following code to verify it:

    internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1)
    {
        int blocks = 0;
        bool cannotUndo = false;

        int dx = x1 - x0;
        int dy = y1 - y0;
        int dz = z1 - z0;

        DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo);
        if (Math.Abs(dx) > Math.Abs(dy))
        {          // slope < 1
            float m = (float)dy / (float)dx;      // compute slope
            float b = y0 - m * x0;
            dx = (dx < 0) ? -1 : 1;
            while (x0 != x1)
            {
                x0 += dx;
                DrawOneBlock(theplayer, drawBlock, x0, Convert.ToInt32(Math.Round(m * x0 + b)), z0, ref blocks, ref cannotUndo);
            }
        }
        else
        {

            if (dy != 0)
            {                              // slope >= 1
                float m = (float)dx / (float)dy;      // compute slope
                float b = x0 - m * y0;
                dy = (dy < 0) ? -1 : 1;
                while (y0 != y1)
                {
                    y0 += dy;
                    DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(m * y0 + b)), y0, z0, ref blocks, ref cannotUndo);
                }
            }
        }
        return blocks;
    }

SOLUTION:

internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1)
    {
        int blocks = 0;
        bool cannotUndo = false;
        bool detected = false;

        int dx = x1 - x0;
        int dy = y1 - y0;
        int dz = z1 - z0;

        DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo);

    //a>x,b>y,c>z
    if (Math.Abs(dx) > Math.Abs(dy) && Math.Abs(dx) > Math.Abs(dz) && detected == false)
        { // x distance is largest
            detected = true;
            float my = (float)dy / (float)dx;      // compute y slope
            float mz = (float)dz / (float)dx;      // compute z slope
            float by = y0 - my * x0;
            float bz = z0 - mz * x0;
            dx = (dx < 0) ? -1 : 1;
            while (x0 != x1)
            {
                x0 += dx;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(x0), Convert.ToInt32(Math.Round(my * x0 + by)), Convert.ToInt32(Math.Round(mz * x0 + bz)), ref blocks, ref cannotUndo);
            }
        }

    //a>y,b>z,c>x
    if (Math.Abs(dy) > Math.Abs(dz) && Math.Abs(dy) > Math.Abs(dx) && detected == false && detected == false)
        { // y distance is largest
            detected = true;
            float mz = (float)dz / (float)dy;      // compute z slope
            float mx = (float)dx / (float)dy;      // compute x slope
            float bz = z0 - mz * y0;
            float bx = x0 - mx * y0;
            dy = (dy < 0) ? -1 : 1;
            while (y0 != y1)
            {
                y0 += dy;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * y0 + bx)), Convert.ToInt32(y0) , Convert.ToInt32(Math.Round(mz * y0 + bz)), ref blocks, ref cannotUndo);
            }
        }

    //a>z,b>x,c>y
    if (Math.Abs(dz) > Math.Abs(dx) && Math.Abs(dz) > Math.Abs(dy) && detected == false && detected == false)
        { // z distance is largest
            detected = true;
            float mx = (float)dx / (float)dz;      // compute x slope
            float my = (float)dy / (float)dz;      // compute y slope
            float bx = x0 - mx * z0;
            float by = y0 - my * z0;
            dz = (dz < 0) ? -1 : 1;
            while (z0 != z1)
            {
                z0 += dz;
                DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * z0 + bx)), Convert.ToInt32(Math.Round(my * z0 + by)), Convert.ToInt32(z0), ref blocks, ref cannotUndo);
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

指尖上得阳光 2024-10-13 10:47:01

您需要比较 abs(dx)abs(dy)abs(dz) 并选择最大的一个。在每种情况下,都使用与您所拥有的代码类似的代码,以类似的方式计算其他两个坐标:

if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > Math.abs(dz)) { // x distance is largest
    float my = (float) dy / (float) dx;      // compute y slope
    float mz = (float) dz / (float) dx;      // compute z slope
    float by = y0 - my*x0;
    float bz = z0 - mz*x0;
    dx = (dx < 0) ? -1 : 1;
    while (x0 != x1) {
        x0 += dx;
        raster.setPixel(pix, x0, Math.round(my*x0 + by), Math.round(mz*x0 + bz));
    }

You will need to compare abs(dx), abs(dy), and abs(dz) and pick the biggest one. In each case use code like to what you have, computing both other coordinates similarly:

if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > Math.abs(dz)) { // x distance is largest
    float my = (float) dy / (float) dx;      // compute y slope
    float mz = (float) dz / (float) dx;      // compute z slope
    float by = y0 - my*x0;
    float bz = z0 - mz*x0;
    dx = (dx < 0) ? -1 : 1;
    while (x0 != x1) {
        x0 += dx;
        raster.setPixel(pix, x0, Math.round(my*x0 + by), Math.round(mz*x0 + bz));
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文