逐行逐像素地绘制直角三角形?

时间:2015-02-28 00:51:16

标签: java geometry aspect-ratio

这是我的代码如何逐行逐像素地绘制一个直角三角形(颠倒):

double length = 10; double height = 5;
double aspectRatio = length / height;

double limit = 0.0;
int y = 0;

while (y < height) {
    int x = 0;

    while (x < (length - limit)) {
        drawPixel(x, y); // fill pixel on canvas with black at x, y
        x++;
    }

    limit += aspectRatio; // increase "step" how much to cut in length
    // this part here is wrong, the limit increased is too little

    y++;
}

我的问题是我没有从右上角延伸到左下角的斜边。这是因为我的计算错误,我不明白如何在线搜索正确的术语以找到我需要的计算。

在我的代码中,aspectRatio将变为2.0,并且当逐个像素绘制第一个完整行时,下一行将以2.0像素减少,下一行再次减少2.0像素,等等。这意味着绘制了5行看起来像这样:

[*][*][*][*][*][*][*][*][*][*]
[*][*][*][*][*][*][*][*][ ][ ]
[*][*][*][*][*][*][ ][ ][ ][ ]
[*][*][*][*][ ][ ][ ][ ][ ][ ]
[*][*][ ][ ][ ][ ][ ][ ][ ][ ]

然而,我试图得到这样的东西(注意负空间匹配像素数量并且是对角垂直的):

[*][*][*][*][*][*][*][*][*][*]
[*][*][*][*][*][*][*][*][ ][ ]
[*][*][*][*][*][ ][ ][ ][ ][ ]
[*][*][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]

显然,这主要是一个数学问题,但我不了解修复代码的必要公式。我该怎么办?

1 个答案:

答案 0 :(得分:0)

请记住,像素是正方形并且有一个区域,而x / y坐标只是指向正方形左上角的点。这可能是您混淆/不正确斜边的原因。

尝试这样的事情(未经测试):

while (y < height) {
    int x = 0;

    // add 0.5 to x/y coordinates to check that the center of the
    // pixel is inside your triangle, not the top left corner.
    while ((float)x + 0.5  < ((float)y + 0.5) * aspectRatio) {
        drawPixel(x, y); // fill pixel on canvas with black at x, y
        x++;
    }

    limit += aspectRatio; // increase "step" how much to cut in length
    // this part here is wrong, the limit increased is too little

    y++;
}