ショッピングモール  Caribbean ( Barbados & Trinidad and Tobago )  Caribbean ( Bermuda )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5078

任意の範囲でのマンデルブロ集合画像
投稿者---バンビ(2005/12/09 11:40:05)


前回こちらの掲示板でアドバイスをいただいて
決まった範囲で画像を作るプログラムは出来たのですが
範囲をCGIから入力して、画像を出力するC言語プログラムで
詰まってしまいました。

何処を修正すれば良いのかアドバイスお願いします


#include <stdio.h>
#include <stdlib.h>
int main()
{
    double cr,ci,zr,zi,zrp,zip,bunkatu1,bunkatu2,ci2,cr2,zi2,zr2,r1,i2;
    cr2=5000;ci2=5000;zr2=5000;zi2=5000;
    char s[500];//={"int1=-1.6,int2=-1.2,int3=0.0,int4=0.0"};
    int i,a,b,x,crf,cif;
    unsigned char bitmap[512][512][3];
    FILE *fd;
    gets(s);
    a=0;b=0;x=0;
    
    //入力された数値を関数に入れる
    while(cr2==5000)
    {
        if(s[x]=='=')
        {
            cr2=atof(s+x+1);
        }
        x++;
    }
    while(zr2==5000)
    {
        if(s[x]=='=')
        {
            zr2=atof(s+x+1);
        }
        x++;
    }
    while(ci2==5000)
    {
        if(s[x]=='=')
        {
            ci2=atof(s+x+1);
        }
        x++;
    }
    while(zi2==5000)
    {
        if(s[x]=='=')
        {
            zi2=atof(s+x+1);
        }
        x++;
    }

    //実数軸と虚数軸の値の差を求めるために正負を合わせる
    if(cr2<0)
    {
        cr2=cr2*-1;
        crf=5;
    }
    if(crf==5)
    {
        if(zr2>0)
        {
            zr2=zr2*-1;
        }
    }
    else
    {
        if(zr<0)
        {
            zr=zr*-1;
        }
    }
    if(ci2<0)
    {
        ci2=ci2*-1;
        cif=5;
    }
    if(cif==5)
    {
        if(zi2>0)
        {
            zi2=zi2*-1;
        }
    }
    else
    {
        if(zi<0)
        {
            zr=zi*-1;
        }
    }

    //実数軸と虚数軸の値の差を求める
    if(cr2<zr2)
    {
        r1=zr2-cr2;
    }
    else
    {
        r1=cr2-zr2;
    }
    if(ci2<zi2)
    {
        i2=zi2-ci2;
    }
    else
    {
        i2=ci2-zi2;
    }
    
    //差を正の数値にする
    if(r1<0)
        r1=r1*-1;
    if(i2<0)
        i2=i2*-1;
    
    //差を512分割する
    bunkatu1=r1/512;
    bunkatu2=i2/512;
    
//  printf("%f %f",cr2,ci2);
    for(cr=cr2;b<=515;cr=cr+bunkatu1)
    {
        for(ci=ci2;a<=515;ci=ci+bunkatu2)
        {
        zrp=0;zr=0;
        zip=0;zi=0;
            for(i=0;i<=254;i++)
            {
                zr=zrp*zrp-zip*zip+cr;
                zi=2*zrp*zip+ci;
                if(zr+zi>2)
                {
                    break;
                }
                zrp=zr;zip=zi;
            }
            if(i==255)
            {
                bitmap[a][b][0]=(unsigned char)0;
                bitmap[a][b][1]=(unsigned char)0;
                bitmap[a][b][2]=(unsigned char)0;
            }
            else if(i>=0&&i<=84)
            {
                bitmap[a][b][0]=(unsigned char)(255-i*1.5);
                bitmap[a][b][1]=(unsigned char)(i*3);
                bitmap[a][b][2]=(unsigned char)0;
            }
            else if(i>=85&&i<=170)
            {
                bitmap[a][b][0]=(unsigned char)(255-i*1.5);
                bitmap[a][b][1]=(unsigned char)255;
                bitmap[a][b][2]=(unsigned char)(i*1.5);
            }
            else if (i<=255)
            {
                bitmap[a][b][0]=(unsigned char)0;
                bitmap[a][b][1]=(unsigned char)(255-(255-i)*3);
                bitmap[a][b][2]=(unsigned char)(i*1.5);
            }
            a++;
        }
        b++;
        a=0;
    }

    //画像ファイル作成
    fd=fopen("line.ppm","w");
    fprintf(fd,"P6\n");
    fprintf(fd,"%d  %d\n",512,512);
    fprintf(fd,"255\n");
    fwrite(bitmap,sizeof(char),512*512*3,fd);
    fclose(fd);
    popen("cjpeg -quality 100 line.ppm>line.jpg","r");

    //HTML部分    
    printf("Content-type: text/html\n\n");
    printf("<html>\n");
    printf("<body>\n");
    printf("<img src=\"line.jpg\">");
    printf("</body>\n");
    printf("</html>\n");

    return 0;
}






この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:任意の範囲でのマンデルブロ集合画像 5079 si 2005/12/09 12:46:07
<子記事> Re:任意の範囲でのマンデルブロ集合画像 5114 かずま 2005/12/17 14:24:43


No.5079

Re:任意の範囲でのマンデルブロ集合画像
投稿者---si(2005/12/09 12:46:07)


>何処を修正すれば良いのかアドバイスお願いします

何が、どうしたの?
CGIは何処に置いたの?
サーバの環境は?
CGIが動作する設定になってるの?
ビルドは何処でやったの? サーバ上?

任意の範囲指定は、どうやって指定したいの?

最後に、CGIにしたいのなら、グラフィックライブラリを使いメモリ上で、jpeg画像へ変換した方が良いんでないかい。


この投稿にコメントする

削除パスワード

No.5080

Re:任意の範囲でのマンデルブロ集合画像
投稿者---si(2005/12/09 18:43:41)


例えば、マンデルブロート集合の画像を表示する cgi が、mandel.cgi とすると
この cgi へ範囲を渡す場合、一般的な方法は、QUERY_STRINGとして渡す方法と、formによるGET、POSTが考えられます。
簡単なのは、cgiがコマンドライン引数として取得できるQUERY_STRINGです。
cgiの呼び出しは、(X0,Y0)-(X1,Y1)の矩形範囲を渡す場合)

http://xx.xx.xx/mandel.cgi?-1.2+0.5+0.5+-0.5

等と、呼び出します。こうすると
通常 argv[0] ="mandel.cgi",argv[1]="-1.2",argv[2]="0.5",argv[3]="0.5",argv[4]="-0.5"
として、cgi がコマンドライン引数で受け取れます。
注意:QUERY_STRINGは urlencode してあたえる必要があります。


この投稿にコメントする

削除パスワード

No.5085

Re:任意の範囲でのマンデルブロ集合画像
投稿者---バンビ(2005/12/11 16:43:43)


言葉足らずですいませんでした
>何が、どうしたの?
今は、範囲を変えても同じ画像が出てくるのでそれを直したいです

>CGIは何処に置いたの?
アパッチを起動してその中のフォルダに入れています

>サーバの環境は?
学校のPCなので不明です

>CGIが動作する設定になってるの?
動作するように設定はしてあります

>ビルドは何処でやったの? サーバ上?
C言語でソースを打った後、Cygwinで.cgi形式にコンパイルしています

>任意の範囲指定は、どうやって指定したいの?
<form method="post" action="http://??.??.?.???/puro3.cgi">
<input type="text" nama="int1">
<中略>
</form>
のような形で4つの数値を得てやっています

>最後に、CGIにしたいのなら、グラフィックライブラリを使いメモリ上で、jpeg画像へ変換した方が良いんでないかい。
今習っているのがCygwinでのコンパイル、画像変換等だけで
特に画像変換の所はとりあえずこのコマンド使っておけと言われているので
よく解りません


この投稿にコメントする

削除パスワード

No.5086

Re:任意の範囲でのマンデルブロ集合画像
投稿者---si(2005/12/11 21:35:09)


>今は、範囲を変えても同じ画像が出てくるのでそれを直したいです
mandel画像を出力するCGIは動作しているのですね。
では、POSTされたデータを正しく受け取れてますか?
単に、POST nameとvalue を表示して、まず、そこを確認しましょう。
また、C で CGI を書く勉強をしているのなら、
application/x-www-form-urlencoded されたデータのデコードも勉強しましょう。


この投稿にコメントする

削除パスワード

No.5087

Re:任意の範囲でのマンデルブロ集合画像
投稿者---バンビ(2005/12/11 21:48:06)


いろいろ調べつつ答えているので
見当違いのことを答えていたらすいません
>mandel画像を出力するCGIは動作しているのですね。
マンデルブロ集合を作るCGIは作動しています
>では、POSTされたデータを正しく受け取れてますか?
POSTとはHTMLからデーターを受け取る事であるならば
受け取ったデータをzi2,zr2,ci2,cr2の変数に格納する所までは
printfを使って確認しています

>単に、POST nameとvalue を表示して、まず、そこを確認しましょう。
すいません、ここは良く解りませんでした

>また、C で CGI を書く勉強をしているのなら、
>application/x-www-form-urlencoded されたデータのデコードも勉強しましょう。
C言語でCGIを書く勉強をしているんではなく
C言語の演習でプログラムを打つ一環として
今回は今までとはちょっと変えてCGIを作ってみようって感じの
課題をやっています
少し調べてみようと思って探してみたのですが
理解できる内容のHPが見当たりませんでした
これは、C言語・CGI・HTML等何関係のHPを調べれば良いのでしょうか?



この投稿にコメントする

削除パスワード

No.5088

Re:任意の範囲でのマンデルブロ集合画像
投稿者---si(2005/12/11 22:19:31)


>printfを使って確認しています
変数に正しい値がセットされているのなら良いでしょう。
(ただ、バンビさんの受け取り方はもう少し改善した方が良いと思われます)

>>単に、POST nameとvalue を表示して、まず、そこを確認しましょう。
>すいません、ここは良く解りませんでした
<input type="text" name="int1" value="-2.5" />
などと設定する変数名とその値(入力値)のこと、

>これは、C言語・CGI・HTML等何関係のHPを調べれば良いのでしょうか?
C と CGI のand検索、CGI インターフェースもある程度知っておかないと、
わけの分からぬエラーに悩むことになります。
ググれば、結構な数のサイトヒットするはずです。

*再確認、最初に聞いたサーバとは、webサーバが動いているマシンのことで、
CGIビルトと実行環境(webサーバ)でのライブラリのバージョンが合っているかを確認したかったのです。


この投稿にコメントする

削除パスワード

No.5089

Re:任意の範囲でのマンデルブロ集合画像
投稿者---バンビ(2005/12/11 22:57:14)


><input type="text" name="int1" value="-2.5" />
>などと設定する変数名とその値(入力値)のこと、
value="??"は入れていないので
少し調べてみます

また、検索した所解説らしき物をしているサイトは多数見つかったのですが
その説明に使われている文や例題すら解らない物があったので
前のような質問になりました
なるべく早く基礎からもう一度調べてみます

サーバーの事なんですが
学校で実習に使っているPCなので
まったく解らないのですが、毎年同じような授業で使っているようなので
設定的には問題無いと思います


この投稿にコメントする

削除パスワード

No.5100

解決しました
投稿者---バンビ(2005/12/14 00:59:20)


2時間ほどかけて
ソースを見直しつつ打ちなおして
問題を解決することが出来ました
ご迷惑おかけしました


この投稿にコメントする

削除パスワード

No.5103

Re:解決しました
投稿者---nop(2005/12/14 09:06:48)


>問題を解決することが出来ました
>ご迷惑おかけしました

「解決した」事よりも、
「どの様に解決したか」が重要です。
この掲示板の利用者や、同じ問題で悩んでいる人の為にも、
「どの様に解決したか」を記述して下さい。


この投稿にコメントする

削除パスワード

No.5113

問題点
投稿者---バンビ(2005/12/16 12:47:20)


全て最初から打ち直したので
何処を修正したのかを完全には把握していないんですが
1、範囲を求めるときに今回は符号をあわせる必要が無かった
2、変数名に一部誤りがあった
が大きい問題でした


この投稿にコメントする

削除パスワード

No.5114

Re:任意の範囲でのマンデルブロ集合画像
投稿者---かずま(2005/12/17 14:24:43)


>   popen("cjpeg -quality 100 line.ppm>line.jpg","r");

popen ではなく、system を使ったほうがよいでしょう。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity