【问题标题】:4 triangles in rectangle displayed in PPMPPM 中显示的矩形中的 4 个三角形
【发布时间】:2012-10-01 17:39:17
【问题描述】:

我正在尝试根据用户输入的矩形参数生成 4 个三角形。我的想法是从矩形中心到原点的斜率,在 ppm 文件中位于左上角。这导致一切从本质上逆转。无论如何,我相信我遇到的麻烦来自我的主要功能中的嵌入式循环,但我不确定。我的输出是 3 个三角形,其中左侧的三角形超出底部三角形,就好像它一直在拥抱斜坡。

输出通过管道传送到file.ppm,然后查看。

#include <stdio.h>
#include <math.h>

void make_header (int width, int height);
void make_pixel (unsigned char r, unsigned char g, unsigned char b);
void print_Row (float yValue, int width, int height);
void print_Row2 (float yValue, int width, int height);

void make_header(int width, int height)
{
    fprintf(stdout,"P6\n");
    fprintf(stdout,"%d %d 255\n",width,height);
}

void make_pixel (unsigned char r, unsigned char g, unsigned char b)
{
    fprintf(stdout,"%c%c%c", r,g,b);
}

void print_Row(float yValue, int width, int height)
{
    int x;

    for(x=0;x<yValue;x++)   
    {
        make_pixel(255,0,0); // left triangle
    }


    for(x=x; x<width-yValue; x++)
    {
        make_pixel(0,255,0); //top triangle
    }

    for(x=x;x<width;x++)
    {
        make_pixel(0,0,255);  // right triangle
    }
}   

void print_Row2(float yValue, int width, int height)
{
    int x;

    for(x=0;x<yValue;x++)
    {
        make_pixel(255,0,0);
    }

    for(x=x;x<width-yValue;x++)
    {
        make_pixel(0,0,0); //bottom triangle
    }

    for(x=x;x<width;x++)
    {
        make_pixel(0,0,255);
    }
}   

int main()
{
    float slope, inv_slope, width_midpoint, height_midpoint, yValue ;
    int width,height,x,b;

    fprintf(stderr, "\nEnter width: ");
    scanf("%d", &width);
    fprintf(stderr, "\nEnter height: ");
    scanf("%d", &height);
    make_header(width, height);

    width_midpoint = width / 2;
    height_midpoint = height / 2;
    slope = (height_midpoint -0) / (width_midpoint - 0);
    inv_slope = pow(slope,-1);


    for(b=0;b<height_midpoint;b++)
    {   
        for(x=0;x<width;x++)
        {
            yValue = (inv_slope)*(x) + (b);
            print_Row(yValue, width, height);
        }
    }

    for(b=height_midpoint; b<=height; b++)
    {
        for(x=0;x<width;x++)
        {
            yValue = (-1*(slope))*(x)+(b);
            print_Row2(yValue,width,height);
        }
    }

    return 0;
}

【问题讨论】:

    标签: c ppm


    【解决方案1】:

    你实际上写的数据太多了。用这个替换主循环,一切都应该没问题;)

    for(b=0;b<height_midpoint;b++)
    {   
        for(x=0;x<width;x++)
        {
            if(x < (b / slope)) { 
                make_pixel(255,0,0);
            }
            else if( x > (width - (b / slope))) {
                make_pixel(0,255,0);
            }
            else
                make_pixel(0,0,255);
        }
    }
    
    for(b=height_midpoint; b<=height; b++)
    {
        for(x=0;x<width;x++)
        {
            if( x > (b / slope)) {
                make_pixel(0,255,0);
            }
            else if(x > (width - (b / slope))) { 
                make_pixel(0,0,0);
            }
            else
                make_pixel(255,0,0);
        }
    }
    

    【讨论】:

    • 不用担心。无论如何,通过将问题拆分为矩形的上半部分和下半部分,你走在了正确的轨道上。请注意以正确的顺序执行“if( x > (foo / bar))”,否则最终会遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多