3

私は初心者なので、別のダミーの質問で戻ってきます。Bresenham のアルゴリズムを使用して 2D 配列を埋めるコードを c で書きました。コードは、連続する円で 2D 配列を次のように埋めます。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    double *v;
    int i;
    v = (double*)malloc(101*101*sizeof(double));

    for(i=0;i<101*101;i++)
    {
        v[i]=0.0;
    }


    for(i=0;i<73;i++)
    {
        draw_circle(v, 101,101,51,51,i,(double)i);
    }
    write_arraya(v,"test.txt",101,101);
    free(v);
    
    return 1;
}

ブレゼンハムのアルゴリズムを使用した

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void draw_circle (double *v, int m, int n, int xr, int yr, int radius, double value)
{
    int x, y;
    int l;

    l = (int) radius * cos (M_PI / 4);

    for (x = 0; x <= l; x++)
    {
        y = (int) sqrt ((double) (radius * radius) - (x * x));

        set_value (v, m, n, xr+x-1, yr+y-1, (double)value);
        set_value (v, m, n, xr+x-1, yr-y-1, (double)value);
        set_value (v, m, n, xr-x-1, yr+y-1, (double)value);
        set_value (v, m, n, xr-x-1, yr-y-1, (double)value);

        set_value (v, m, n, xr+y-1, yr+x-1, (double)value);
        set_value (v, m, n, xr+y-1, yr-x-1, (double)value);
        set_value (v, m, n, xr-y-1, yr+x-1, (double)value);
        set_value (v, m, n, xr-y-1, yr-x-1, (double)value);
        printf("x= %d, y=%d\n", x, y);
    }
}

次の方法で値を設定します。

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

void set_value (double *v, int m, int n, int i, int j, double value)
{
    if(i>=0 && i<m && j>=0 && j<n)
    {
        v[i*n+j]=(double)value;
    }
}

それらをテキストファイルに書き込みます

#include <stdio.h>
#include <stdlib.h>
void write_arraya(double *v, char file_name[], int row, int col)
{
    FILE *fp;
    int i, j;

    fp = fopen(file_name, "w");

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            fprintf(fp,"%e ",v[i*col+j]);
        }
        fprintf(fp,"\n");
    }

    fclose(fp);
}

これらは適切に機能しますが、主な問題は配列内の塗りつぶされていない要素に関するものです。値がゼロのままの要素がいくつかあります。これらの値を適切な値で埋めたいと思います。コードの速度は私にとって重要であることに注意してください。他の提案は大歓迎です。アイデアはありますか?テキストファイルから観察した図を添付しました

塗りつぶされた 2D 配列

濃い青色のピクセル (ほとんどが黒) は、配列内の塗りつぶされていない要素です

4

1 に答える 1

1

考えられるすべての半径に対して 2 つ (または必要に応じて 3 つ) の異なる円を描くのは洗練されていませんが、中心点はわずかに異なります (1 つは x,y 用、もう 1 つは x+1, y 用) - この場合、配列は、シフトされた円を処理するのに十分な大きさでなければなりません (追加の列があります)。

はるかに優れた解決策は、円をまったく描画しないことです。ピクセルを反復処理し、中心からの距離を取得し (コードで既に使用されているピタゴラスの定理を使用)、距離に基づいて色を計算します。- これを最適化して、領域の 4 分の 1 のみを実行できます。そして、さらに最適化して 8 分の 1 のみを実行します。

于 2013-12-05T10:13:46.617 に答える