7

ライブラリ関数を使用せずに円を形成する点のセット (/ピクセルを設定) を描画する方法を理解しようとしています。

これで、半径を指定してポイントの (x,y) 座標を取得するのは簡単です。

    for (x=-r; x <r; x=x+0.1) {
         y = sqrt(r*r - x*x);
         draw(x,y, 0, 0);
     }

しかし、ポイントを取得したら、実際にどのように円を描くのかが、私を混乱させるものです. グラフィック ライブラリを使用できますが、グラフィック ライブラリを使用せずにそれを行う方法を知りたいです

    void draw(float x, float y, float center_x, float center_y) {
          //logic to set pixel given x, y and circle's center_x and center_y
          // basically print x and y on the screen say print as a dot .
          // u 'd need some sort of a 2d char array but how do you translate x and y
          // to pixel positions
    }

誰かがリンク/参照を共有したり、これがどのように機能するかを説明したりできますか?

4

3 に答える 3

6
char display[80][26];

void clearDisplay(void) {
   memset(display, ' ', sizeof(display));
}

void printDisplay(void) {
  for (short row=0; row<26; row++) {
    for (short col=0; col<80; col++) {
      printf("%c", display[col][row]);
    }
    printf("\n");
  }
}


void draw(float x, float y, float center_x, float center_y) {
  if (visible(x,y)) {
    display[normalize(x)][normalize(y)] = '.';
  }
}

EDITH: コメントを変更して、質問をより多く取り入れたので、回答を少し拡大します。

次の 2 つの座標セットがあります。

  • 世界座標 (世界地図の経度と緯度、または電磁顕微鏡のフェムトメーターなど) これらは主に x と y です
  • 表示座標: これらは、Nexus 7 や Nexus 10 タブレットなどの表示デバイスを物理的な寸法 (ピクセル、ペル、ドット/インチ) で表したものです。

世界座標を表示座標に変換するメトリックが必要です。物事をより複雑にするには、ウィンドウ (ユーザーに表示したい世界の一部) を表示して、表示できないもの (ヨーロッパを表示したい場合のアフリカなど) を切り取る必要があります。また、表示座標に合わせて世界座標をズームしたい場合があります (表示したいヨーロッパの範囲)。

これらのメトリックとクリッピングは単純な代数変換です

  • ワールド座標をディスプレイ座標にズーム: display-x = world-x * factor (フェムトメートルまたはキロメートルからピクセル)
  • 世界の中心をディスプレイの中心に変換: display-X + 調整

等々。「代数変換」または「幾何学」のウィキペディアのみ

于 2013-02-25T17:06:45.990 に答える
4

技術的には、C には組み込みの入出力機能がないため、難しい質問です。ファイルへの書き込みでもライブラリが必要です。リアルモード DOS などの特定のシステムでは、ビデオ メモリに直接アクセスし、そのメモリに値を書き込むことでピクセルを設定できますが、最新の OS では実際にそれができません。OS を使用せずに、より寛容な CPU モードでプログラムを起動するブートローダーを作成することもできますが、それは膨大な量のワームです。

したがって、stdioライブラリである最低限のものを使用すると、他の回答が示すようにasciiグラフィックを使用してstdoutに書き込むことができます。または、別の画像表示プログラムで表示できるxbmのような単純なグラフィック形式を出力できます。より良い選択は形式かもしれません。

円を描く部分については、古典的なBresenham アルゴリズムを見てください。または、あまりにも多くの情報については、Jim Blinn のA Trip Down the Graphics Pipelineの第 1 章で、 15の異なる円描画アルゴリズムについて説明しています。

于 2013-02-25T19:09:20.667 に答える